在java中自动化单元测试用例

时间:2011-02-25 16:44:09

标签: java unit-testing testing automation automated-tests

首先提到this个问题。但似乎我的背景不同。

我会尽量简短。 (只是我推出的代码非常大;)

我有50多个服务类。并且需要为所有这些编写单元测试用例。 在所有这些测试类中,一些测试很常见。 (删除,查找等)只是对象类型在服务类中会有所不同。

以下示例将清除图片。


请考虑以下具有CRUD操作的服务类。

public class ObjService {

public Obj addObj(ParamType param, String var)  { ... }

public void deleteObj(ParamType param, String var)  { ... }

public List<Obj> findAllObj(ParamType param, String var) { ... }

public Obj findById(ParamType param, String var, String objIdToFind) { .. }

public List<Obj> getAllObjs(ParamType param, String var, ObjQuery objQuery) throws Exception { ... }

public Obj updateObj(ParamType param,
        String var, Obj objToUpdate) throws Exception { }
}

现在我正在为ObjService类编写一个测试用例。 (测试框架 - testNG

public class ObjServiceTest {

//These methods which will differ across all service classes

@Test
public void testAddObj() throws Exception {
    addObj();
}

@Test
public void testUpdateObj() throws Exception {
    Obj objToUpdate = addObj();
    Obj updatedObj = updateObj(objToUpdate);
}

public Obj addObj() throws Exception {
    //add obj test data and return the obj object       
}

public Obj updateObj(Obj objToUpdate) throws Exception {
    //update obj test data and return the updated obj object    
}

//Following methods will be common to all classes. Except the name 'obj'
//e.g. For obj2 it would change to testDeleteObj2() { Obj2 obj2Todelete.... etc}

@Test
public void testDeleteObj() throws Exception {
    Obj objToDelete = addObj();
    deleteObj(objToDelete);
}

public void deleteObj(Obj objToDelete) throws Exception {
    //delete the obj object
}

@Test
public void testFindById() throws Exception {
    ObjService client = new ObjService();
    List<Obj> objs = dsClient.findAllObj(...);
} 

@Test
public void testFindAllObjs() throws Exception {}

@Test
public void testGetObjs() throws Exception {}
}

现在。为所有类手动编写常用方法肯定是一项耗时的工作。那么可以通过自动化来减少它吗?

(尽我所能以最不可思议的方式提出这个问题)

  

编辑: 1)测试类已经继承了BaseTestClass,其中包含所需的初始设置。这是一个问题。

     

2)请不要忘记那里的部分   整个过程都需要重构   方法不同。

4 个答案:

答案 0 :(得分:3)

听起来您的服务应该实现一些通用接口。这样你就可以编写一个抽象的基本测试用例泛型,然后让每个“真正的”服务测试继承它,包括继承那个抽象类中的测试。

子类的构造函数将传递适当的值,例如服务,示例查询等。

编辑:对于基类,只需将抽象基础测试类子类化为现有基类。

对于特化,要么在需要执行完全不同的操作时覆盖测试方法本身,要么使测试方法依赖于抽象类中的抽象方法,以便每个具体的子类都可以填充适当的行为。

答案 1 :(得分:2)

一个好的第一步是创建一个处理公共方法的基类Test类,然后从该基类派生特定的Test类来测试每个服务不同的方法。

您可以使基础Test类成为一个通用类,它将您的服务对象作为通用参数。您可能希望或需要使您的服务类实现一个通用接口,以便您可以以一致,类型安全的方式测试常用方法。

答案 2 :(得分:0)

创建一个抽象类,其中包含所有服务通用的所有测试。

包含必须在每个测试类中以不同方式实现的方法的抽象方法定义。

现在将所有测试类创建为此抽象类的子类,仅实现单个服务所需的内容。

答案 3 :(得分:0)

一种可能的解决方案是将对象类型泛化为通用类型参数。可能有一个通用的基础测试类,并在每个单独的测试子类中使用所需的具体类型进行实例化。我是在类似的情况下做到的,效果很好。

最后,如果您有大量重复的功能要测试,请考虑重构您的测试类(也可能使用泛型)来消除重复。但是,首先编写单元测试以确保在重构​​期间不会破坏任何内容