`
SariyaLee
  • 浏览: 149225 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

【转载】TestNG指南5-测试方法、测试类与测试组

阅读更多

5.1 – 测试组(Test groups)

TestNG允许执行复杂的测试方法分组。不仅可以申明方法属于组,而且可以指定组包含其他组。然后TestNG可以被调用,并被要求包含某些组(或正则表达式)和排除其他的组。如果想要紧接着运行两个不同的测试配置,这将给如何划分测试的带来了最大的灵活性,且不需要重新编译。

例如,非常普遍的需要至少两种测试:

  • 检入(Check-in)测试:这些测试将在提交新代码之前运行,要求测试能够快速完成,仅确信没有破坏基础功能。
  • 功能测试:这些测试应该覆盖软件的所有功能,并且每日至少运行一次,尽管理想的是持续运行。

检入测试是功能测试的子集, 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。要知道这个差别(例如:用“.*”匹配“所有”——圆点星号,而不是“*”)。

 

方法组(Method groups)

 

也可以排除或包括个别方法:

<test name="Test1">

    <classes>

       <class name="example1.Test1">

           <methods>

              <include name=".*enabledTestMethod.*" />

              <exclude name=".*brokenTestMethod.*" />

           </methods>

       </class>

    </classes>

</test>

 

这在屏蔽单个方法而不用重新编译任何代码时就能派得上用场。但并不推荐用得太多,因为在你开始重构Java代码(在标签中使用的正则表达式可能不再匹配测试方法)时,它往往会破坏你的测试框架。

5.2 – 组中组(Groups of groups

组也可以包含其他组,这些组被称为“MetaGroups”。例如:你可能想要定义一个“all”组,包括“checkintest”和 “functest”。“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.3 – 排除组(Exclusion groups

TestNG 允许包含组也允许排除组.

例如:因为最近的修改还没来得及修复它们时,让测试临时中断就非常有用。然而,想要干净地运行功能测试,你得屏蔽掉这些测试,但是记住它们将来需要被重新激活。

解决这个问题的简单办法是建立一个“broken”组,并让这些测试方法属于它。例如:在上例中,我知道testMethod2() 现在被破坏了,所有我想屏蔽它:

    @Test(groups = { "checkintest""broken" })

    public void method2() {

       //...

    }

现在我所需要做的只是在运行中排除这个组:

<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.4 – 部分组(Partial groups

你可以在类级别上定义组,然后在方法级别上添加组:

@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.5 – 参数

测试方法不一定没有参数,你可以在每个测试方法上使用任意数目的参数,并使用@Parameters注解让TestNG传递正确的参数。

设置参数有两种方式:使用testng.xml或者编码。

  5.5.1 – testng.xml传递参数

如果参数使用简单值,可以在testng.xml 中指定它:

    @Parameters( { "first-name" })

    @Test

    public void testSingleString(final String firstName) {

       System.out.println("Invoked testString " + firstName);

       assert "Cedric".equals(firstName);

    }

 

 

在这段代码中,我们指定Java方法的参数firstName应该接收被称为first-nameXML参数的值,XML参数在testng.xml中定义:

<suite name="My suite">

    <parameter name="first-name" value="Cedric" />

    <test name="Simple example">

    <!-- ... -->

 

 

上述技法同样可用于@Before/After@Factory注解:

    @Parameters( { "datasource""jdbcDriver" })

    @BeforeMethod

    public void beforeTest(final String ds, final String driver) {

       m_dataSource = ...; // look up the value of datasource

       m_jdbcDriver = driver;

    }

 

 

这次,两个Java参数dsdriver 将分别接收属性datasourcejdbc-driver的值。

使用@Optional注解,可将参数定义为可选:

    @Parameters("db")

    @Test

    public void testNonExistentParameter(@Optional("mysql"final String db) {...

    }

 

 

如果在testng.xml文件中没有找到名为“db” 的参数,测试方法将接收由@Optional注解指定的默认值“mysql”。

@Parameters注解可用于以下情形:

  • 已有@Test@Before/After或 @Factory注解的任何一个方法.
  • 测试类有且仅有一个构造器。在该情形下,无论测试是否需要实例化,TestNG将调用带有参数的特殊构造器,初始化指定在testng.xml 的值。本特性可用来初始化类的属性值,然后在测试方法中使用。

注意:

·   XML参数被按照注解中的相同顺序映射成Java参数,如果数目不匹配TestNG将报错。

·   参数有范围限制。在testng.xml 中,既可以在<suite>标签也可以在<test>下定义参数。如果两个参数有相同的名称,则在<test>标签下的参数优先。这是很方便的,如果希望指定一个参数可适用于整个测试,且只在某个测试中覆盖它的值。

  5.5.2 - DataProviders传递参数

testng.xml中指定参数,在以下情形下可能存在不足:

  • 没有使用testng.xml.
  • 需要传递复杂的参数,或者参数需要由Java创建(复杂对象、从属性文件或数据库读取对象,等等……).

在这些情形下,可以使用数据供应者为测试提供需要的值。数据供应者是Java类中返回二维数组对象的一个方法。本方法使用@DataProvider 注解:

   

    //This method will provide data to any test method that declares that its Data Provider

    //is named "test1"

    @DataProvider(name = "test1")

    public Object[][] createData1() {

       return new Object[][] { { "Cedric"new Integer(36) },

              { "Anne"new Integer(37) }, };

    }

   

    //This test method declares that its data should be supplied by the Data Provider

    //named "test1"

    @Test(dataProvider = "test1")

    public void verifyData1(final String n1, final Integer n2) {

       System.out.println(n1 + " " + n2);

    }

 

将打印:

Cedric 36

Anne 37

 

测试方法用@Test注解的dataProvider属性指定其数据供应者。名称必须与数据供应者类中用@DataProvider(name="...")注解的名称一致.

缺少情况下,数据供应者将查找当前测试类或其基类。如果想要将数据供应者放在不同的类,则必须是一个静态方法,并在dataProviderClass 属性中指定该类:

 

public class StaticProvider {

    @DataProvider(name = "create")

    public static Object[][] createData() {

       return new Object[][] { new Object[] { new Integer(42) } };

    }

}

 

 

public class MyTest {

    @Test(dataProvider = "create", dataProviderClass = StaticProvider.class)

    public void test(final Integer n) {

       // ...

    }

}

 

 

数据供应者方法可能返回下列两种类型之一:

  • 二维数组对象(Object[][]),其第一维大小是测试方法将要调用的次数,二维大小包含一个与测试方法的参数类型一致的对象排列(如上例所示)。
  • Iterator<Object[]>,与Object[][]的唯一不同是Iterator允许延迟创建测试数据。TestNG将调用迭代器,然后带参数的测试方法靠迭代器一个接一个地返回参数值。如果你有大量的参数集传递到方法并且不想像前面那样创建它们,则使用Iterator<Object[]>就特别有用。

下面是本特性在JDK 1.4JDK5(注意:JDK1.4示例未使用范型)下的例子:

    /**

     * @testng.data-provider name="test1"

     */

    public Iterator createData() {

       return new MyIterator(DATA);

    }

 

 

   

    @DataProvider(name = "test1")

    public Iterator testXXX() {

       return null;

    }

 

 

 

 

 

分享到:
评论

相关推荐

    testng-xslt-1.1.2.zip

    这个压缩包文件“testng-xslt-1.1.2.zip”包含了这个扩展的源代码、文档以及可能的库文件,使得开发者能够方便地集成到他们的测试工作中,进行更高效的质量管理和故障排查。 TestNG是Java领域中广泛使用的自动化...

    testng-xslt-1.1压缩包

    4、testng-xslt的配置: (1) 解压testng-xslt-1.1压缩包: 把saxon-8.7.jar(testng-xslt-1.1\lib)放到在工程目录下创建一个Lib目录; 把testng-results.xsl (testng-xslt-1.1\src\main\resources)放到test-...

    testng-xslt-1.1.2-master

    6. **集成到构建流程**: TestNG-XSLT可以轻松地与持续集成工具(如Jenkins、Maven或Gradle)集成,自动在每次构建后生成测试报告。这样,团队成员可以在任何时候查看最新的测试结果,有助于快速定位和修复问题。 7....

    Maven+Selenium+TestNG+TestNG-xslt实现数据驱动测试框架

    本项目基于"Maven+Selenium+TestNG+TestNG-xslt"搭建了一个高效的数据驱动测试框架,以下将详细解释这个框架的核心组件及其实现方式。 首先,Maven是一个项目管理和综合工具,它帮助开发者管理依赖、构建项目、执行...

    testng-xslt-1.2.rar.zip

    "testng-xslt-1.2.rar"这个压缩包很可能包含了TestNG的一个特定版本,以及与之配套的一组预定义的XSLT样式表,用于美化和增强TestNG的默认测试报告。解压这个文件后,用户可以按照说明文档(如果有的话)来配置他们...

    testng-6.9-10

    testng-6.9-10 jar包

    allure-testng-adaptor-1.3.9.zip

    总的来说,allure-testng-adaptor-1.3.9.zip与primefaces核心功能分别为测试管理和前端开发提供了强大的工具。前者帮助我们以直观的方式呈现测试结果,后者则提供了一套完善的前端组件解决方案。两者结合使用,能够...

    TestNG-Spring-Example

    通过这个"TestNG-Spring-Example"项目,开发者可以学习如何结合TestNG的高级测试特性与Spring的便利性,编写高效、可靠的测试代码。实践中,这样的整合能够帮助我们更快地定位问题,提高代码质量,并且在持续集成和...

    maven3-junit-spock-testng-mixin-master.rar

    标题 "maven3-junit-spock-testng-mixin-master.rar" 暗示这是一个与 Maven、JUnit、Spock 和 TestNG 相关的项目源码压缩包。这个项目可能旨在展示如何在同一个测试环境中混合使用这些不同的测试框架,以便利用它们...

    struts2-testng-plugin-2.1.6.jar

    struts2-testng-plugin-2.1.6.jar

    testng离线安装包-可用

    - 运行和分析测试:在Eclipse中,你可以选择单个测试类、测试方法或者测试套件进行运行,并查看测试报告。 总之,TestNG作为一款强大而灵活的测试框架,对于软件开发过程中的质量保证起到了至关重要的作用。离线...

    eclipse-testng离线包

    5. **数据驱动测试**:TestNG的@DataProvider可以将数据作为参数传递给测试方法,实现数据驱动测试,适用于多组输入数据的测试场景。 6. **测试套件(Test Suite)**:testng.xml文件用于定义测试套件,它可以包含...

    Practical-Unit-Testing-with-TestNG-and-Mockito_examples

    - 测试套件(Suite):一组测试类或测试方法的集合,可以按照逻辑组织测试。 - 测试组(Group):用于对测试进行分类,方便按需执行特定的测试。 - 注解:@Test、@BeforeMethod、@AfterMethod等,用于标记测试...

    Testng-xslt-1.1 和 reportng-1.1.4

    两种方式改写testng的报告: 1.使用testng-xslt改写testng的测试报告 2.使用ReportNG替换TestNG报告

    testng-6.9.4和testng-6.8.8.zip

    2. **测试套件(Test Suites)**:可以组合多个测试类和测试配置,便于管理大型测试项目。 3. **分组测试(Test Groups)**:将相关测试组织在一起,便于按需运行或跳过。 4. **依赖管理**:可以定义测试方法间的...

    测试框架testng包

    开源自动化测试框架testng包,用于appium+java+android测试

    eclipse-testng-subeclipse-classdecomplier-插件离线包

    总结来说,这个"eclipse-testng-subeclipse-classdecomplier-插件离线包"为Eclipse用户提供了一整套的开发辅助工具,包括了强大的测试框架TestNG、版本控制工具SubEclipse以及类文件反编译器,极大地提升了开发效率...

    testng-eclipse-5.9.0.4

    2. **图形化测试套件设计**:通过图形界面可以方便地拖拽和组织测试类和测试方法,形成测试套件。 3. **测试运行器**:提供专门的TestNG运行配置,可以方便地选择要执行的测试类和方法。 4. **测试结果查看**:在...

    testng-测试

    在提供的文件`testng-6.8.jar`中,包含了TestNG库的版本6.8。这个JAR文件可以导入到Java项目中,以便在项目中使用TestNG进行测试。要使用这个库,你需要在项目构建路径中添加这个JAR,并通过相关的Java API或注解来...

Global site tag (gtag.js) - Google Analytics