总结:

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. WPF 播放Flash

    原文:WPF 播放Flash WPF中没有直接提供播放Flash的控件. 可以使用WebBrowser来打开,代码如下: <Window x:Class="Nankang.Itacat ...

  2. EDB*Plus的当前路径问题

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackg ...

  3. mfc 类对象指针

    类对象指针 一.类对象指针定义 Tdate d1; Tdate *p1=&d1; Tdate *p2=(Tdate *)malloc(sizeof(Tdate)); 二.类对象指针使用 int ...

  4. 【Vijos】lxhgww的奇思妙想

    题面 题解 求$k$级祖先孙子 为什么要用长链剖分啊??? 倍增并没有慢多少... 其实是我不会 长链剖分做这道题还是看这位巨佬的吧. 代码 #include<bits/stdc++.h> ...

  5. cogs1885 [WC2006]水管局长数据加强版

    BZOJ卡不过灰常蛋疼(毕竟人蠢自带巨大常数 这和动态维护最小生成树很像,但加边变成了删边,似乎没法做了. 然后根据之前的套路离线做,删边变成加边,就可以做了orz 二分查找的:(慢 // It is ...

  6. Java并发工具类(一):等待多线程完成的CountDownLatch

    作用 CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行 简介 CountDownLatch是在java1.5被引入的,存在于java.uti ...

  7. Linux常用系统命令大全

    最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一 ...

  8. C#课后练手

    猜拳(三局两胜)请输入您的手势:石头用户手势:石头      电脑手势:剪刀用户胜:1      电脑胜:0 请输入您的手势:石头用户手势:石头      电脑手势:石头用户胜:1      电脑胜: ...

  9. 14-Dockerfile常用指令

    下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档.FROM 指定 base 镜像. MAINTAINER设置镜像的作者,可以是任意字符串. COPY将文件从 build ...

  10. AssetBundle加载API

    AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是 ...