说明:本文部分内容来源于网络,侵删
1. 测试方法method
测试方法就是被@Test修饰的方法,测试方法的返回值默认是被忽略的,除非在testng.xml做以下配置:
<suite allow-return-values="true">
or
<test allow-return-values="true">
2. 测试组group简介
testng允许用户自定义复杂的测试分组。你不仅可以定义一个组里包含哪些测试方法,也可以制定一个组里包含其他组。
然后TestNG可以被调用,并被要求包含某些分组和排除其他的分组。
这给了用户划分测试分组的最大灵活度,并且如果想连续运行两个不同的测试组不需要重新编译。
Group在testng.xml文件的和中使用,并且在中制定的组也会在中继承。groups的配置是累计的,如果在中指定要执行group-a,在中指定要执行group-b,那么实际执行时,group-a和group-b都会被执行。
举个例子:
我们测试中经常会用到以下两种测试场景:
- Check-in tests. 在开发提交代码之前,需要先进行准入测试。这种测试需要的是快速,并且只进行基础功能正常的测试。
- Functional tests. 功能测试需要覆盖测试软件的大部分或所有功能,并且至少一天执行一次。
通常,Check-in tests是Functional tests的子集,TestNG允许您通过测试组以非常直观的方式指定这一点。例如,您可以说您的整个测试类属于“functest”组,另外还有几个方法属于“checkintest”组来构造测试:
public class Test1 {
@Test(groups = { "functest", "checkintest" })
public void testMethod1() {
}
@Test(groups = {"functest", "checkintest"} )
public void testMethod2() {
}
@Test(groups = { "functest" })
public void testMethod3() {
}
}
用下面这种testng.xml的配置,会执行Test1类中所有测试方法。
<test name="Test1">
<groups>
<run>
<include name="functest"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
而用下面这种testng.xml的配置,会执行Test1类中的testMethod1()和testMethod2(),testMethod3()不会被执行。
<test name="Test1">
<groups>
<run>
<include name="checkintest"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
下面是另外一个例子,使用正则表达式配置。
@Test
public class Test1 {
@Test(groups = { "windows.checkintest" })
public void testWindowsOnly() {
}
@Test(groups = {"linux.checkintest"} )
public void testLinuxOnly() {
}
@Test(groups = { "windows.functest" )
public void testWindowsToo() {
}
}
假设您的某些测试方法不应在Linux上运行,您的测试将如下所示:Note: TestNG uses regular expressions, and not wildmats. Be aware of the difference (for example, “anything” is matched by “." – dot star – and not "”).
<test name="Test1">
<groups>
<run>
<include name="windows.*"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
注意⚠️:上述“windows.*”是正则表达式,而不是通配符,注意两者的区别。(比如,点星表示所有,而不是星)。
正则表达式也可以用在下面的场景:
<test name="Test1">
<classes>
<class name="example1.Test1">
<methods>
<include name=".*enabledTestMethod.*"/>
<exclude name=".*brokenTestMethod.*"/>
</methods>
</class>
</classes>
</test>
这对于停用单个方法而不必重新编译任何内容非常方便,但不建议过多地使用此技术,因为如果您开始重构Java代码,它会使您的测试框架很可能崩溃(标记中使用的正则表达式可能不再与您的方法匹配)。
3. 测试组-重组
测试组也可以包含其他的测试组, 比如,你想定义一个组“all”,这个组包含组"checkintest" 和 “functest”。而"functest"组本身包含"windows"组 and “linux” 组。 下面是需要配置的内容:
<test name="Regression1">
<groups>
<define name="functest">
<include name="windows"/>
<include name="linux"/>
</define>
<define name="all">
<include name="functest"/>
<include name="checkintest"/>
</define>
<run>
<include name="all"/>
</run>
</groups>
<classes>
<class name="test.sample.Test1"/>
</classes>
</test>
4. 测试组-排除
Testng允许你包含某些组,也允许排除某些组。
例如,通常会有一些测试方法/测试类由于最近的变化而暂时失败,而你还没有时间修复。但是,却希望功能测试的运行正常,因此需要停用这些有问题的测试方法或类。
一个简单的解决这个问题的办法,就是创建一个组,比如叫做“broken”,然后把这些有问题的测试方法放进去。
例如,在上面的示例中,我知道testMethod2()现在已损坏,所以我想禁用它。在testMethod2()的注解里加上group分组
@Test(groups = {"checkintest", "broken"} )
public void testMethod2() {
}
然后在配置文件里把这个组排除掉。
<test name="Simple example">
<groups>
<run>
<include name="checkintest"/>
<exclude name="broken"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
提示:也可以使用@Test/@Before/@After的属性enabled=false来禁用某个测试方法。
5. 部分组
你可以给类分组,也可以给方法分组,当给类分组时,类里面所有的方法,都会分到这个组里。
@Test(groups = { "checkin-test" })
public class All {
@Test(groups = { "func-test" )
public void method1() { ... }
public void method2() { ... }
}
method1()即是"checkin-test" 组成员,也是"func-test"组的。