首先提到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)请不要忘记那里的部分 整个过程都需要重构 方法不同。
答案 0 :(得分:3)
听起来您的服务应该实现一些通用接口。这样你就可以编写一个抽象的基本测试用例也泛型,然后让每个“真正的”服务测试继承它,包括继承那个抽象类中的测试。
子类的构造函数将传递适当的值,例如服务,示例查询等。
编辑:对于基类,只需将抽象基础测试类子类化为现有基类。
对于特化,要么在需要执行完全不同的操作时覆盖测试方法本身,要么使测试方法依赖于抽象类中的抽象方法,以便每个具体的子类都可以填充适当的行为。
答案 1 :(得分:2)
一个好的第一步是创建一个处理公共方法的基类Test类,然后从该基类派生特定的Test类来测试每个服务不同的方法。
您可以使基础Test类成为一个通用类,它将您的服务对象作为通用参数。您可能希望或需要使您的服务类实现一个通用接口,以便您可以以一致,类型安全的方式测试常用方法。
答案 2 :(得分:0)
创建一个抽象类,其中包含所有服务通用的所有测试。
包含必须在每个测试类中以不同方式实现的方法的抽象方法定义。
现在将所有测试类创建为此抽象类的子类,仅实现单个服务所需的内容。
答案 3 :(得分:0)
一种可能的解决方案是将对象类型泛化为通用类型参数。可能有一个通用的基础测试类,并在每个单独的测试子类中使用所需的具体类型进行实例化。我是在类似的情况下做到的,效果很好。
最后,如果您有大量重复的功能要测试,请考虑重构您的测试类(也可能使用泛型)来消除重复。但是,首先编写单元测试以确保在重构期间不会破坏任何内容。