@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 ...
随机推荐
- sqlyog 可视化查看数据库关系并创建外键
+ 一个架构设计器,把表拖进来即可查看数据库关系 如果要建立外键,需要在两个要被建立的外键之间进行操作(经过验证不需要都为主键),然后从用鼠标把子外键拖到父外键中,就可以关联上了. 参考: https ...
- [JLOI2013]地形生成[组合计数]
题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ...
- 负载均衡@StackExchange.Redis实现Session外置--纯干货喂饱你
Redis和StackExchange.Redis redis有多个数据库1.redis 中的每一个数据库,都由一个 redisDb 的结构存储.其中,redisDb.id 存储着 redis 数据库 ...
- 微信小程序云开发
什么是云开发? 云开发是由腾讯云联合微信团队为开发者提供的 包含 云函数.云数据库和云文件存储能力的后端云服务 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 A ...
- ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写
参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...
- IVF link error错误不显示的问题
遇到一个奇怪的问题,IVF编译链接时显示error LINK: 后面没有具体的错误信息(见后图,我的窗口后面是空的)环境:windows 10 64位系统,VS2017 commutity 版本, ...
- oracle vm virtualbox 保存虚拟系统,重装后使用
直接将VirtualBox VMs 文件夹打包,然后在新系统中装好virtualbox 解压virtualBox VMs ,在系统文件夹中找到 .vbox结尾的文件,点击, 就可以看到熟悉的系统出现在 ...
- Web APi 入门例子
http://www.cnblogs.com/guyun/p/4589115.html#what
- 炸!分享美团面试关于selenium的面试题
个人分类: 软件测试 编辑 在这个互联网技术快速迭代的时代,每个测试员都知道技术对于职业发展的重要性,那些技术好的测试员不仅薪资高,而且大多数集中在一线互联网企业工作,让人感觉非常高大上的同时,也想去 ...
- 06-matplotlib-饼状图
import numpy as np import matplotlib.pyplot as plt ''' 饼状图显示一个数据系列中各项总和的比例: 饼状图中的数据点显示为整个饼状图的百分比: 如: ...