@Factory注解从字面意思上来讲就是采用工厂的方法来创建测试数据并配合完成测试,其主要应对的场景是:对于某一个测试用例或方法,我们需要输入多个测试数据进行测试,并且这些测试数据可以是有一定关系(可以通过代码控制),此时,我们就可以把自动化或者手动测试时的遇到的只因测试数据不同的多个测试用例合并成一个测试用例,来进行更方便和快捷的测试。

策略:一般我们会在标有@Factory注解的方法中对测试类进行调用,这时TestNg会自动调用测试类中带有@Test注解的方法

配置文件:只需要配置带有@Factory注解的类即可

@Factory必须放在一个返回对象数组的顶部,所有的这些对象都包含测试类的实例,testng会确保@Factory只被调用一次。

@Factory方法是首先被调用的,在@Test方法和配置方法之前,只有当所有的@Factory方法被调用之后,testng才开始执行配置和测试方法。

@Factory允许在运行时动态测试。

简单的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SimpleTest {
    @Test
    public void simpleTest1(){
        System.out.println("simple test one");
    }
    @Test
    public void simpleTest2(){
        System.out.println("simple test two");
    }
}
  
public class SimpleTestFactory
{
  @Factory
  public Object[] factoryMethod() {
    return new Object[] { new SimpleTest(), new SimpleTest() };
  }
}

SimpleTestFactory工厂类,在带有@Factory注解的方法中调用被执行的测试类,TestNg会自动调用被执行类中带有@Test注解的方法被执行的测试类为:SimpleTestFactory。

输出结果会:

simple test one

simple test one

simple test two

simple test two

PASSED: simpleTest1

PASSED: simpleTest1

PASSED: simpleTest2

PASSED: simpleTest2

===============================================

Default test

Tests run: 4, Failures: 0, Skips: 0

===============================================

由以上可知所有的test方法都被调用了。

使用@Factory最大的好处就是可以在初始化的时候将参数传给测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class SimpleTest {
    private int para;
    public SimpleTest(int para) {
        this.para = para;
    }
      
    @Test
    public void testMethodOne(){
        int value = para + 1;
        System.out.println("Test method one output: " + value);
    }
    @Test
    public void testMethodTwo(){
        int value = para + 2;
        System.out.println("Test method two output: " + value);
    }
}
 
public class SimpleTestFactory {
     
    @Factory
    public Object[] factoryMethod(){
        return new Object[] { new SimpleTest(0), new SimpleTest(10)};
    }
}

运行SimpleTestFactory,可以得到以下输出:

Test method one output: 1

Test method one output: 11

Test method two output: 2

Test method two output: 12

PASSED: testMethodOne

PASSED: testMethodOne

PASSED: testMethodTwo

PASSED: testMethodTwo

可以知道测试中的每个方法都执行了两遍。

@Factory更适合于同一类型的参数变化性的测试,那么如果参数值没有特定的规律时,我们可以采用@Factory和@DataProvider相结合的方式进行测试

注意要点:测试方法将被一共执行的次数,因为@Factory本身就属于循环测试的类型,@DataProvider也是属于测试整体循环的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class DataProviderTest
{
  private int param;
   
  @Factory(dataProvider = "dataMethod")
  public DataProviderTest(int param) {
    this.param = param;
  }
   
  @DataProvider
  public static Object[][] dataMethod() {
    return new Object[][] { new Object[]{ 0 }, new Object[]{ 10 } };
  }
   
  @Test
  public void testMethodOne() {
    int opValue = param + 1;
    System.out.println("Test method one output: " + opValue);
  }
   
  @Test
  public void testMethodTwo() {
    int opValue = param + 2;
    System.out.println("Test method two output: " + opValue);
  }
}

dataMethod会返回一个二维数组,维数表示迭代的次数,第二个值表示传入的参数。

