zoukankan      html  css  js  c++  java
  • java testng框架的windows自动化-自动运行testng程序下篇

      本文旨在让读者简单了解testng的自动运行

      接上文https://www.cnblogs.com/xuezhezlr/p/9213456.html,文章大致把testng中比较特殊的两个xml形式说了一下,读者可以这样认为,ant的那个xml中的代码,因为只是控制了打包和指定testng的xml路径,然后获取执行结果想方法展示,而testng的xml直接控制了运行代码的顺序,包类等参数,直接控制了运行的过程,所以,如果工程主体变动不大,只需要对testng的xml进行改造,从而控制执行的方法,达到不同的测试目的

      故本文也是,上文中的ant的那个xml不会有变化,主要说一下testng中的xml和对应的class类和执行结果,一一解决一下上文说到的问题

    1,如果系统中要求只执行一部分代码,比如执行查询接口,或者只执行插入接口,如何去做

    2,如何让每个class,甚至每个方法,按照一定的方式优先级来执行

    3,方法的依赖问题,又该如何处理

    4,如果需要一个或者多个变量(如cookie),如何在代码中传输,使得今天和明天使得都是能用的不同的参数

      上述问题在junit中也可以解决,testng中的解决方式更加的优雅和高雅一点罢了~,下面准备两个文件还是原先的工程,一个是zlr.java

    package zlr;

    import org.testng.annotations.Test;

    @Test(groups = {"group-class"})
    public class zlr {
    @Test(groups = { "group-a","group-b" },priority = 2)
    public void cccMethod() {
    System.out.println("Method---ccc");
    }

    @Test(groups = { "group-b"} ,priority = 3)
    public void bbbMethod() {
    System.out.println("Method---bbb");
    }

    @Test(groups = { "group-b"},priority = 2 )
    public void dddMethod() {
    System.out.println("Method---ddd");
    }
    @Test(groups = {"zlr"} )
    public void zlrMethod() {
    System.out.println("Method---ddd");
    }
    @Test(groups = { "group-a" },priority = 3)
    public void aaaMethod() {
    System.out.println("Method---aaa");
    }
    @Test(dependsOnMethods = {"aaaMethod" })
    public void method1() {
    System.out.println("zlr");
    }
    @Test(groups = { "init" },priority = 3)
    public void xMethod() {
    System.out.println("Method---aaa");
    }
    @Test(groups = { "group-c" },priority = 3)
    public void cMethod() {
    System.out.println("Method---c");
    }
    @Test(groups = { "init" },priority = 3)
    public void yMethod() {
    System.out.println("Method---aaa");
    }
    @Test(groups = { "ss" },dependsOnGroups = { "group-b","group-a" },alwaysRun=true)
    public void method3() {
    System.out.println("zlr");
    }
    @Test(dependsOnGroups = { "init" })
    public void method2() {
    System.out.println("zlr");
    }
    }
    一个是zlr2.java
    package zlr;

    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;

    /**
    * Created by zouleiran on 2018/6/22.
    */
    public class zlr2 {
    @Test(groups = { "functest", "checkintest" })
    public void testMethod1() {
    System.err.println("groups = { functest, checkintest }");
    }

    @Test(groups = { "functest", "checkintest" })
    public void testMethod2() {
    System.err.println("groups = { functest, checkintest }");
    }

    @Test(groups = { "functest" })
    public void testMethod3() {
    System.err.println("groups = { functest }");
    }
    @Parameters({"URL","PORT"})
    @Test(groups = { "checkintest" })
    public void testMethod4(String URL,String PORT) {
    System.err.println("groups = { checkintest }"+URL+PORT);
    }
    }
    首先说一下,如果要执行整个class的话,可以把xml写成上一篇博客那样的就可以正常使用了,那是以class为维度来执行,而testng也支持以group和method为维度来执行方法和代码

      一、针对第一个问题,testng声明了一个叫做group的东西,我们可以认为是一个组,这个组可以是查询组,可以使插入组,也可以是其他分组,下面使用zlr2那个java文件演示,在zlr2中我们看到有4个test类,每一个的后面都标记了 (groups = { "checkintest" })和(groups = { "functest" })可以认为,把所有test分为两个大组,一组是checkintest另一组是functest,一个test可以属于一个组或者多个group,比如上文中的testMethod4就是checkintest小组的方法,然后可以写下xml如下

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="Suite1" verbose="1" >
    <test name="Regression1">

    <groups>
    <run>
    <include name = "functest" />
    <exclude name="checkintest" />
    </run>
    </groups>
    <classes>
    <class name = "zlr.zlr2"/>
    </classes>
    </test>
    </suite>
    执行结果是


    可以看到与之前的差别是xml中多了
    <groups>
    <run>
    <include name = "functest" />
    <exclude name="checkintest" />
    </run>
    </groups>
    这两行的意思是,执行group为functest而不是checkintest的小组代码那么会执行,只属于functest的代码,即便是一个class同时属于两者也不会执行

      二、testng中存在可以设置优先度,使得代码按照优先度来执行,也可以使用xml的方式来控制执行顺序

    xml中可以说明执行的method,如果我们在xml中写出以下代码

    <suite name="Suite1"    verbose="1" >
    <test name="Regression1">

    <classes>
    <class name="zlr.zlr">
    <methods>
    <include name="aaaMethod" />
    <include name="bbbMethod" />
    </methods>
    </class>
    </classes>
    </test>
    </suite>
    代码会先执行aaaMethod在执行bbbMethod,反过来如果写作这样
    <include name="bbbMethod" />
    <include name="bbbMethod" />
    代码会先执行bbbMethod在执行aaaMethod,用以实现对代码的控制

    另一方面,在代码中也可以以@Test(priority = 3)的方式来说明优先度,比如一个方法priority = 2,另一个priority = 3,那么如果在xml中都需要执行,也会先执行priority = 2的高优先度的方法(如果没有声名优先度,视为优先度最低,即先执行有优先度的方法),比如在xml中写上如下代码

    <suite name="Suite1"    verbose="1" >
    <test name="Regression1">

    <classes>
    <class name="zlr.zlr">
    <methods>
    <include name="aaaMethod" />
    <include name="dddMethod" />
    </methods>
    </class>
    </classes>
    </test>
    </suite>代码会先执行dddMethod

    三、testng存在一个依赖函数的方式来让代码执行,方式就是

    @Test(groups = { "ss" },dependsOnGroups  = { "group-b","group-a" })这样在test中加上参数,这是说本方法会依赖于另外的Groups a和b来执行,在实际执行中会先执行a再执行b,然后都成功了之后在执行本方法
    依赖还可以依赖于method为维度的,那样的话dependsOnGroups需要写作dependsOnMethods
    说实话在实际运用中这个使用率并不高,由于有before和更前面的beforeclass,甚至说可以把某一个方法写到代码里面,所以依赖的事情并不长用到,下面是实例的xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
    <suite name="Suite1" verbose="1" >
    <test name="Regression1">

    <groups>
    <run>
    <include name = "ss" />
    </run>
    </groups>
    <classes>
    <class name = "zlr.zlr"/>
    </classes>
    </test>
    </suite>

    四、这一点是我觉得testng非常赞的一点~~~真心棒,testng存在一种方式,使得用户可以在testng的xml文件中声名变量并直接传入代码中,不过也有弊端,如果忘记传了,,,代码会直接忽略这个方法

      具体的是这样

    @Parameters({"URL","PORT"})
    @Test(groups = { "checkintest" })
    public void testMethod4(String URL,String PORT) {
    System.err.println("groups = { checkintest }"+URL+PORT);
    }
    在test方法前声名多个变量,在方法中可以作为参数传进来并使用它们,然后在xml中传进来,xml如下
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
    <suite name="suite1">
    <test name="test1">
    <!--parameter标签中写要传入的参数 -->
    <parameter name="URL" value="https://www.baidu.com"></parameter>
    <parameter name="PORT" value="443"></parameter>
    <groups>
    <run>
    <include name = "checkintest" />
                </run>
    </groups>
    <classes>
    <class name="zlr.zlr2" />
    </classes>
    </test>
    </suite>
    运行结果如图


    可以看到代码中的url和port确实已经传进来了,如果在xml中不传的话代码会说因为没有传这两个参数,导致这个方法不运行,以忽略来处理

  • 相关阅读:
    idea删除module
    使用腾讯云mysql的一下小坑
    docker 从 tomcat 容器连接到 mysql 容器
    数据结构开发(16):选择排序和插入排序
    数据结构开发(15):递归的思想与应用
    数据结构开发(14):KMP 子串查找算法
    数据结构开发(13):字符串类的创建
    数据结构开发(11):双向循环链表的实现
    数据结构开发(10):Linux内核链表
    数据结构开发(9):循环链表与双向链表
  • 原文地址:https://www.cnblogs.com/xuezhezlr/p/9227429.html
Copyright © 2011-2022 走看看