(六)TestNG学习之路—注解详述之@Factory

作者: Tomandy | 来源:发表于2018-09-03 17:37 被阅读2次

    前言

    使用@Factory可动态地创建测试,一般用来创建一个测试类的多个实例,每个实例中的所有测试用例都会被执行,@Factory构造实例的方法必须返回Object[]。

    @Factory详解

    创建测试类如下,其中test1依赖于test方法。

    import org.testng.annotations.Test;
    
    public class TomandyFactory {
    
        private  String str;
        public TomandyFactory(String str){
            this.str = str;
        }
    
        @Test
        public void test(){
            System.out.println("TomandyFactory: " +str);
        }
    
        @Test(dependsOnMethods = "test")
        public void test1(){
            System.out.println("TomandyFactory1: " +str);
        }
    }
    

    创建工厂测试类,该工程创建2个TomandyFactory实例。

    import org.testng.annotations.Factory;
    
    public class TestFactory {
    
        @Factory
        public Object[] test(){
            Object[] object = new Object[2];
            for(int i=0;i<2;i++) {
                TomandyFactory tomandyFactory = new TomandyFactory(i+"");
                object[i] = tomandyFactory;
            }
            return object;
        }
    }
    

    testng.xml配置工厂类名TestFactory即可:

    <?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="Test">
        <classes>
            <class name="TestFactory">
            </class>
        </classes>
    </test>
    </suite>
    

    执行结果:

    TomandyFactory: 0
    TomandyFactory: 1
    TomandyFactory1: 0
    TomandyFactory1: 1
    
    ===============================================
    All Test Suite
    Total tests run: 4, Failures: 0, Skips: 0
    ===============================================
    

    通过以上例子的执行结果可以发现,尽管test1方法依赖于test方法,但@Factory工厂测试类的执行测试类方法的顺序却是:test,test,test1,test1,如果需要执行类似登录、退出之类的功能,并不能满足咱们的需求,此类场景,官网也给出了解决方案,那就是在testng.xml添加:

      <suite name="Factory" group-by-instances="true">
    or
      <test name="Factory" group-by-instances="true">
    

    还是上面的例子,修改testng.xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="All Test Suite" group-by-instances="true">
    <test verbose="2" preserve-order="true" name="Test">
    
        <parameter name="para" value="Tomandy"/>
    
        <classes>
            <class name="TestFactory">
            </class>
        </classes>
    </test>
    </suite>
    

    执行结果如下,测试类方法执行顺序为:test,test1,test,test1。

    TomandyFactory: 0
    TomandyFactory1: 0
    TomandyFactory: 1
    TomandyFactory1: 1
    
    ===============================================
    All Test Suite
    Total tests run: 4, Failures: 0, Skips: 0
    ===============================================
    

    @Factory与@DataProvider区别

    通过上述@Factory的例子,可能会联想到TestNG的@DataProvider,但两者的区别也是比较明显的。

    @DataProvider:为测试用例提供参数,有多少组参数就会执行多少次用例,因此它是让一个测试类实例的某个方法执行多次,每次执行都是同一个实例
    @Factory:创建一个测试类的多个实例,每个实例中的所有测试用例都会被执行,每次执行采用的是不同实例

    Factory也可以与DataProvider结合使用。
    修改上述例子的工厂测试类如下:

    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Factory;
    
    public class TestFactory {
    
        @Factory(dataProvider = "n")
        public Object[] test(int n){
            Object[] object = new Object[n];
            for(int i=0;i<n;i++) {
                TomandyFactory tomandyFactory = new TomandyFactory(i+"");
                object[i] = tomandyFactory;
            }
            return object;
        }
    
        @DataProvider(name = "n")
        public Object[][] num(){
            return new Object[][]{new Object[]{3}};
        }
    }
    

    执行结果如下:

    TomandyFactory: 0
    TomandyFactory1: 0
    TomandyFactory: 1
    TomandyFactory1: 1
    TomandyFactory: 2
    TomandyFactory1: 2
    
    ===============================================
    All Test Suite
    Total tests run: 6, Failures: 0, Skips: 0
    ===============================================
    

    相关文章

      网友评论

        本文标题:(六)TestNG学习之路—注解详述之@Factory

        本文链接:https://www.haomeiwen.com/subject/xmofwftx.html