使用@Factory的依赖测试,在会先执行所有的依赖方法,然后在执行测试方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class DependencyTest
{
  private int param;
 
  public DependencyTest(int param) {
    this.param = param;
  }
 
  @Test(dependsOnMethods = { "testMethodTwo" })
  public void testMethodOne() {
    System.out.println("Test method one with param values: " this.param);
  }
 
  @Test
  public void testMethodTwo() {
    System.out.println("Test method two with param values: " this.param);
  }
}
 
public class SimpleTestFactory
{
  @Factory
  public Object[] factoryMethod()
  {
    return new Object[] { new DependencyTest(1), new DependencyTest(2) };
  }
}

结果:

Test method two with param values: 2

Test method two with param values: 1

Test method one with param values: 2

Test method one with param values: 1

PASSED: testMethodTwo

PASSED: testMethodTwo

PASSED: testMethodOne

PASSED: testMethodOne

​以上来源于:http://www.tuicool.com/articles/qAzYF3

testNG中@Factory详解的更多相关文章

  1. winxp计算机管理中服务详解

    winxp计算机管理中服务详解01 http://blog.sina.com.cn/s/blog_60f923b50100efy9.html http://blog.sina.com.cn/s/blo ...

  2. cocos2dx常见的46中+22中动作详解

    cocos2dx常见的46中+22中动作详解 分类: iOS2013-10-16 00:44 1429人阅读 评论(0) 收藏 举报 bool HelloWorld::init(){    ///// ...

  3. Android中Context详解 ---- 你所不知道的Context

    转自:http://blog.csdn.net/qinjuning/article/details/7310620Android中Context详解 ---- 你所不知道的Context 大家好,  ...

  4. iOS中-Qutarz2D详解及使用

    在iOS中Qutarz2D 详解及使用 (一)初识 介绍 Quartz 2D是二维绘图引擎. 能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成 ...

  5. 【转】declare-styleable的使用(自定义控件) 以及declare-styleable中format详解

    原文网址:http://www.cnblogs.com/622698abc/p/3348692.html declare-styleable是给自定义控件添加自定义属性用的 1.首先,先写attrs. ...

  6. Python中dict详解

    from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...

  7. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  8. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  9. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

随机推荐

  1. 配置Symfony2

    安装成功后打开server php app/console server:run 127.0.0.1:8000 然后在浏览器输入localhost/8000/config.php进行配置 1.date ...

  2. 圆形DIV

    <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...

  3. C#格式化JSON字符串

    很多时候我们需要将json字符串以 {     "status": 1,     "sum": 9 }这种方式显示,而从服务端取回来的时候往往是这样 {&quo ...

  4. shell编程之echo命令

    Linux echo命令不能显示文件中的内容.显示字符串或者变量功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--help][--version]补充说明:echo会将输入 ...

  5. Coding4Fun.Phone.Controls的使用

    Coding4Fun.Phone.Controls的使用: windows phone的应用一直有一个特色,那就是方块(磁贴).之前的应用中,我一直都XXXX 来实现,原来其实一直有一个更加好的方法, ...

  6. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  7. linux用户配置和用户权限

    一.查看用户: (1)在终端里.输入:cat /etc/passwd,查看/etc/passwd文件就行了.(2)看第三个参数:500以上的,就是后面建的用户了.其它则为系统的用户. 查看当前在线用户 ...

  8. Coder-Strike 2014 - Finals (online edition, Div. 2) C题

    C. Online Meeting time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. CKEditor (Toolbar Definition)工具栏自定义配置

    JS是大小写敏感的, 在设置配置文件的时候需要注意 以CKEditor 4为基础我们可以通过两种方式配置CKEditor的工具栏,一种是是通过config.js配置文件设置, 另一种是IN-PAGE方 ...

  10. Sqli-labs less 38

    Less-38 学习了关于stacked injection的相关知识,我们在本关可以得到直接的运用. 在执行select时的sql语句为:SELECT * FROM users WHERE id=' ...