在 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文件来运行。

TestNG参数化测试-数据提供程序 @DataProvider方式的更多相关文章

  1. testng入门教程10 TestNG参数化测试

    在TestNG的另一个有趣的功能是参数测试.在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大的不同数量的测试.参数测试,允许开发人员运行同样的测试,一遍又一遍使用不同的值. TestNG让你 ...

  2. TestNG参数化测试【转】

    原文:http://www.yiibai.com/testng/20130916303.html 在TestNG的另一个有趣的功能是参数测试.在大多数情况下,你会遇到这样一个场景,业务逻辑需要一个巨大 ...

  3. ADO.NET入门教程(二)了解.NET数据提供程序

    出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/11/2346312.html 1. 什么是.NET数据提供程序? .NET Framewor ...

  4. 简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型

    如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...

  5. 访问MySQL数据库时,报“找不到请求的 .net Framework 数据提供程序。可能没有安装。”的解决方案

    最近开发了一个系统,在测试环境上进行部署(win7环境)并测试,没有发现问题:但是把系统部署到win Server2008R2上之后,部分页面就报“找不到请求的 .net Framework 数据提供 ...

  6. Oracle第三方ado.net数据提供程序

    原文地址:http://www.infoq.com/cn/news/2009/06/oracleclient_deprecated 这项决定有部分原因是基于目前Oracle的第三方ADO.NET数据提 ...

  7. “数据提供程序或其他服务返回 E_FAIL 状态”

    “数据提供程序或其他服务返回 E_FAIL 状态” 的问题 ADO 连接SQL SERVER

  8. 调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题

    在运用Entity Framework调用存储过程的时候,遇到"调用EF的存储过程报"调用EF的存储过程报“存储区数据提供程序返回的数据读取器所具有的列数对于所请求的查询不够”问题 ...

  9. WIN7系统 64位出现 Net Framework 数据提供程序要求 Microsoft Data Access Components(MDAC).

    WIN7系统 64位出现  Net Framework 数据提供程序要求 Microsoft Data Access Components(MDAC).请安装 Microsoft Data Acces ...

随机推荐

  1. 优先队列优化dij算法

    之前已经弄过模板了,但那个复杂一点,这个就是裸的dij,用起来更方便 输入格式:n,m,s,d分别是点数,边数,起点,终点 之后m行,输入x,y,z分别是两点即权值 题目链接:https://www. ...

  2. 『MXNet』第九弹_分类器以及迁移学习DEMO

    解压文件命令: with zipfile.ZipFile('../data/kaggle_cifar10/' + fin, 'r') as zin: zin.extractall('../data/k ...

  3. 解决Requests中文乱码【有用】,读取htm文件 读取txt文件报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0

    打开这个网址https://blog.csdn.net/chaowanghn/article/details/54889835 python在open读取txt文件时,出现UnicodeDecodeE ...

  4. WDA基础二:界面,元素介绍

    1.ELEMENTS: BUTTON  按钮 CAPTION  标题 DROPDOWN_BY_IDX   带序号的下拉 DROPDOWN_BY_KEY   带键值的下拉 FILE_UPLOAD    ...

  5. MongoDB 教程(三):MongoDB 的下载、安装和配置

    一.下载 下载地址:https://www.mongodb.com/download-center#community(这里是Windows 版,其他版本也可以在该网页进行下载) 版本选择: Mong ...

  6. Python错误调试-raise、assert

    raise: raise语句手工引发一个异常:,这样做程序不会因异常而终止,而是运行报错 1 "raise" [expression ["," expressi ...

  7. Oracle Shared Pool之Library Cache

    1. Shared Pool组成 Shared Pool由许多区间(Extent)组成,这些区间又由多个连续的内存块(Chunk)组成,这些内存块大小不一.从逻辑功能角度,Shared pool主要包 ...

  8. ASP.NET MVC命名空间时引起错误的解决方法

    使用VS2012新建了一个Asp.net mvc5的项目,并把项目的命名空间名称更改了(Src更改为UXXXXX),然后就导致了以下错误 刚开始以后是项目的属性中的命名空间没有更改过来的问题,但我在重 ...

  9. Windows Server 2003添加防火墙策略教程

    1.开始--控制面板--Windows防火墙 2.启用 选择启用即启动防火墙 3.添加例外 常常启用防火墙,还是希望某端口能被某些IP所访问,而防火墙默认是禁止所有IP访问本机的所有端口的,此时我们就 ...

  10. chrome hosts

    # Go Hosts# 2017-05-02 02:13:04# Localhost (DO NOT REMOVE)127.0.0.1    localhost::1    localhost ip6 ...