5.1 - 测试方法
测试方法用@Test注释。除非在testng.xml中将allow-return-values设置为true,否则将忽略使用@Test注释恰好返回值的方法:
1 <suite allow-return-values="true"> 2 3 or 4 5 <test allow-return-values="true">
5.2 - 测试组
TestNG允许您执行复杂的测试方法分组。您不仅可以声明方法属于组,还可以指定包含其他组的组。然后可以调用TestNG并要求包括一组特定的组(或正则表达式),同时排除另一组。这为您分区测试提供了最大的灵活性,如果您想要连续运行两组不同的测试,则不需要重新编译任何内容。
组在testng.xml文件中指定,可以在<test>或<suite>标记下找到。<suite>标记中指定的组适用于下面的所有<test>标记。请注意,组在这些标记中是累积的:如果在<suite>中指定组“a”,在<test>中指定“b” ,则将包括“a”和“b”。
例如,至少有两类测试是很常见的
- 办理登机手续的测试。应在提交新代码之前运行这些测试。它们通常应该很快并确保没有基本功能被破坏。
- 功能测试。这些测试应涵盖您软件的所有功能,并且每天至少运行一次,尽管理想情况下您可能希望连续运行它们。
通常,签入测试是功能测试的子集。TestNG允许您以非常直观的方式使用测试组指定。例如,您可以通过说明您的整个测试类属于“functest”组来构建测试,另外还有一些方法属于“checkintest”组:
1 public class Test1 { 2 @Test(groups = { "functest", "checkintest" }) 3 public void testMethod1() { 4 } 5 6 @Test(groups = {"functest", "checkintest"} ) 7 public void testMethod2() { 8 } 9 10 @Test(groups = { "functest" }) 11 public void testMethod3() { 12 } 13 }
1 <test name="Test1"> 2 <groups> 3 <run> 4 <include name="functest"/> 5 </run> 6 </groups> 7 <classes> 8 <class name="example1.Test1"/> 9 </classes> 10 </test>
1 @Test 2 public class Test1 { 3 @Test(groups = { "windows.checkintest" }) 4 public void testWindowsOnly() { 5 } 6 7 @Test(groups = {"linux.checkintest"} ) 8 public void testLinuxOnly() { 9 } 10 11 @Test(groups = { "windows.functest" ) 12 public void testWindowsToo() { 13 } 14 }
方法组
您还可以排除或包含单个方法:
1 <test name="Test1"> 2 <classes> 3 <class name="example1.Test1"> 4 <methods> 5 <include name=".*enabledTestMethod.*"/> 6 <exclude name=".*brokenTestMethod.*"/> 7 </methods> 8 </class> 9 </classes> 10 </test>
这可以派上用来停用单个方法而不必重新编译任何东西,但我不建议过多地使用这种技术,因为如果你开始重构Java代码(正则表达式中使用的正则表达式),它会使你的测试框架崩溃。标签可能不再符合您的方法)。
5.3 - 群组
组还可以包括其他组。这些组称为“MetaGroups”。例如,您可能希望定义一个包含“checkintest”和“functest”的组“all”。“functest”本身将包含“windows”和“linux”组,而“checkintest将只包含”windows“。以下是如何在属性文件中定义它:
1 <test name="Regression1"> 2 <groups> 3 <define name="functest"> 4 <include name="windows"/> 5 <include name="linux"/> 6 </define> 7 8 <define name="all"> 9 <include name="functest"/> 10 <include name="checkintest"/> 11 </define> 12 13 <run> 14 <include name="all"/> 15 </run> 16 </groups> 17 18 <classes> 19 <class name="test.sample.Test1"/> 20 </classes> 21 </test>
5.4 - 排除组
TestNG允许您包括组以及排除它们。
例如,由于最近的更改而暂时中断测试通常很常见,而您还没有时间修复破损。4但是,您确实需要完整运行功能测试,因此需要停用这些测试,但请记住需要重新激活它们。
解决此问题的一种简单方法是创建一个名为“broken”的组,并使这些测试方法属于它。例如,在上面的例子中,我知道testMethod2()现在已经坏了所以我想禁用它:
1 @Test(groups = {"checkintest", "broken"} ) 2 public void testMethod2() { 3 }
我现在需要做的就是从运行中排除这个组:
1 <test name="Simple example"> 2 <groups> 3 <run> 4 <include name="checkintest"/> 5 <exclude name="broken"/> 6 </run> 7 </groups> 8 9 <classes> 10 <class name="example1.Test1"/> 11 </classes> 12 </test>
这样,我将获得一个干净的测试运行,同时跟踪哪些测试被破坏,需要稍后修复。
注意:您还可以使用@Test和@ Before / After注释上的“enabled”属性逐个禁用测试。
5.5 - 部分群体
您可以在类级别定义组,然后在方法级别添加组:
1 @Test(groups = { "checkin-test" }) 2 public class All { 3 4 @Test(groups = { "func-test" ) 5 public void method1() { ... } 6 7 public void method2() { ... } 8 }
在这个类中,method2()是组“checkin-test”的一部分,它在类级别定义,而method1()属于“checkin-test”和“func-test”。