5.1 - 测试方法
测试方法是被 @Test注解的方法。这些方法的返回值会被忽略,除非在testng.xml中将allow-return-values设置为true。
<suite allow-return-values="true">
or
<test allow-return-values="true">
5.2 - 测试组
使用TestNG可以执行一些复杂的测试组。这意味着你不仅可以声明一些测试方法属于某个组,还可以定义一些组属于另一个组。然后TestNG将会被触发执行,并且执行被包含的组排除被排除的组。这个特点让我们能方便的分割你的测试方法,并且可以在不再次编译的前提下连续执行两个不同的测试组。
组是在testng.xml文件中定义的,它可以被放置在test或者suite标签下。被定义在suite标签下的组将会作用于所有的test。需要注意的是组在这些标签下是累加的,如果你在suite中定义了一个组“a”在test中定义了一个组“b”,那么“a”和“b”都会被包含。
比如,一般一个suite中至少会有两类test:
- Check-in tests:这些测试需在你每次提交新代码之前执行。它们通常需要快速执行,用来确保软件基本功能未被破坏。
- Functional tests:这些测试需要覆盖你的软件中的所有功能并且至少要一天执行一次,而在理想情况下应该不间断连续执行。
通常,check-in 测试是functional测试的子集。在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
<test name="Test1">
<groups>
<run>
<include name="functest"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
将会执行类中的所有方法,但是如果用checkintest组触发它,将只会执行方法testMethod1()和testMethod2()。
下面是另一个使用了正则表达式例子。假设部分测试方法不能在Linux上运行,你的测试类如下所示:
@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() {
}
}
你可以使用以下testng.xml文件运行仅在Windows上可行的方法:
<test name="Test1">
<groups>
<run>
<include name="windows.*"/>
</run>
</groups>
<classes>
<class name="example1.Test1"/>
</classes>
</test>
注意:TestNG用的是正则表达式,而不是wildmats。注意这两者的不同(比如“任意字符”是通过“.*“匹配的,而不是”*“)。
方法组:
你也可以单独的包含或排出一些方法(通过方法名):
<test name="Test1">
<classes>
<class name="example1.Test1">
<methods>
<include name=".*enabledTestMethod.*"/>
<exclude name=".*brokenTestMethod.*"/>
</methods>
</class>
</classes>
</test>
这样你就可以方便的在不再次编译的情况下停用一个测试方法,但是我不建议这样使用。因为如果你开始重构你的java代码,上述方法可能会使你的测试框架被破坏。(在标签中被使用的正则表达式可能不误再匹配你的测试方法)。
5.3 组中组
组中也可以包含其他组。这些组被称为“MetaGroups”。比如,你也许想要定义一个包含“checkintest”组和“functest”组的“all”组。“functest”组将包含组“windows”和“linux”但“checkintest”组仅包含组”windows“,这些属性将会这样定义:
<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>
5.4 排除组
TestNG可以包含组,也可以排除它们。
例如,一次临时更改经常可能导致部分方法执行失败,但你又没有时间立即修复问题。然而,你又想要干净的运行functional 测试,所以你需要停用这些失败方法,但仍保留在那里,因为你以后会再次运行。
解决这个问题的一个简单方式是创建一个“broken”组,将这些失败方法包含在该组中。比如在下面这个例子中,我知道testMethod2()这个方法现在是失败的所以我将它停用:
@Test(groups = {"checkintest", "broken"} )
public void testMethod2() {
}
我需要做的就是在run中排除这个组:
<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”属性来停用单个测试方法。
5.5 部分组
你可以在类级别定义组,然后在方法级别添加别的组:
@Test(groups = { "checkin-test" })
public class All {
@Test(groups = { "func-test" )
public void method1() { ... }
public void method2() { ... }
}
在上面的类中,method2()是定义在类级别的 组“checkin-test”的一部分,而method1()同时属于组“checkin-test”和“func-test”。
5.6 参数
测试方法并非必须是非参数的。你可以在每一个测试方法上使用任意数量的参数,TestNG使用 @Parameters注解正确传递参数。
有两种方法来设置参数:用testng.xml文件或者以编程方式。
5.6.1 来自testng.xml的参数