Vicky Wang
JUnit是一个很好的回归测试框架,但是由于它“没有参数,没有返回值”的设计,
很多人把测试数据编写在程序里。如果你想修改测试数据,就不得不重新编译你的代码。
当然现在有很多办法可以在JUnit中分离代码和数据,比如通过ResourceBundle或者Properties文件,
或者使用JTestCase这样的扩展,但是由于JUnit核心不支持,所以这些方法用起来都有些许困难,因此有很多局限性。
请参考JUnit Recipes获取更多关于在JUnit中分离数据和代码
的方法。
Jetif是一个设计为解决这些问题的回归测试框架,它不是一个JUnit扩展。他从核心上解决上述问题,所以你可以通过使用Jetif创建更加简洁的代码。
下表中比较了Jetif和JUnit + JTestCase的特性差别。
| 特性 | Jetif | JUnit + JTestCase |
| 代码数据分离 | 支持 | 通过JTestCase或其他方式支持 |
| 参数和返回值 | 通过Handler支持 | 不支持 |
| 日志 | 支持 | 通过扩展支持 |
| 数据类型 | 内置有限支持,可被用户扩展 | 通过JTestCase有限支持 |
| 客户/服务器测试 | 支持 | 通过扩展支持 |
通过Jetif,你可以创建更加简洁的测试代码,因为Jetif支持测试方法中的参数和返回类型。例如,使用Jetif可以写出一个下面这个样子的测试方法:
public boolean testSomething(float param1, String[] param2, Integer param3){
// Test something with the param1, param2, param3
return true;
}
但是用JUnit + JTestCase,一个测试方法只能写成下面这个样子:
public void testSomething() {
// get the test cases from XML
Vector testCases = _jtestcase.getNameOfTestCases("testSomething");
// for each test case
for (int i=0; i<testCases.size(); i++) {
// retrieve name of test case
String testCase = (String)testCases.elementAt(i);
// get hashed params for this test case
Hashtable params = _jtestcase.getTestCaseParams("testCalculate", testCase);
int var1 = ((Integer)params.get("var1")).intValue();
String var2 = (String)params.get("var2");
// Now comes to what we need to test.
}
}
通过Jetif你可以在spec文件中定义参数和返回值,然后在测试程序中直接把它们用作参数并且返回一个你想要的结果。这种方式更加简单清晰,不是吗?
Jetif不仅仅会让你的程序更简单,而且会让你的测试数据用更清晰的结构组织。下面是配合上述测试方法的Method Spec例子:
<method name="testSomething">
<param>42.0</param>
<param handler="array">value1, value2, value3</param>
<param>32</param>
<expected>true</expected>
</method>
但是如果用JUnit + JTestCase,你需要给测试方法定一个更加复杂的数据结构,例如:
<method name="method name" test-case="name your test case here">
<params>
<param type="java.util.Hashtable" key-type="java.lang.String">
<param name="Test1" type="java.util.Hashtable" key-type="java.lang.String" value-type="java.lang.String">
<param name="k1">value1</param>
<param name="k2">value2</param>
<param name="k3">value3</param>
</param>
<param name="k1" type="java.lang.String">value1</param>
<param name="k2" type="java.lang.Integer">42</param>
</param>
</params>
</method>
Jetif和JTestCase都缺省支持有限数目的数据类型,但是Jetif提供了Object Handler机制让用户可以创建他们自己的处理器(handler)来支持各种数据类型。你可以自己创建一个处理器而不是等待我的支持。
我想这个时候,你自己应该有结论了吧?
Translations: English
版权所有© 2004 Vicky Wang, 保留所有权利