既然是讨论执行顺序问题,那么用例肯定是批量执行的,批量执行的方法有mvn test、直接运行testng.xml文件,其中直接运行testng.xml文件的效果与pom文件中配置执行testng.xml效果是一样,所以本次只讨论mvn test 批量运行方式

一、用例准备

1、 测试用例

编写一些测试用例,单纯为了测试,内容只进行输入,没有任何逻辑。

public class FirstTest {

   @Test
public void testFirst(){ System.err.println("first test");
}
}

2、pom文件配置

要使用mvn test方式批量运行用例,需要在pom文件中配置一下内容

       <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
</plugin>
</plugins>
</build>

二、执行顺序梳理

1、mvn test 默认顺序

如果pom文件只是进行了上步骤的配置,那么执行mvn test,用例是多线程无序执行的,如果要按顺序执行要配置为单线程,在<plugin>标签内增加如下配置

                               <configuration>
<forkCount>1</forkCount>
<reuseForks>false</reuseForks>
</configuration>

再次执行mvn test,我们会发现用例是单线程,按一定顺序执行的。但是是按照字母a-z的顺序执行的,其实这个排序对我们来说用处不大,我们写用例要求的是看名知意,不可能按照这个顺序来写。

2、priority 注解

testng提供了丰富的注解功能,priority标示用例执行的优先级,默认值为0,值越大优先级越低。比如:

public class FirstTest {

   @Test(priority = 2)
public void testFirst(){ System.err.println("first test");
}
}
public class SecondTest { @Test
public void testFirst(){ System.err.println("second test");
}
}
public class ThirdTest { @Test(priority = 1)
public void testFirst() { System.err.println("third test");
}
} 执行结果:
second test
third test
first test

该注解对同一个类的多个方法也是适用的,比如:

public class FirstTest {

   @Test(priority=2)
public void testFirst2(){ System.err.println("first test2");
} @Test(priority=3)
public void testFirst3(){ System.err.println("first test3");
} @Test(priority=1)
public void testFirst(){ System.err.println("first test");
}
} 执行结果:
first test
first test2
first test3

那么我们就会想如果每个类中都有多个方法,且优先级是不同的,那么执行顺序又是怎么样的?比如:

public class FirstTest {

   @Test(priority=2)
public void testFirst2(){ System.err.println("first test2");
} @Test
public void testFirst3(){ System.err.println("first test3");
} @Test(priority=1)
public void testFirst(){ System.err.println("first test1");
}
}
public class SecondTest { @Test
public void testFirst(){ System.err.println("second test");
}
} public class ThirdTest { @Test(priority = 1)
public void testFirst() { System.err.println("third test");
} @Test(priority = 2)
public void testFirst2() { System.err.println("third test 2");
}
} 运行结果:
first test3
second test
first test1
third test
first test2
third test 2

这种情况我们从结果可以看出并没有按照类的顺序执行,而是按照priority设置的等级高低,去执行的类。那么这个问题的原因是什么?有没有办法类按照顺序执行同时类中方法也按照顺序执行?这个问题我们放到后面讨论解决方法。

3、dependsOnGroups

