WEB开发网
开发学院软件开发Java 追求代码质量: JUnit 4 与 TestNG 的对比 阅读

追求代码质量: JUnit 4 与 TestNG 的对比

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 清单 6 中的 TestNG 测试套件文件只对该测试定义了一个参数组(class_name 为 java.util.Vector,且 size 等于 2),追求代码质量: JUnit 4 与 TestNG 的对比(8),但却具有无限的可能,这样做的一个额外的好处是:将测试数据移动到 XML 文件

清单 6 中的 TestNG 测试套件文件只对该测试定义了一个参数组(class_name 为 java.util.Vector,且 size 等于 2),但却具有无限的可能。这样做的一个额外的好处是:将测试数据移动到 XML 文件的无代码工件就意味着非程序员也可以指定数据。

高级参数化测试

尽管从一个 XML 文件中抽取数据会很方便,但偶尔会有些测试需要有复杂类型,这些类型无法用 String 或原语值来表示。TestNG 可以通过它的 @DataProvider 注释处理这样的情况。@DataProvider 注释可以方便地把复杂参数类型映射到某个测试方法。例如,清单 7 中的 verifyHierarchy 测试中,我采用了重载的 buildHierarchy 方法,它可接收一个 Class 类型的数据, 它断言(asserting)Hierarchy 的 getHierarchyClassNames() 方法应该返回一个适当的字符串数组:


清单 7. TestNG 中的 DataProvider 用法
package test.com.acme.da.ng; 
 
import java.util.Vector; 
 
import static org.testng.Assert.assertEquals; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 
 
import com.acme.da.hierarchy.Hierarchy; 
import com.acme.da.hierarchy.HierarchyBuilder; 
 
public class HierarchyTest { 
 
 @DataProvider(name = "class-hierarchies") 
 public Object[][] dataValues(){ 
 return new Object[][]{ 
  {Vector.class, new String[] {"java.util.AbstractList", 
   "java.util.AbstractCollection"}}, 
  {String.class, new String[] {}} 
 }; 
 } 
 
 @Test(dataProvider = "class-hierarchies") 
 public void verifyHierarchy(Class clzz, String[] names) 
 throws Exception{ 
  Hierarchy hier = HierarchyBuilder.buildHierarchy(clzz); 
  assertEquals(hier.getHierarchyClassNames(), names, 
  "values were not equal");  
 } 
} 

dataValues() 方法通过一个多维数组提供与 verifyHierarchy 测试方法的参数值匹配的数据值。TestNG 遍历这些数据值,并根据数据值调用了两次 verifyHierarchy。在第一次调用时,Class 参数被设置为 Vector.class ,而 String 数组参数容纳 “java.util.AbstractList ” 和 “ java.util.AbstractCollection ” 这两个 String 类型的数据。这样挺方便吧?

为什么只选择其一?

我已经探讨了对我而言,TestNG 的一些独有优势,但是它还有其他几个特性是 JUnit 所不具备的。例如 TestNG 中使用了测试分组,它可以根据诸如运行时间这样的特征来对测试分类。也可在 Java 1.4 中通过 javadoc 风格的注释来使用它,如 清单 5 所示。

正如我在本文开头所说,JUnit 4 和 TestNG 在表面上是相似的。然而,设计 JUnit 的目的是为了分析代码单元,而 TestNG 的预期用途则针对高级测试。对于大型测试套件,我们不希望在某一项测试失败时就得重新运行数千项测试,TestNG 的灵活性在这里尤为有用。这两个框架都有自己的优势,您可以随意同时使用它们。

上一页  3 4 5 6 7 8 

Tags:追求 代码 质量

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接