2011-02-25 88 views
2

推荐this问题首先。但似乎我的情况是不同的。java中的自动化单元测试用例

我会尽量简短。 (只是我把出代码是相当大的;)

我有一些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)请不要忘记部分,其中 重构需要跨 方法不同。

回答

3

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

的子类的构造函数将在适当的值传递的东西像服务,一个简单的查询等

编辑:基类,只是使抽象的基础测试类的子类的现有基地类。

对于专业化,当它需要做一个完全不同的事情时重写测试方法本身,或者使测试方法依赖于抽象类中的抽象方法,以便每个具体的子类可以填充适当的行为。

+0

Jon.Please找到编辑的问题。忘了提及基础测试课。 – 2011-02-25 17:05:17

+0

@Ravi:编辑我的答案。 – 2011-02-25 17:10:56

0

创建包含通用于所有服务的所有测试的抽象类。

包括用于必须在各测试类不同的方式实现所述方法的抽象方法定义。

现在创建所有的测试类,这个抽象类的子类,实现真实必要的东西为个人服务。

0

一种可能的解决方案是将测试用例与对象类型泛型化为泛型类型参数。可能有一个通用的基础测试类,并在每个单独的测试子类中使用所需的具体类型进行实例化。我做了一个类似的案例,结果很好。最后,如果你有很多重复的测试功能,考虑重构你的测试类(可能还使用泛型)来消除重复。但是,先写单元测试,以确保在重构​​过程中不会破坏任何东西

2

好的第一步是创建一个基类Test类,它处理常用方法,然后从该基类派生特定的Test类以测试每种服务所不同的方法。

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