总结:

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 的使用的更多相关文章

  1. testng学习-before&after,parameters,并行,factory,beanshell,监听器,依赖注入

    一系列的before after的操作测试 [TestNG] Running: C:\Users\user\AppData\Local\Temp\testng-eclipse-1538841744\t ...

  2. TestNG超详细教程

    testNG官网:http://testng.org/doc/download.html howtodoinjava.com里的testNG教程,简单详细:http://howtodoinjava.c ...

  3. TestNG操作详解

    运行测试步骤方法有如下两种: 1. 直接在Eclipse运行testNG的测试用例, 在代码编辑区域鼠标右键, 选择Run as ->testNG Test 2. 在工程的根目录下, 建立tes ...

  4. TestNG深入理解

    以下内容引自: http://blog.csdn.net/wanglha/article/details/42004695 TestNG深入理解 转载 2014年12月18日 13:56:11 参考文 ...

  5. UI自动化测试(六)TestNG操作详解

    在编写TestNG代码的时候,若没有下载TestNG的jar包的话,代码会出错,下载jar包方法见该链接中java+selenium环境搭建的第二步即可:http://www.cnblogs.com/ ...

  6. testNG入门详解

    TestNG 的注释: @DataProvider @ExpectedExceptions @Factory @Test @Parameters <suite name="Parame ...

  7. TestNG(一)——起步

    你可以从 http://testng.org/doc/documentation-main.html 获取信息. 一.简介 TestNG是test next generation的缩写,即下一代测试技 ...

  8. 实战 TestNG 监听器

    TestNG 是一个开源的自动化测试框架,其灵感来自 JUnit 和 NUnit,但它引入了一些新功能,使其功能更强大,更易于使用.TestNG 的设计目标是能够被用于进行各种类型测试:单元测试.功能 ...

  9. TestNG使用教程详解(接口测试用例编写与断言)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/sinat_34766121/artic ...

随机推荐

  1. 15-[mysql内置功能]--函数,流程控制 (未完成)

    1.MySQL中提供了许多内置函数 一.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器 ...

  2. 使用Keil下载单独的Hex文件到单片机内

    前言 初学STM32时,是通过串口1把Hex文件下载进STM32的,需要一个串口模块,而且还要设置BOOT0和BOOT1电平,然后通过FlyMcu软件进行下载,这也是一种不错的方法,这里我要介绍的是使 ...

  3. Security Permissions Caching

    Security Permissions Caching Security permission caching is implemented in Security Adapters - class ...

  4. python中函数的定义和详细的使用方法

    1. 函数的概念,函数是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集   2. 函数的作用,使用函数可以加强代码的复用性,提高程序编写的效率   3. 函数的使用,函数必须先创建才 ...

  5. Fiddler接口测试(一)post接口测试

    项目背景: 1.接口URL:http://192.168.xx.xx:8080/mserver/rest/ms 2.接口参数:data=xxxxx&key=xxxxx,数据是加密的 另一种参数 ...

  6. CF刷题-Codeforces Round #481-G. Petya's Exams

    题目链接:https://codeforces.com/contest/978/problem/G 题目大意:n天m门考试,每门考试给定三个条件,分别为:1.可以开始复习的日期.2.考试日期.3.必须 ...

  7. 树莓派操控SG90舵机

    目录 舵机接线 PWM介绍 使用PWM控制舵机 这里使用树莓派来操作sg90的舵机.先看一下这个舵机的样子: 这就是传说中的SG90舵机啦,转角是0-180. SG90舵机接线: SG90舵机有三条线 ...

  8. 配置独立于系统的PYTHON环境

    配置独立于系统的PYTHON环境 python 当前用户包 一种解决方案是在利用本机的python环境的基础上,将python的包安装在当前user的.local文件夹下 一共有两种方式来实现pip的 ...

  9. 本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效

    一般是在本地调试cookie,无论使用jquery cookie插件还是js原生态cookie方法,在谷歌浏览器chrome中都不生效,这是什么原因? 原因是: chrome不支持js在本地操作coo ...

  10. LEETCODE —— Unique Paths II [Dynamic Programming]

    唯一路径问题II Unique Paths II Follow up for "Unique Paths": Now consider if some obstacles are ...