@Dataprovider 和 @Factory 的使用
总结:
0.@Dataprovider 所修饰的方法必须 return Object[][] ; @Facotry 所修饰的方法必须return Object[] ;
1.在测试场景中经常会遇到一个人执行多个case,那么多个人没人都执行一遍这个case的时候就要用到@Factory创建多个对象了,类似于QTP中的迭代;
2.如果测试相关联的类中只有一个带参的构造方法,那么在执行测试的时候可能会抛一个无法初始化某个类的错误,这个时候就要使用@Factory来进行初始化了;
说明:一个人执行多次case和多个人每人都执行多次case是不一样的测试场景,类似于模拟多用户的场景,比如A用户有执行lognin()的权限,而B用户没有这个权限,虽然A和B都是一个用户对象,但他们执行的结果却不一样 ;
以上仅代表个人理解哈,如有不同,+316567803 或者留言进行讨论 ;
1.@Datatprovider 可以放在一个类中为@Test 和 @Factory 提供参数初始化 比如:
package main.test; import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;
import org.testng.annotations.Test;
public class BB {
private int id ;
private String name ;
private int age ;
BB(){}
public BB(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String toString() {
return "BB{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
} /*
*1.为了演示这里提供了2个@DataProvider(dataPraovide1 和 dataPraovide2) ;
* >dataPraovide1 作为Test数据的数据源 ;
* >dataPraovide2 作为@Factory的数据化数据源;
*2.@Factory为BB类提供初始化 ;
*3.@Test 为BB类的print();
*/ @DataProvider(name = "db1")
public Object[][] dataPraovide_1() {
return new Object[][]{
{1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
{2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
{3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
};
}
@DataProvider(name = "db")
public Object[][] dataPraovide_0() {
return new Object[][]{
{1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
{2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
{3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
};
}
//使用db数据源没次创建1个BB的对象,然后使用这个对象执行db1的测试案例(9×9=81次) ;
@Factory(dataProvider = "db")
public Object[] createObj_1(int id, String name, int age) {
BB[] bbArray ={new BB(id, name, age)};
return bbArray;
} @Test( dataProvider = "db1")
public void print(int id ,String name,int age) {
System.out.println(this.toString());
System.out.println("-------"+id+"-----------"+name+"------------"+age);
}
}
执行结果:

2.将@Factory 和 @DataPrivade 放在2个类中进行处理 ;
GG.class 为BB.class提示数据支持;
package main.test; import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory; public class GG {
/*
*1.为了演示这里提供了2个@DataProvider(dataPraovide1 和 dataPraovide2) ;
* >dataPraovide1 作为Test数据的数据源 ;
* >dataPraovide2 作为@Factory的数据化数据源;
*2.@Factory为BB类提供初始化 ;
*3.@Test 为BB类的print();
*/
@DataProvider(name = "db1")
public static Object[][] dataPraovide1() {
return new Object[][]{
{1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
{2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
{3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
};
}
@DataProvider(name = "db")
public Object[][] dataPraovide() {
return new Object[][]{
{1, "jack1", 21}, {4, "jack4", 24}, {7, "jack7", 27},
{2, "jack2", 22}, {5, "jack5", 25}, {8, "jack8", 28},
{3, "jack3", 23}, {6, "jack6", 26}, {9, "jack9", 29}
};
}
//使用db数据源没次创建1个BB的对象,然后使用这个对象执行db1的测试案例(9×9=81次) ;
/* @Factory(dataProvider = "db")
public Object[] createObj_1(int id, String name, int age) {
BB[] bbArray ={new BB(id, name, age)};
return bbArray;
}*/
//使用db数据源没次创建10个BB的对象,然后使用这个对象执行db1的测试案例(10x9×9=810次) ;
@Factory(dataProvider = "db")
public Object[] createObj(int id, String name, int age) {
BB[] bbArray = new BB[10];
for (int i = 0; i < bbArray.length; i++) {
bbArray[i] = new BB(id, name, age);
} return bbArray;
}
}
BB.class
package main.test; import org.testng.annotations.Test;
public class BB {
private int id ;
private String name ;
private int age ;
BB(){}
public BB(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public String toString() {
return "BB{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
} //如果不放在一个类中这里要制定dataProviderClass 类;并且dataProvider = "db1" 的方法要为静态的,如果不为静态的会跑错;
@Test( dataProvider = "db1", dataProviderClass = main.test.GG.class )
public void print1(int id ,String name,int age) {
System.out.println(this.toString());
System.out.println("-------"+id+"-----------"+name+"------------"+age);
}
}
tesng.xlm
<?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="TESTPROVIDER">
<classes>
<!-- 这里必须加载GG类不然执行抛错 -->
<class name="main.test.GG"/>
<class name="main.test.BB">
<methods>
<include name="print1"/>
</methods>
</class>
</classes>
</test>
</suite>
execute.bat 文件
@echo off
set xmlPath=C:\CustomSofter\develop\IDEA\IDEAWorkSpace\C3p0TestPrictice
set lib=C:\CustomSofter\develop\IDEA\IDEAWorkSpace\C3p0TestPrictice\out\artifacts\C3p0TestPrictice_jar
set classpath=%lib%\C3p0TestPrictice.jar;%lib%\jcommander-1.30.jar;%lib%\testng-6.8.8.jar;
java org.testng.TestNG %xmlPath%\testng.xml
pause
下面这个图主要是和execute.bat 文件相对照的

3.执行结果:

4.如果db1方法不为静态的错误:

@Dataprovider 和 @Factory 的使用的更多相关文章
- testng学习-before&after,parameters,并行,factory,beanshell,监听器,依赖注入
一系列的before after的操作测试 [TestNG] Running: C:\Users\user\AppData\Local\Temp\testng-eclipse-1538841744\t ...
- TestNG超详细教程
testNG官网:http://testng.org/doc/download.html howtodoinjava.com里的testNG教程,简单详细:http://howtodoinjava.c ...
- TestNG操作详解
运行测试步骤方法有如下两种: 1. 直接在Eclipse运行testNG的测试用例, 在代码编辑区域鼠标右键, 选择Run as ->testNG Test 2. 在工程的根目录下, 建立tes ...
- TestNG深入理解
以下内容引自: http://blog.csdn.net/wanglha/article/details/42004695 TestNG深入理解 转载 2014年12月18日 13:56:11 参考文 ...
- UI自动化测试(六)TestNG操作详解
在编写TestNG代码的时候,若没有下载TestNG的jar包的话,代码会出错,下载jar包方法见该链接中java+selenium环境搭建的第二步即可:http://www.cnblogs.com/ ...
- testNG入门详解
TestNG 的注释: @DataProvider @ExpectedExceptions @Factory @Test @Parameters <suite name="Parame ...
- TestNG(一)——起步
你可以从 http://testng.org/doc/documentation-main.html 获取信息. 一.简介 TestNG是test next generation的缩写,即下一代测试技 ...
- 实战 TestNG 监听器
TestNG 是一个开源的自动化测试框架,其灵感来自 JUnit 和 NUnit,但它引入了一些新功能,使其功能更强大,更易于使用.TestNG 的设计目标是能够被用于进行各种类型测试:单元测试.功能 ...
- TestNG使用教程详解(接口测试用例编写与断言)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/sinat_34766121/artic ...
随机推荐
- BZOJ4145_The Prices_KEY
题目传送门 看到M<=16经典状态压缩的数据范围,考虑题目. 一道类似于背包的题目. 设f[i][j]表示前i个商店,物品购买状态为j. 先将f[i][j]加上w[i](到i的路费),转移一次, ...
- Oracle单节点_Grid_Infrastructure_DB_安装过程图解(三/三)
接上文: Oracle单节点_Grid_Infrastructure_DB_安装过程图解(二/三)
- 利用开源软件 Hugin 实现照片的景深合成
利用开源软件 Hugin 实现照片的景深合成 本文主要参考了下面的文章:http://macrocam.blogspot.jp/2013/09/using-hugin-for-focus-stacki ...
- Linux新手常见问题
yum与apt的区别 参考:https://blog.csdn.net/qq_26182553/article/details/79869666 ubuntu下su: Authentication f ...
- 【操作系统】C语言编写的FAT16文件系统
[操作系统]C语言编写的FAT16文件系统 这是操作系统的期末课程设计作业之一,主要功能是在物理内存中虚拟出一个1M大小的FAT16的文件系统,然后把它读入内存中,进行具体的文件操作,具体的实用性不大 ...
- Html.RenderPartial与Html.RenderAction的区别
Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. Html.RenderPartial是直接将用户控件嵌入到界面上: <%Htm ...
- 洛谷P1313 计算系数【快速幂+dp】
P1313 计算系数 题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别 ...
- AssetBundle一些问题
AssetBundle划分过细的问题,比如每个资源都是AssetBundle. 加载IO次数过多,从而增大了硬件设备耗能和发热的压力: Unity 5.3 ~ 5.5 版本中,Android平台上在不 ...
- 【LeetCode算法题库】Day3:Reverse Integer & String to Integer (atoi) & Palindrome Number
[Q7] 把数倒过来 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outpu ...
- 【LeetCode算法题库】Day2:Median of Two Sorted Arrays & Longest Palindromic Substring & ZigZag Conversion
[Q4] There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...