• TestNG扩展


    1. TestNG API

         本章节将讨论如何使用TestNG API来创建自己的TestNG对象。TestNG的API基本由接口组成,这样做是为了容易模拟TestNG返回的对象。

    1.1 org.testng.TestNG、ITestResult、ITestListener、ITestNGMethod

            TestNG类是TestNG的的主入口,它让我们指定测试类,指定包含的分组或排除的分组,指定要执行的XML文件等。

    public static void mian(String[] args){
        TestNG tng = new TestNG();
        tng.setTestClasses(new Class[]{ MyTest.class});
       TestListenerAdapter listener = new TestListenerAdapter();
       tng.addListener(listener);
       tng.run();
       log("PASSED:" + listener.getPassedTests().size());
    }

    这里TestListenerAdapter类提供了ITestListener接口的一个简单实现。这里使用TestListenerAdapter的另一项功能:记录所有通过的测试案例数量。

         通过TestListenerAdapter可以方便的获取结果的程序清单,如果需要为这个类添加功能,又保留测试结果程序清单,则可以调用被覆盖方法的super()方法,如下所示:

    public class MyTestListener extends TestListenerAdapter{
        public void onTestSuccess(ITestResult result){
            super.onTestSuccess(result);
            //do you own processing
        }
    }

    TestListenerAdapter 保存了测试结果:

    public List<ITestResult> getPassedTests()
    public List<ITestResult> getFailedTests()
    public List<ITestResult> getSkippedTests()

    ITestResult 接口能让我们获取某个测试状态、测试方法、参数,以及开始时间和结束时间:

    public void onTestSuccess(ITestResult iTestResult) {
            long time =
                    (iTestResult.getEndMillis() - iTestResult.getStartMillis());
            log("Success, method:" + iTestResult.getMethod()
                +" #parameters:"+iTestResult.getParameters().length
                + " time:" + time);
        }  

    ITestResult# getResult 返回一个ITestNGMethod,这个是TestNG对测试方法的一个视图。从这个对象我们可以获得TestNG对象当前调用的原始java.lang.reflact.Method, 并获得其他信息,如:

    • 分组/方法信息(这个方法所属的分组,它依赖的分组和方法)。
    • 调用的次数,线程池的大小以及超时设置。
    • 这个方法是否是一个配置方法(@Before/@After), 它是哪一种配置方法:
    ITestNGMethod method = iTestResult.getMethod();
            log(" Method:"+method.getMethodName()
            +" invocationCount:" +method.getInvocationCount()
            +" #groups:"+method.getGroups().length
            +" timeOut:"+method.getTimeOut());

     

    1.2 XML API

        TestNG提供了一个简单的接口,让我们访问自己的testng.xml, 甚至可以从头创建它。与XML API相关的这些类在org.testng.xml中,每个XML标签都有一个对应的类:

    标签

    类名

    <suite> XmlSuite
    <test> XmlTest
    <package> XmlPackage
    <class> XmlClass
    <method-selector> XmlMethodSelector

    xml 文件如下:

    <suite name="testng" verbose="1" thread-count="2">
        <parameter name="first-name" value="cedric" />
        <test name="Regression 1">
            <group>
                <run>
                    <exclude name="excludeThisGroup"/>
                </run>
            </group>
            <classes>
                <class name="test.parameter.test1" />
                <class name="test.parameter.test2" />
            </classes>
        </test>
    </suite>

    XmlSuite的值:

    方法 返回结果
    getName() testng
    getVerbose() true
    getThreadCount() 2
    getParameters() Map<String, String>:{“first-name”=>”cedric”}
    geTests() List<XmlTest>

    XmlTest的值:

    方法 返回结果
    getName() Regression1
    getIncludeGroups() {}
    getExcludeGroups() List<String>:{“excludeThisGroup”}
    getXmlClasses List<XmlClasses>:{
    “test.parameter.test1”,
    ”test.parameter.test2”
    }
    geTests() List<XmlTest>

    1.3 生成xml文件

    XmlSuite suite = new XmlSuite();
    suite.setName("TestNG");
    suite.setVerbose(1);
    suite.setThreadCount(2);
    Map<String, String> parameters = new HashMap<String, String>();
    parameters.put("first-name", "credic");
    suite.setParameters(parameters);
    
    XmlTest test = new XmlTest(suite);
    test.setName("regression1");
    test.setExcludedGroups(Arrays.asList(new String[]{"excludedGroup"}));
    
    XmlClass[] classes = new XmlClass[]{
        new XmlClass("test.parameters.test1"),
        new XmlClass("test.parameters.test1"),
    };
    test.setXmlClasses(Arrays.asList(classes);
    
    TestNG tng = new TestNG();
    //指定xml路径方式
    tng.setTestSuites(Arrays.asList(new String[]{
        "testng.xml","test-15/testng.xml"}))
    //使用当前生成的文件
    tng.setXmlSuites(Arrays.asList(new XmlSuite[]{ suite }));
    tng.run();

    2. 方法选择器:

      Testng通过方法选择器(IMethodSelector)来决定在执行测试时,包含或排除哪些方法。

    TestNG的默认方法选择器:XmlMethodSelector,它会根据testng.xml中的内容来实现决定逻辑,它的优先级为10.

    • 如果希望你自己的选择器先调用,则可以把优先级设为0~9.
    • 如果先考虑testng.xml, 则把优先级设置为大于10.
    • 如果希望自己的方法选择器替换所有默认的方法,将优先级设置为负数。在这种情况下只有带负数优先级的方法选择器会生效。
    • 方法选择器直接是OR的关系:即一个方法选择器对某个测试方法返回true,则这个测试方法就会包含在这次执行中,否则,具有下一个优先级的方法选择器会被调用(0排在10前面)。如果没有方法选择器则返回true,这个测试方法不会执行。

    3 annotation转换器(annotationTransformer)

    用户实现annotation转换器,是为了覆盖TestNG在运行时看到的annotation。

    public void InvocationTransform implements IAnnotationTransformer{
        public void transform(ITest test, class cls, Constructor con, Method method){
            if("two".equals(method.getName()){
                test.setInvocationCount(2);
            }else if("three".equals(method.getName()){
                test.setInvocationCount(3);
            }
        }
    }

    其他用法:

    • timeout:修改测试方法的超时设置;
    • enabled:修改 @Test annotation上的enabled标识。
    • invocationCount:用于多线程环境或负载测试。
    • threadPoolSize:annotation可以查询本地信息(处理器个数,可用堆大小或计算机负载),然后增加或减少线程池的大小。
    • successPercentage:和invocationCount一起使用,允许一定的失败比例。
    • dataprovider:在运行时修改数据提供者的名称。用于数据提供者本身执行动态判断。
    • description:用于HTML报告生成。
    • group:可以进行基于环境的变量分组调整。
    • dependsOnGroups/dependsOnMethod/alwaysRun:这些属性会直接影响执行顺序,请尽量避免使用annotation转换器来修改他们。

    4. 报告api

    4.1 默认报告:

        默认报告生成在./test-output目录下

    4.2 报告api

    • 利用org.testng.Reporter类,向默认报告添加定制信息。
    • ITestListener 是一个实现了org.testng.ITestListener接口的类,其中的onStart()和onFinish() 分别在testSuite开始和结束时被调用。onTest*开头的方法在测试方法被执行时调用。
    • IReporter 实现了org.testng.IReporter接口
  • 相关阅读:
    Spring IOC注入接口多实现解决
    Spring Security 学习总结
    Spring Boot自动配置与Spring 条件化配置
    1403. Minimum Subsequence in Non-Increasing Order
    1457. Pseudo-Palindromic Paths in a Binary Tree
    1368. Minimum Cost to Make at Least One Valid Path in a Grid
    1456. Maximum Number of Vowels in a Substring of Given Length
    1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence
    1472. Design Browser History
    1471. The k Strongest Values in an Array
  • 原文地址:https://www.cnblogs.com/heaven1025/p/6017898.html
Copyright © 2020-2023  润新知