public class FirstTest {
@Test(dependsOnGroups={"second"})
public void testFirst(){
System.err.println("first test");
}
} public class SecondTest { @Test(groups="second",dependsOnGroups={"third"})
public void testFirst(){ System.err.println("second test");
} public class ThirdTest { @Test(groups="third")
public void testFirst() { System.err.println("third test");
}
} 执行结果:
third test
second test
first test

同样该方法适用于类的方法,比如:

public class FirstTest {

	@Test(dependsOnGroups={"first"},groups="second")
public void testFirst2(){ System.err.println("first test2");
} @Test(groups="first")
public void testFirst3(){ System.err.println("first test3");
} @Test(dependsOnGroups={"second"})
public void testFirst(){ System.err.println("first test1");
}
}
执行结果:
first test3
first test2
first test1

4、dependsOnMethods

该方法只适用于同一个类的不同方法间,不能跨类适用。举例如:

public class Third10Test {

   @Test(dependsOnMethods = { "testFirst3" })
public void testFirst1() { System.err.println("third10 test1");
} @Test
public void testFirst2() { System.err.println("third10 test2");
}
@Test(dependsOnMethods = { "testFirst2" })
public void testFirst3() { System.err.println("third10 test3");
}
} 执行结果:
third10 test2
third10 test3
third10 test1

5、testng.xml

pom文件中在maven-surefire-plugin插件增加配置如下:

<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>

testng.xml作为testng的灵魂,提供了很强大的配置功能,其它使用方式可以自己百度。本问只讨论类型的执行顺序问题。tesng.xml配置如下:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1"  >
<test name="Nopackage">
<classes>
<class name="com.appiumforatk.SecondTest" />
<class name="com.appiumforatk.FirstTest" />
<class name="com.appiumforatk.ThirdTest" />
</classes>
</test>
</suite>

执行mvn test 结果如下:

Second test

first test

third test

从结果可以看出,默认是按照顺序执行。其实在suite和test标签分别有preserve-order控制各自子标签的执行顺序,该值默认true。

如果我们把该值设置为false,可以看到用例不再按照配置的顺序执行了。如下:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1"  >
<test name="Nopackage" preserve-order="false">
<classes >
<class name="com.appiumforatk.SecondTest" />
<class name="com.appiumforatk.FirstTest" />
<class name="com.appiumforatk.ThirdTest" />
</classes>
</test>
</suite>

执行mvn test命令,结果如下:

first test

Second test

third test

那么我们开始思考,如果testng.xml中设置了preserve-order= “true”,同时我们也设置了priority,那么执行顺序会怎么样?比如:我们只在SecondTest上加了priority=1,其它保持不变。

public class SecondTest {
@Test
public void testFirst(){ System.err.println("Second test");
} @Test(priority = 1)
public void testFirst1(){ System.err.println("Second test1");
}
}
public class ThirdTest { @Test
public void testFirst() { System.err.println("third test");
}
@Test(priority = 1)
public void testFirst1() { System.err.println("third test1");
}
}

mvn test执行结果如下:

Second test

first test

third test

Second test1

third test1

从结果可以看出同一priority优先级方法,按照配置的顺序执行。也即priority的优先级>preserve-order.那么我们回到2中的问题,原因是因为priority是在testng开始的时候全部加载进去,如果想实现按顺序执行完一个类的方法后,再执行另外一个类的方法,就要去改变方法的priority值,可以通过监听的方式实现。代码如下:

public class RePrioritizingListener implements IAnnotationTransformer {

   HashMap<Object, Integer> priorityMap = new HashMap<Object, Integer>();
Integer class_priorityCounter = 10000;
Integer max_testpriorityLength = 4; @Override
public void transform(ITestAnnotation annotation, Class testClass,
Constructor testConstructor, Method testMethod) { Class<?> declaringClass = testMethod.getDeclaringClass();
Integer test_priority = annotation.getPriority();
Integer current_ClassPriority = priorityMap.get(declaringClass);
// 如果类没有设置过优先级,则进行设置。
if (current_ClassPriority == null) {
current_ClassPriority = class_priorityCounter++;
priorityMap.put(declaringClass, current_ClassPriority);
} //获取类中方法的优先级,如果小于四位数则左侧补充0以达到四位数
String concatenatedPriority = test_priority.toString();
while (concatenatedPriority.length() < max_testpriorityLength) {
concatenatedPriority = "0" + concatenatedPriority;
} //把类的优先级和方法的优先级合并
concatenatedPriority = current_ClassPriority.toString()
+ concatenatedPriority; //重新设置方法的优先级
annotation.setPriority(Integer.parseInt(concatenatedPriority));
}
}

testng.xml配置如下:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite1" >
<test name="Nopackage" preserve-order="true">
<classes >
<class name="com.appiumforatk.SecondTest" />
<class name="com.appiumforatk.FirstTest" />
<class name="com.appiumforatk.ThirdTest" />
</classes>
</test> <listeners> //配置监听
<listener class-name="com.appiumforatk.RePrioritizingListener"/>
</listeners>
</suite>

mvn test执行命令结果如下:

Second test

Second test1

first test

third test

third test1

这个时候我们看到按照配置的顺序执行class并且class中的方法也是按照priority优先级执行的。

使用TestNG框架测试用例执行顺序问题的更多相关文章

  1. pytest(4)-测试用例执行顺序

    前言 上一篇文章我们讲了在pytest中测试用例的命名规则,那么在pytest中又是以怎样的顺序执行测试用例的呢? 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09 ...

  2. TestNG设置测试用例执行优先级

    @Test(priority = x)设置测试用例执行优先级.x默认为0,0的优先级最高,0>1>2>3... import org.testng.annotations.Test; ...

  3. python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

    简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...

  4. python之使用单元测试框架unittest执行自动化测试

    Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 单元测试框架即一堆工具的集合. 在说unittest ...

  5. pytest--配置用例执行顺序(pytest_ordering插件介绍)

    前言 设置测试用例执行顺序: 默认情况下,pytest测试用例的执行顺序是按先外层后内层(目录下的文 件),再根据名称按ascii码值的顺序升序执行. 如果想自定义pytest测试用例的执行顺序,可以 ...

  6. TestNG学习-002-annotaton 注解概述及其执行顺序

    此文主要讲述用 TestNG 基础的 annotation (注解)知识,及其执行的顺序,并通过一个 TestNG 简单的实例演示 annotation 的执行顺序. 希望能对初学 TestNG 测试 ...

  7. Python+selenium之unittest单元测试(3)关于测试用例执行的顺序

    一.测试用例执行的顺序 用例的执行顺序涉及多个层级,在多个测试目录的情况下,先执行哪个目录?在多个测试文件的情况下,先执行哪个文件?在多个测试类的情况下,先执行哪个测试类?,在多个测试方法(用例)的情 ...

  8. 14、testng.xml 设置用例执行顺序

    目录如下: TestGroup.java 代码如下: package com.testng.cn; import org.testng.annotations.*; import static org ...

  9. pytest框架-介绍、Mark(打标签)、命令运行用例、用例执行顺序、

    1.pytest介绍:基于unittest 之上的单元测试框架 1.1.自动发现测试模块和测试用例: unitest 需要添加用例,(泰斯特楼贷)加载器加载测试用例 pytest 只需要一条代码就可以 ...

随机推荐

  1. JavaScript运算符及语句

    ECMAScript 算术运算符 加,减,乘,除,-号可以表示负号 递增(++),递减(--) 两种写法:例:i++,i--,++i,--i,区别是运算符放在前面是先计算后输出,运算符放在后面先输出再 ...

  2. zencart后台订单详细页显示产品图片和链接

    方法一: 找到admin/order.php 大约491行 for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { 与 if (iss ...

  3. ui自动化之selenium操作(一)环境搭建

    1. python安装: 前面步骤可以看到,这里就不赘述了(我们在这里安装的是python3) 2. selenium安装: 前面我们都已经安装好pip了,所以这里咱们直接进入到python安装路径的 ...

  4. python修炼之路---面向对象

    面向对象编程 面向对象编程:使用类和对象实现一类功能. 类与对象 类:类就是一个模板,模板里可以包含多个函数,函数里实现一些功能. 对象:是根据模板创建的实例,通过实例对象可以执行类中的函数. 面向对 ...

  5. java集合源码分析几篇文章

    java集合源码解析https://blog.csdn.net/ns_code/article/category/2362915

  6. Redis数据类型之散列表

    Redis五大数据类型以及操作 目录: 一.redis的两种链接方式 二.redis的字符串操作(string) 三.redis的列表操作(list) 四.redis的散列表操作(类似于字典里面嵌套字 ...

  7. 《Head First 软件开发》阅读二

    项目计划:为成功而筹划 每段伟大的代码始于伟大的计划. 客户现在就要他们的软件,可是开发需要的时间远远超过客户要求时间.我们需要实际解决方法:由客户确定优先级,与客户一起确定优先级顺序,开发出Mile ...

  8. java获取访问者真实的IP地址

    众所周知java方法request.getremoteaddr()可以获得访问者的IP地址 但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了.如果使用了反向代理软件 ...

  9. typing 模块

    目录 typing模块 一.引言 二.typing模块的作用 三.使用typing模块 四.typing常用类型 typing模块 目录 一.引言 二.typing模块的作用 三.使用typing模块 ...

  10. awk-第一篇

    awk [单独的编程语言解释器] 1.awk介绍 全称:Aho Weinberger Kernaighan三个人的首字母缩写: 1970年第一次出现在Unix机器上,后来在开源领域使用它: 所以,我们 ...