zoukankan      html  css  js  c++  java
  • TestNG参数化测试-数据提供程序 @DataProvider方式

    在 testng.xml 中指定参数可能会有如下的不足:
    1.如果你压根不用 testng.xml.
    2.你需要传递复杂的参数,或者从Java中创建参数(复杂对象,对象从属性文件或者数据库中读取的etc...)
    这样的话,你就可以使用Data Provider来给需要的测试提供参数。

    所谓数据提供者,就是一个能返回对象数组的数组的方法,并且这个方法被@DataProvider注解标注:

    Java代码:

    DataProvider的定义如下:
    @DataProvider(name = "range-provider")
    public Object[][] rangeData() {
    int lower = 5;
    int upper = 10;
    return new Object[][] {
    { lower-1, lower, upper, false },
    { lower, lower, upper, true },
    { lower+1, lower, upper, true },
    { upper, lower, upper, true},
    { upper+1, lower, upper, false },
    };
    }
    调用DataProvider的方式如下:
    @Test(dataProvider = "range-provider")
    public void testIsBetween(int n, int lower,int upper, boolean expected)
    {
    println("Received " + n + " " + lower + "-"+ upper + " expected: " + expected);
    Assert.assertEquals(expected, isBetween(n, lower, upper));
    }

    1. 被@Test标注的方法通过dataProvider属性指明其数据提供商。这个名字必须与@DataProvider(name="...") 中的名字相一致。

    2. DataProvider返回的是一个Object的二维数组,二维数组中的每个一维数组都会传递给调用函数,作为参数使用。运行的时候,会发现, @Test标识的test method被执行的次数和object[][]包含的一维数组的个数是一致的,而@Test标识的函数的参数个数,也和object内一维数组内的元素数是一致的。

    3. 运行后的输出结果如下
    Received 4 5-10 expected: false
    Received 5 5-10 expected: true
    Received 6 5-10 expected: true
    Received 10 5-10 expected: true
    Received 11 5-10 expected: false
     
    ===============================================
    Parameter Suite
    Total tests run: 5, Failures: 0, Skips: 0
    ===============================================
     
    DataProviders扩展
    默认的情况下,数据提供者会查找当前的测试类或者测试类的基类。如果你希望它能够被其他的类所使用,可以专门创建数据提供者类, 并且通过测试方法的 dataProviderClass 属性指定要使用的数据提供者类:
    public static class TestDataProvider {
      @DataProvider(name = "create")
      public static Object[][] createData() {
        return new Object[][] {
          { new Integer(42) },
        { new Integer(92) }
        }
      }
    }
     
    public class MyTest {
      @Test(dataProvider = "create", dataProviderClass = TestDataProvider.class)
      public void test(Integer n) {
        // ...
      }
    }
     
    Data Provider方法可以返回如下两种类型中的一种:
    1.含有多个对象的数组 (Object[][]),其中第一个下标指明了测试方法要调用的次数,第二个下标则完全与测试方法中的参数类型和个数相匹配。上面的例子已经说明。
    2.另外一个是迭代器 Iterator<Object[]>。二者的区别是迭代器允许你延迟创建自己的测试数据。TestNG会调用迭代器,之后测试方法会一个接一个的调用由迭代器返回的值。在你需要传递很多参数组给测试组的时候,这样你无须提前创建一堆值。
     
    下面是使用JDK5 的例子 (注意 JDK 1.4 的例子不适用泛型):
    public Iterator createData() {
      return new MyIterator(DATA);
    )
    @DataProvider(name = "test1")
    public Iterator
     
    如果你声明的 @DataProvider 使用 java.lang.reflect.Method 作为第一个参数,TestNG 会把当前的测试方法当成参数传给第一个参数。这一点在你的多个测试方法使用相同的@DataProvider的时候,并且你想要依据具体的测试方法返回不同的值时,特别有用。
    例如,下面的代码它内部的 @DataProvider 中的测试方法的名字:
    @DataProvider(name = "dp")
    public Object[][] createData(Method m) {
      System.out.println(m.getName());  
      return new Object[][] { new Object[] { "Cedric" }};
    }
     
    @Test(dataProvider = "dp")
    public void test1(String s) {
    }
    @Test(dataProvider = "dp")
    public void test2(String s) {
    }
    所以会显示:
    test1 
    test2
     
    Data provider可以通过属性 parallel实现并行运行:
    @DataProvider(parallel = true)
    // ...
    使用XML文件运行的data provider享有相同的线程池,默认的大小是10.你可以通过修改该在 <suite> 标签中的值来更改:
    <suite name="Suite1" data-provider-thread-count="20" >
    ... 
    如果你需要让指定的几个data provider运行在不同的线程中,那么就必须通过不同的xml文件来运行。
  • 相关阅读:
    MFC工作者线程
    【转】水煮TCPMP
    TCPMP的ARM编译器问题
    奇怪的链接警告-ole32.lib
    Stack overflow错误的一个原因
    旋转wince的桌面的函数
    ASNI to Unicode 转换与系统语言的问题
    WinCE 驱动开发问题精华集锦
    【转】OAL之系统时钟
    【转】蓝牙技术及其系统原理
  • 原文地址:https://www.cnblogs.com/yuhuameng/p/7389472.html
Copyright © 2011-2022 走看看