Jetif简介
你是否正在用一些常见的测试框架例如JUnit来开发单元测试程序呢?JUnit是一个很好的单元测试框架, 但是有些事情实现起来还是不太容易。比如说把测试数据和测试代码分离,把测试结果记录到一个文件中,记录 一些日志信息到一个文件中……
Jetif被设计成满足以上的需求,提供大部分开发人员需要的功能,强大并且可伸缩的测试框架。
Jetif是一个用纯Java实现的回归测试框架。它为Java程序单元测试以及功能测试提供了一个简单而且可 伸缩的架构,可以用于个人开发或企业级开发的测试。它容易使用,功能强大,而且拥有一些企业级测试的 重要功能。有几个基本的概念来自于JUnit,比如说断言机制,Test Listener的概念,因此从JUnit转到Jetif是非常容易的。
资料
Jetif 对比 JUnit + JTestCase
JUnit是一个很好的回归测试框架,但是由于它“没有参数,没有返回值”的设计, 很多人把测试数据编写在程序里。如果你想修改测试数据,就不得不重新编译你的代码。 当然现在有很多办法可以在JUnit中分离代码和数据,比如通过ResourceBundle或者Properties文件, 或者使用JTestCase这样的扩展,但是由于JUnit核心不支持,所以这些方法用起来都有些许困难,因此有很多局限性。
请参考JUnit Recipes获取更多关于在JUnit中分离数据和代码 的方法。
Jetif是一个设计为解决这些问题的回归测试框架,它不是一个JUnit扩展。他从核心上解决上述问题,所以你可以通过使用Jetif创建更加简洁的代码。
特性比较
下表中比较了Jetif和JUnit + JTestCase的特性差别。
特性 | Jetif | JUnit + JTestCase |
代码数据分离 | 支持 | 通过JTestCase或其他方式支持 |
参数和返回值 | 支持 | 不支持 |
日志 | 支持 | 通过扩展支持 |
数据类型 | 有限支持,可被用户扩展 | 通过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)来支持各种数据类型。