(五)TestNG学习之路—注解详述之参数化

目录

(一)TestNG学习之路—HelloWorld入门
(二)TestNG学习之路—注解及属性概览
(三)TestNG学习之路—TestNG.xml/YAML
(四)TestNG学习之路—注解详述之@Test
(五)TestNG学习之路—注解详述之参数化
(六)TestNG学习之路—注解详述之@Factory
(七)TestNG学习之路—注解详述之忽略测试
(八)TestNG学习之路—注解详述之并发
(九)TestNG学习之路—失败测试重跑
(十)TestNG学习之路—编码执行TestNG
(十一)TestNG学习之路—BeanShell高级用法
(十二)TestNG学习之路—注解转换器
(十三)TestNG学习之路—方法拦截器
(十四)TestNG学习之路—TestNG监听器
(十五)TestNG学习之路—依赖注入
(十六)TestNG学习之路—测试报告
(十七)基于TestNG+Rest Assured+Allure的接口自动化测试框架

前言

数据驱动是最常见的自动化测试框架模式之一,TestNG亦支持数据驱动,常用的有@Parameters和@DataProvider两种注解。

@Parameters

@Parameters(value = "para")参数个数须与注解方法的入参个数保持一致。

import org.testng.Assert;
import org.testng.annotations.*;

public class TestNGHelloWorld1 {
    @BeforeTest
    public void bfTest() {
        System.out.println("TestNGHelloWorld1 beforTest!");
    }

    @Test(expectedExceptions = ArithmeticException.class, expectedExceptionsMessageRegExp = ".*zero")
    public void helloWorldTest1() {
        System.out.println("TestNGHelloWorld1 Test1!");
        int c = 1 / 0;
        Assert.assertEquals("1", "1");
    }

    @Test()
    @Parameters(value = "para")
    public void helloWorldTest2(String str) {
        Assert.assertEquals("1", "1");
        System.out.println("TestNGHelloWorld1 Test2! "+ str);

    }

    @AfterTest
    public void AfTest() {
        System.out.println("TestNGHelloWorld1 AfterTest!");
    }
}

testng.xml配置parameter的value为传入给变量的值,name与@Parameters的value一致。

<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="D:/IntelliJ_IDEA_workspace/TestNG/src/test/resources">

    <parameter name="para" value="Tomandy"/>

    <classes>
        <class name="TestNGHelloWorld1">
        </class>
    </classes>
</test>
</suite>

运行结果:

TestNGHelloWorld1 beforTest!
TestNGHelloWorld1 Test1!
TestNGHelloWorld1 Test2! Tomandy
TestNGHelloWorld1 AfterTest!

===============================================
All Test Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

也可以通过@Optional来指定默认值,如果testng.xml没有配置对应的参数,则使用默认值传参。

@Test()
@Parameters(value = "para")
public void helloWorldTest2(@Optional("Tom")String str) {
      Assert.assertEquals("1", "1");
      System.out.println("TestNGHelloWorld1 Test2! "+ str);
}

@DataProvider

如果需要传递复杂的参数,那么@Parameters可能无法满足。在这种情况下,可以使用@DataProvider提供需要测试的值。@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(String n1, Integer n2) {
 System.out.println(n1 + " " + n2);
} 

输出结果:

Cedric 36
Anne 37

如果@DataProvider和@Test注解的方法不在同一个类或属于其基类的话,需通过dataProviderClass属性来指定@DataProvider类位置,并且@DataProvider注解的方法保持静态(static),举例如下:

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(Integer n) {
    // ...
  }
}

除了上述的return Object[][],@DataProvider注解的方法也允许使用迭代器,区别是迭代器允许你延迟创建自己的测试数据,TestNG会调用迭代器,之后测试方法会一个接一个的调用由迭代器返回的值。在你需要传递很多参数组给测试方法的时候,无须提前创建一堆值。

@DataProvider(name = "test1")
public Iterator<Object[]> createData() {
  return new MyIterator(DATA);
} 

如果你声明的 @DataProvider 使用 java.lang.reflect.Method 作为第一个参数,TestNG 会把当前的测试方法当成参数传给第一个参数,举例如下:

@DataProvider(name = "dp")
public Object[][] createData(Method m) {
  System.out.println(m.getName());  // print test method name
  return new Object[][] { new Object[] { "Cedric" }};
}
 
@Test(dataProvider = "dp")
public void test1(String s) {
}
 
@Test(dataProvider = "dp")
public void test2(String s) {
}

执行结果:

test1
test2

另外,@DataProvider可使用parallel属性来实现并行执行测试。

@DataProvider(parallel = true)
// ...

使用XML文件运行的data provider享有相同的线程池,默认的线程数大小是10.可以通过修改 <suite> 标签中的data-provider-thread-count属性来更改。如果想指定的几个data provider运行在不同的线程中,则必须通过不同的xml文件来运行。

<suite name="Suite1" data-provider-thread-count="20" >
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 感谢原作者的奉献,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩阅读 14,124评论 1 35
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • TestNG提供了2种传递参数的方式 第一种: testng.xml 方式使代码和测试数据分离,方便维护 第二种:...
    我为峰2014阅读 1,661评论 0 2
  • 神秘女人:你还记得你是来做什么的吗? 江丰:我是来删除记忆的。 神秘女人:它的重点不是在删除记忆,而是将你由参与者...
    漠郴江阅读 386评论 2 0
  • 滨松园里柳青青,时有幽花一树明。 夜闻细雨淅淅落,喜见群芳满目生。 (2017.03.23)
    正谊明道阅读 360评论 0 6