【问题标题】:Automating unit test cases in java在java中自动化单元测试用例
【发布时间】:2011-07-04 10:44:20
【问题描述】:

首先推荐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) 请不要忘记部分,其中 整个过程都需要重构 方法不同。

【问题讨论】:

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


    【解决方案1】:

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

    子类的构造函数会为服务、示例查询等传递适当的值。

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

    为了特化,要么在需要做完全不同的事情时重写测试方法本身,要么让测试方法依赖于抽象类中的抽象方法,这样每个具体的子类都可以填充适当的行为。

    【讨论】:

    • Jon.Please 找到已编辑的问题。忘了提到基础测试类。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-20
          • 2013-02-03
          • 2010-12-13
          • 2016-08-23
          • 1970-01-01
          • 2018-05-12
          • 2015-07-13
          相关资源
          最近更新 更多