testng 与 junit 4对比

1.  testng 

TestNG,即Testing, Next Generation,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做集成测试。


TestNG是一个开源自动化测试框架;TestNG表示下一代。 TestNG是类似于JUnit(特别是JUnit 4),
但它不是一个JUnit扩展。它的灵感来源于JUnit。它的目的是优于JUnit的,尤其是当测试集成的类。它在很大程度上借鉴了Java注解(JDK5.0引入的)来定义的测试。

与junit 4表面上的相似

(1)JUnit 4 和 TestNG 有一些共同的重要特性。这两个框架都让测试工作简单得令人吃惊(和愉快),给测试工作带来了便利。二者也都拥有活跃的社区,为主动开发提供支持,同时生成丰富的文档。

(2)两个框架的不同在于核心设计。JUnit 一直 是一个单元测试框架,也就是说,其构建目的是促进单个对象的测试,它确实能够极其有效地完成此类任务。而 TestNG 则是用来解决更高 级别的测试问题,因此,它具有 JUnit 中所没有的一些特性。

2.  junit 4缺点


JUnit缺点:

(1)参数化测试是类级别的

(2)不能依赖测试

(3)配置控制欠佳(安装/拆卸)

(4)侵入性(强制扩展类,并以某种方式命名方法)

(5)静态编程模型(不必要的重新编译)

(6)不同的适合管理复杂项目中的测试可以是非常棘手

3.  TestNG的特点

(1)注解

(2)TestNG使用Java和面向对象的功能

(3)支持综合类测试(例如,默认情况下,没有必要创建一个新的测试每个测试方法的类的实例)

(4)独立的编译时间测试代码运行时配置/数据信息

(5)灵活的运行时配置

(6)主要介绍“测试组”。当编译测试,只要问TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等

(7)支持依赖测试方法,并行测试,负载测试,局部故障

(8)灵活的插件API

(9)支持多线程测试

4.  testng 与 junit 4对比

特性 JUnit 4 TestNG
测试注解 @Test @Test
测试套件在执行之前需要执行的 @BeforeSuite
测试套件在执行之后需要执行的 @AfterSuite
在测试之前需要执行的 @BeforeTest
在测试之后需要执行的 @AfterTest
在一个测试方法所属于的任意一个组的第一个方法被调用之前执行 @BeforeGroups
在一个测试方法所属于的任意一个组的最后一个方法被调用之后执行 @AfterGroups
在当前类的第一个测试方法调用之前执行 @BeforeClass
测试方法则必须是静态方法
@BeforeClass
在当前类的最后一个测试方法调用之后执行 @AfterClass
测试方法则必须是静态方法
@AfterClass
每个测试方法之前需要执行 @Before @BeforeMethod 非常好理解
每个测试方法之后需要执行 @After @AfterMethod     非常好理解
忽略 @ignore @Test(enabled=false)
预期异常 @Test(expected = ArithmeticException.class) @Test(expectedExceptions = ArithmeticException.class)
非常好理解
超时 @Test(timeout = 1000) @Test(timeout = 1000)


特性 JUnit 4 TestNG
套件测试 @RunWith@Suite注解被用于执行套件测试。
需要JunitTest1 和 JunitTest2一起执行

@RunWith(Suite.class)
@Suite.SuiteClasses({
    JunitTest1.class,
    JunitTest2.class
})
public class JunitTest5 {
}
执行套件测试是使用XML文件配置的方式来做。
TestNGTest1TestNGTest2一起执行

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
  <test name="testing">
    <classes>
       <class name="com.fsecure.demo.testng.TestNGTest1" />
       <class name="com.fsecure.demo.testng.TestNGTest2" />
    </classes>
  </test>
</suite>
组-

分组--集成测试更强大
</pre><pre name="code" class="java">这是一个有4个方法,3个组(method1, method2 和 method4)的类

@Test(groups="method1")
public void testingMethod1() {  
  System.out.println("Method - testingMethod1()");
}  

@Test(groups="method2")
public void testingMethod2() {  
    System.out.println("Method - testingMethod2()");
}  

@Test(groups="method1")
public void testingMethod1_1() {  
    System.out.println("Method - testingMethod1_1()");
}  

@Test(groups="method4")
public void testingMethod4() {  
    System.out.println("Method - testingMethod4()");
}
下面XML文件定义了一个只是执行methed1的组的单元测试
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
  <test name="testing">
      <groups>
      <run>
        <include name="method1"/>
      </run>
    </groups>
    <classes>
       <class name="com.fsecure.demo.testng.TestNGTest5_2_0" />
    </classes>
  </test>
</suite>
参数化测试 (1)@RunWith 和 @Parameter 注解用于为单元测试提供参数值,@Parameters必须返回 List[],参数将会被作为参数传给类的构造函数。
(2)
junit的参数化是在类级别的,即,每循环一次都将要执行整个类,包括@before和@after;
TestNG的参数化是在测试级别的

(1)使用XML文件或者@DataProvider注解来给测试提供参数。

方法一 : XML文件配置参数化测试

只是在方法上声明@Parameters注解,参数的数据将由 

TestNG 的 XML 配置文件提供。

这样做之后,可以使用不同的数据集甚至是不同的结果集来重用

一个测试用例。

另外,甚至是最终用户,QA 或者 QE 可以提供使用 XML 文件来提供

自己的数据来做测试。

方法二:@DataProvider 注解做参数化测试

相比方法一, 提供比String更复杂的类型,@DataProvider
可以使用 Vector, String 或者 Integer 类型的值或 对象 作为参数
依赖测试


JUnit 框架主要聚焦于测试的隔离,暂时还不支持这个特性 如果依赖的方法出现错误,所有的子测试都会被忽略,不会被标记为失败。

它使用
dependOnMethods来实现了依赖测试的功能,如下:
@Test
public void method1() {
   System.out.println("This is method 1");
}

@Test(dependsOnMethods={"method1"})
public void method2() {
    System.out.println("This is method 2");
}
如果method1()成功执行,那么method2()也将被执行,
否则
method2()将会被忽略。
注:此外,如果依赖方法失败,它将被跳过,而不是标记为
失败。
TestNG 采取了只重新运行失败测试的机制,
这使它的依赖性测试设置更为完善。
失败和重运行
JUnit 4 中,如果测试套件包括 1000 项测试,其 中 3 项失败,很可能就会迫使您重新运行整个测试套件(修改错误以后)

一旦 TestNG 中出现失败,它就会创建一个 XML 配置文件,
对失败的测试加 以说明。
如果利用这个文件执行 TestNG 运行程序,
TestNG 就只 运行失败的测 试。
     

5.  结论

设计 JUnit 的目的是为了分析代码单元,而 TestNG 的预期用途则针对高级测试。对于大型测试套件,我们不希望在某一项测试失败时就得重新运行数千项测试,TestNG 的灵活性在这里尤为有用。这两个框架都有自己的优势.。
建议使用 TestNG 作为 Java 项目的主要单元测试框架,因为 TestNG 在参数化测试、依赖测试以及套件测试(组)方面功能更加强大。TestNG 意味着高级的测试和复杂的集成测试。它更加的灵活,特别是对大的套件测试。另外,TestNG 也涵盖了 JUnit4 的全部功能。

参考

http://www.ituring.com.cn/Article/47829
http://www.ibm.com/developerworks/cn/java/j-cq08296/
http://www.bianceng.cn/Programming/Java/201012/21353_2.htm


你可能感兴趣的:(testng 与 junit 4对比)