本文旨在对比 testngjunit 的使用差异点。

  • JUnit4

    testng

    @BeforeClass - 运行当前单测类的第一个测试方法之前只调用一次,必须为 static void

    @BeforeClass - 无限制,当前类的第一个测试方法调用之前执行

    @AfterClass - 运行当前单测类的所有测试方法之后调用一次,必须为static void

    @AfterClass - 无限制,当前类的所有测试方法调用之后执行

    @Before - 单测类中的每个测试方法执行之前调用

    @BeforeMethod - 单测类中的每个测试方法执行之前调用

    @After - 单测类中的每个测试方法执行之后调用

    @AfterMethod - 单测类中的每个测试方法执行之后调用

    @Test - 用于注释测试方法

    @Test - 用于注释测试方法

    @Ignore - 忽略的测试方法

    @Test(enbale=false)

    @Test(expected= NullpointerException.class) 

    @Test(expectedExceptions= ArithmeticException.class)

    @Test(timeout = 1000)

    @Test(timeout = 1000)

    --

    @BeforeSuit/@AfterSuit - 针对所有测试,在所有测试(开始前/完成后)执行
    @BeforeSuit/@AfterSuit
    针对单个测试,在单个测试(开始前/完成后)执行
    @BeforeGroups/@AfterGroups
    针对单个组,在单个组(开始前/完成后)执行

    断言语句:

    assertEquals(1,testClass.method2(1));

    断言语句:

    Assert.assertEquals(1, testClass.method2(1));

  • JUnit4 套件测试样例


    说明:

    1. RunWith 注解指定套件运行器,Suit.class 配置表示使用套件运行器(也可以指定为参数化运行器 Parameterized.class,需要声明参数变量,构造器和数据供给方法)。
    2. SuiteClasses 注解中声明需要放在套件里运行的测试类,用逗号分割。

    testng 套件测试使用配置文件实现


    说明:

    1. testNG 的套件由 <suite> 标签声明。
    2. <test> 标签的内层 <class> 标签用于指定需要放在该套件里执行的测试类。

  • Junit4 参数化测试样例代码


    说明:

    1. @RunWith(Parameterized.class)
    2. 声明属性表示测试数据及期望值,声明带参构造函数。
    3. 声明参数提供方法,必须:static、返回 Collection 、用 Parameters 注解标注。
    4. 测试方法中直接使用属性做断言。

    testNG 参数化测试样例代码

    配置型参数化测试


    TestNG.xml 中的配置:


    说明:

    1. 测试方法使用的参数需要用 @Parameters 注解声明,内容为参数名列表,参数值配置在 xml 文件中,与测试类中引用的参数名一致
    2. 参数化测试可以使用一个默认值的注解,当配置文件中找不到需要的参数值时,就使用默认值,代码示例为:
      public void testMethod2(@Optional("default")String param1,String param2)
    3. 参数是有范围的。在 testng.xml 中的 <suit><test> 标签下都可以定义参数,若参数同名,<test> 下参数优先,这种规则适用于定义一个适用于所有测试但单个测试需要使用特殊值的场景。

    非配置型参数化测试


    非配置型参数化测试与 junit4 类似,但明显没有那么多约束。

  • 代码样例:


    配置文件样例:


    说明:

    1. groups@Test 注解的一个属性,值为该测试方法所属 group 的名称列表,在 xml 配置文件中使用 <groups> 标签来指定当前运行的测试方法所属的 group<include> 为包含标签,<exclude> 为排除标签,都支持正则表达式,按照上面的示例,testDataProvider2testDataAndMethod 方法被执行,testMethod1 方法被忽略。

    2. 当执行 testDataAndMethod 方法时,dependsOnGroups 属性设置当调用该方法之前,必须先执行名为 method1group 内所属方法,当method1 组内的方法都执行成功后才去调用 testDataAndMethod,当前置方法有 fail 的情况,testDataAndMethod 方法将会被框架跳过不执行(不是失败)。如果想强制框架无论前置方法成功与否,都必须执行 testDataAndMethod 方法,可以附加一个属性 alwaysRun=true。注意:alwaysRun 属性在测试方法有执行依赖时才会生效,否则该属性值的效果被忽略。alwaysRun 属性优先级设置大于配置文件中的组的 <exclude> 标签,即当配置文件中增加 <exclude name="method1"/> 配置,alwaysRun=true 配置的 testDataAndMethod 方法(必须有执行依赖)必然会被调用。

    3. 声明依赖配置的时候注意避免循环依赖,即某测试方法属于某个组,又依赖于某个组,如果必须有这样的场景,请将被依赖 group 中的方法逐一列出,并使用 dependsOnMethods 属性。

    4. 如果配置文件中做了 grouprun 配置,那么需要注意属于该组下的测试方法配置的依赖组或者依赖方法所在的组也需要在 run 配置中列出,否则框架会报错。
    配置文件示例:


    测试方法示例:


    其中依赖方法 testMyMethod1MyClassTestNGTest2.java 的方法,若 testMyMethod1 没有指定所属组,则运行测试会报错,需要给 testMyMethod1 指定组,可以和测试方法所属组一致,若 testMyMethod1 有自己的组,那么需要在配置文件的 <run> 标签中配置上 testMyMethod1 所在的组,这样运行 testDataAndMethod 测试方法时才不会报错。

    5. Test 注解还有很多属性,主要列举如下:

    DataProvider —用法参照第三部分

    DataProviderClass —用于指定提供参数的类,若不指定则在当前类或父类中查找,被指定类的参数提供方法必须是static

    dependsOnMethods —设置测试方法的依赖方法,单独设置时表示需要等列表中的方法都执行成功后才执行当前测试方法,否则该测试方法被跳过。接受正则表达式

    dependsOnGroups —设置测试方法的依赖组,单独设置时表示需要等列表组下属的方法都执行成功后才执行当前测试方法,否则该测试方法被跳过。接受正则表达式

    ExpectedExceptions —期望抛出异常列表

    InvocationCount —当前方法被调用次数

    TimeOut —执行时间限制

    ThreadPoolSize —当前方法的线程池大小,配合 InvocationCount 属性可以很方便地实现多线程测试,这是 junit 不具备的

    更多细节属性,可以参考

    http://testng.org/doc/documentation-main.html 

    http://testng.org/javadocs/index.html 

    1. 分组测试,相对灵活,与 junit 的针对单元测试来讲,testng 也可以应用在集成测试的各类场景。
    2. 通常以 @Test 注解标志的测试方法是不应有返回值的,有返回值的测试方*被框架忽略,除非在配置文件*别指出在 suittest 标签中指定 allow-return-values =true。我们实际使用中只要注意避免产出有返回值的测试方法就可以了。
    3. 声明所属组时,测试方法默认会继承测试类所属组(如果测试类声明所属组的话),若测试方法也声明了所属组,那么它既属于自己声明的组,也属于所在测试类声明的组,而不是覆盖形式。
    4. 类层级的 @Test 注解可以统一标注类中的所有方法均为测试方法,即便内部方法没有用 @Test 注解标注,当然了,如果需要给某个测试方法增加属性,还是需要在方法层级使用 @Test 注解的。
    5. 重运行失败测试—框架在运行测试完成后,如果有失败测试,会产出一个失败测试文档,可用于快速定位失败的测试方法。
    6. TestNG 可以运行 junit 测试类,只需要在配置文件中做如下配置 <test name=”myTest” junit=”true”>
    7. eclipse 中使用 testNG 插件,可以快速运行testNG单测类,插件会在临时文件夹下创建一个临时的xml配置文件,以供运行单个测试类使用,这个配置文件是最精简的配置,不会有分组相关的配置,如果想进行分组测试,则需要自己手动创建一个 xml 配置文件,自定义好分组策略后在配置文件上右击-> RunAs -> testNG suit 即可。
    8. testNG 开放了一个接口 IAnnotationTransformer,只要实现该接口的 transform 方法,然后将实现类配置成测试时的 listener,就可以在测试运行过程中修改原有的关于 @Test 注解的属性配置。修改配置注解(如 @factory@dataProvider)属性,则实现 IAnnotationTransformer2 接口,详细的 listener 的配置及使用可以参考前面的链接,上面有详细的示例及实现方式。
    9. testNG 预留了一些监听的接口,可以自主实现这些接口,并将实现类配置成 listener,达到在测试运行过程中进行自定义的监控处理。Listener 的级别可以是 suit 级别(配置文件中配置),方法级别(注解方式实现)。