参考链接: JUnit 4 Vs TestNG比较 追求代码质量-JUnit4与TestNG的对比
相同点
都是java测试工具,都是基于注释的且大部分注释相似,它们都可以进行单元测试。
JUnit和TestNG的不同点
注释对比
在JUnit 中,我们必须声明“@BeforeClass”和“@AfterClass”方法作为静态方法,TestNG没有这个约束。
TestNG可以通过 javadoc 风格的注释来使用它,如下所示是一个参数化测试,在xml中可定义参数数据。
/**
* @testng.test
* @testng.parameters value="class_name, size"
*/
public void assertValues(String classname, int size){
//TODO......
}
套件测试
JUnit
运用“@RunWith”和“@Suite”注释运行套件测试,测试套件运行失败时,JUnit 4会标记为全部失败,之后重新运行整个测试套件。
TestNG
用XML文件运行套件测试,TestNG不仅可以做捆绑类测试,也可以捆绑方法进行测试。
TestNG测试套件运行失败时,会创建一个XML文件说明失败的测试,利用这个文件执行程序,就不会重复运行已经成功的测试。
参数化测试
JUnit
运用“@RunWith”和“@Parameter”注释提供单元测试的参数值,但此方法具有较多限制,比如必须将参数传递给构造函数才能初始化类成员作为测试的参数值。参数类的返回类型为List[],数据已被限制为String或用于测试的原始类型值。并且在 JUnit 中,如果您想改变某个受测方法的参数组,就只能给每个 不同的参数组编写一个测试用例。
TestNG
XML文件或“@DataProvider”用于提供不同参数进行测试。当参数类型较复杂时,可使用高级参数化测试,利用TestNG的@DataProvider参数可以处理复杂的参数类型。TestNG相比于JUnit的参数化测试显得更加友好和灵活。
依赖性测试
JUnit
不支持依赖性测试。
TestNG
与 JUnit 不同,TestNG 利用 @Test 注释的 dependsOnMethods属性来应对测试的依赖性问题。重要的是,TestNG 如果依赖方法失败,它将被跳过,而不是标记为失败,即跳过而不是标记失败。
失败和重运行
JUnit
在 JUnit 4 中,如果测试套件包括 1000 项测试,其中 3 项失败,很可能就会迫使您重新运行整个测试套件(修改错误以后)。
TestNG
一旦 TestNG 中出现失败,它就会创建一个 XML 配置文件,对失败的测试加以说明。如果利用这个文件执行 TestNG 运行程序,TestNG 就只 运行失败的测试。当测试套件规模较大时,TestNG在失败和重运行上面的好处就会体现出来。
总结
JUnit只能用于单元测试,TestNG可以进行单元测试,功能测试和集成测试。设计 JUnit 的目的是为了分析代码单元,而 TestNG 的预期用途则针对高级测试。
TestNG的运行方式更加灵活,注释更加丰富。对于大型测试套件,我们不希望在某一项测试失败时就得重新运行数千项测试,TestNG 的灵活性在这里尤为有用。
TestNG需要一个额外的xml配置文件。
TestNG涵盖了整个核心的JUnit4功能。