zoukankan      html  css  js  c++  java
  • testNG中@Factory详解

    @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

  • 相关阅读:
    17.多线程
    15.collection
    Spark 论文篇-Spark:工作组上的集群计算的框架(中英双语)
    Redis相关面试题
    REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案
    Jmeter使用函数助手生成随机数,同一个随机数多处使用
    ts-node与tsc
    vscode 自定义代码片段
    Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.22.2 from https://repo.maven.apache.org/maven2 was cached in the local repository
    Mac安装 nvm来管理node
  • 原文地址:https://www.cnblogs.com/silence-hust/p/4539363.html
Copyright © 2011-2022 走看看