testNG官方文档翻译-5 测试方法,测试类和测试组

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的参数

posted @ 2017-03-19 21:20  suntingme  阅读(373)  评论(0编辑  收藏  举报