@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. 【Sort List】cpp

    题目: Sort a linked list in O(n log n) time using constant space complexity. 代码: /** * Definition for ...

  2. Upgrading to Java 8——第二章 Method References(方法引用)

    概述 很多java 方法会使用函数式接口作为参数.例如,java.util.Arrays类中的一个sort方法,就接受一个Comparator接口,它就是一个函数式接口,sort方法的签名如下: pu ...

  3. python 单元测试-unittest

    参考资料:https://docs.python.org/3.4/library/unittest.html#module-unittest 一张图解决问题: 涉及5块内容:case.suite.lo ...

  4. 【BZOJ】【3261】最大异或和

    可持久化Trie 嗯……同样搞个前缀异或和,然后将x与sum异或一下,就是在[l-1,r-1]中找x^sum的最大异或值了.同样可持久化Trie搞搞即可(模板还是没背全啊……sad /******** ...

  5. Android本地服务

    一.服务生命周期总结 (一).单独开启服务,并没有绑定服务Activity中调用startService(),服务的lifecycle:onCreate()→onStartCommand()→onSt ...

  6. orbis 链接 .a的问题

    orbis-clang.exe :error: no such file or directory : libppfxd_delta.a 这个东西真是见鬼 明明在那里就是说找不到 在依赖里libppf ...

  7. java中byte和blob互转

    1. btye[]转blob byte[] bs = ... Blob blob = conn.createBlob(); blob.setBytes(1, bs); ps.setBlob(2, bl ...

  8. 简单的表视图UITableView

    1.建一个Single View application 2.在故事板中放置一个Table View控件 3.在.h文件中加入协议 <UITableViewDataSource,UITableV ...

  9. 说说Thread.Sleep(0)的那些奇怪的事

    写在前面 最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0).那个问题竟然解决了,耗费我一上午 ...

  10. 直面Javascript面试题算法思路

    一.字符串遍历类 1.获取符合条件的字符 思路:一般使用正则表达式会比遍历字符串简单.a=str.match(reg),a即为所得. 例子:a.判断字符串是否是这样组成的,第一个必须是字母,后面可以是 ...