`

junit之测试顺序

 
阅读更多
参考:http://www.cnblogs.com/lukehuang/archive/2013/08/27.html

Brief
Junit 4.11里增加了指定测试方法执行顺序的特性

测试类的执行顺序可通过对测试类添加注解 “@FixMethodOrder(value)” 来指定,其中value 为执行顺序

三种执行顺序可供选择:默认(MethodSorters.DEFAULT),按方法名(MethodSorters.NAME_ASCENDING)和JVM(MethodSorters.JVM)

当没有指定任何顺序时,按默认来执行
Sorters
1. MethodSorters.DEFAULT
默认顺序由方法名hashcode值来决定,如果hash值大小一致,则按名字的字典顺序确定
由于hashcode的生成和操作系统相关(以native修饰),所以对于不同操作系统,可能会出现不一样的执行顺序,在某一操作系统上,多次执行的顺序不变
实现代码:

复制代码
/**
     * DEFAULT sort order
     */
    public static Comparator<Method> DEFAULT = new Comparator<Method>() {
        public int compare(Method m1, Method m2) {
            int i1 = m1.getName().hashCode();
            int i2 = m2.getName().hashCode();
            if (i1 != i2) {
                return i1 < i2 ? -1 : 1;
            }
            return NAME_ASCENDING.compare(m1, m2);
        }
    };
复制代码
2. MethodSorters.NAME_ASCENDING (推荐)
按方法名称的进行排序,由于是按字符的字典顺序,所以以这种方式指定执行顺序会始终保持一致;
不过这种方式需要对测试方法有一定的命名规则,如 测试方法均以testNNN开头(NNN表示测试方法序列号 001-999)

复制代码
  /**
     * Method name ascending lexicographic sort order, with {@link Method#toString()} as a tiebreaker
     */
    public static Comparator<Method> NAME_ASCENDING = new Comparator<Method>() {
        public int compare(Method m1, Method m2) {
            final int comparison = m1.getName().compareTo(m2.getName());
            if (comparison != 0) {
                return comparison;
            }
            return m1.toString().compareTo(m2.toString());
        }
    };
复制代码
3. MethodSorters.JVM
按JVM返回的方法名的顺序执行,此种方式下测试方法的执行顺序是不可预测的,即每次运行的顺序可能都不一样(JDK7里尤其如此).
Samples
以下是对Win7 - JDK7 - Junit4.11 的执行结果

复制代码
//@FixMethodOrder(MethodSorters.DEFAULT)
//@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@FixMethodOrder(MethodSorters.JVM)
public class TestJunitOrder {

    @Test   
    public void test003Third() {       
       
        System.out.println("test003Third");
    }
   
    @Test   
    public void test001First() {       
       
        System.out.println("test001First");
    }
   
    @Test   
    public void test002Second() {       
       
        System.out.println("test002Second");
    }
}
复制代码
1. DEFAULT
结果始终为:
test002Second
test001First
test003Third

2. NAME_ASCENDING
结果始终为:
test001First
test002Second
test003Third

3. JVM
多数情况下 结果为:
test002Second
test001First
test003Third
偶尔出现:
test001First
test003Third
test002Second
Dig more ..
实际上 Junit里是通过反射机制得到某个Junit里的所有测试方法,并生成一个方法的数组,然后依次执行数组里的这些测试方法;
而当用annotation指定了执行顺序,Junit在得到测试方法的数组后,会根据指定的顺序对数组里的方法进行排序;

复制代码
  public static Method[] getDeclaredMethods(Class<?> clazz) {
        Comparator<Method> comparator = getSorter(clazz.getAnnotation(FixMethodOrder.class));//获取测试类指定的执行顺序

        Method[] methods = clazz.getDeclaredMethods();
        if (comparator != null) {
            Arrays.sort(methods, comparator);//根据指定顺序排序
        }

        return methods;
    }
复制代码
三种执行顺序的定义如下:

复制代码
/**
     * Sorts the test methods by the method name, in lexicographic order,
     * with {@link Method#toString()} used as a tiebreaker
     */
    NAME_ASCENDING(MethodSorter.NAME_ASCENDING),

    /**
     * Leaves the test methods in the order returned by the JVM.
     * Note that the order from the JVM may vary from run to run
     */
    JVM(null),

    /**
     * Sorts the test methods in a deterministic, but not predictable, order
     */
    DEFAULT(MethodSorter.DEFAULT);
复制代码
由上可以看出 当设置为MethodSorters.JVM时,其并没有提供一个Comparator的实现,所以执行方法的顺序实际上就是 clazz.getDeclaredMethods();得到的数组里方法的顺序,而由于java里对getDeclaredMethods返回的方法没有指定任何顺序,所以最终导致Junit测试方法的执行顺序也不是确定的


---------------------------------------------------------------------
例子:
 
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTestCasesExecution {
	@Test
	public void test001First() {
		System.out.println("Executing first test");
		
	}

	@Test
	public void test002Second() {
	
		System.out.println("Executing second test");
	}

	@Test
	public void test003Third() {
		System.out.println("Executing third test");
	}
}


输出:
  Executing first test
Executing second test
Executing third test

 
分享到:
评论

相关推荐

    junit-4.13.2的压缩包,JUnit是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试

    JUnit是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试。JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有(下列注解标示了单元测试的不同运行阶段执行的代码): @BeforeClass 全局只会...

    android不用另建工程进行单元测试及改变测试方法执行顺序示例代码

    android不用另建工程进行单元测试及改变测试方法执行顺序示例代码

    COMP1206-DAGSort-JUnit-Test:创建了一个JUnit测试来测试有效的DAG图排序算法

    创建了一个JUnit测试来测试有效的DAG图排序算法。 可以使用以下命令运行: java -cp .:junit.jar:hamcrest-core.jar org.junit.runner.JUnitCore DAGSortTest 这不会测试特定的输出,而是测试符合拓扑顺序的一般...

    junitbench:用于基准测试和性能测试的 JUnit 4.x 扩展

    JUnitBench 已经在使用 4.x 进行测试? 添加性能测试从未如此简单。 JUnitBench 是一组 JUnit 4.x 扩展,用于基准测试...JUnit 4.x 可插拔架构,具有顺序和多线程支持。 绩效指标目标格式: 逗号分隔值 (CSV) 文件格

    MyBatis 需要注意的地方junit注解

    @RunWith 指定测试类使用的某个运行器参数SpringJUnit4ClassRunner.class @Parameters 指定参数类的参数数据集合 @Rule 允许灵活添加或重新定义测试类中的每个测试方法的行为 @FixMethodOrder 指定测试方法的执行...

    JUnit4和Guice测试库Acai.zip

    主要特性:注入测试需要的助手类启动测试需要的任意的服务 运行测试之间的服务清理按照正确顺序启动多个服务 创建测试作用域绑定Acai 主要针对的是应用大型功能测试。安装  &lt;groupId&gt;com.google.acai&lt;/groupId&gt; ...

    junco-provider:一个Surefire提供者,可以执行JUnit测试并明智地获取coverage信息测试用例

    Junco(JUN-int + CO-verage)是Surefire提供程序,它执行JUnit测试用例并使用Jacoco计算每个测试用例的覆盖率。 Junco只需连接到Jacoco代理,转储当前的覆盖率信息并重置命中计数器。 每次执行一个测试用例时都要...

    acai:JUnit4和Guice的测试库

    Acai使它变得简单: 将所需的帮助程序类注入测试启动测试所需的任何服务测试这些服务之间进行测试以正确的顺序启动多个服务以进行测试创建测试范围的绑定Acai专为应用程序的大型功能测试而设计。 例如,它可以帮助...

    循环队列测试类

    与Queue对应的测试类,应用的junit3标准。实现了队列那六项的测试。

    JUnit-UT-and-TDD

    本系列练习和作业在 Java unsing Junit 中实现了社交网络应用程序的帐户相关 API。 API 由SocialNetwork类提供给用户。 业务逻辑主要在代表与用户或成员相关联的信息的较低级别类中: Account 。 您将修改和扩展此...

    TestNG测试框架(Author: Coast)

    TestNG是一个开源的自动化测试框架,它受JUnit框架启发而实现的,TestNG可以让开发者和测试者能够通过简单的注解、分组、指定顺序、参数化就可以编写更加灵活、更加强大的测试用例。 TestNG可以跟web自动化框架...

    开源单元测试工具汇总

    授权协议:Apache开发语言:Java操作系统:跨平台NoSQLUnit详细介绍NoSQLUnit是一个JUnit的扩展,用来为那些使用了NoSQL后端的应用提供单元测试和集成测试的工具。使用示例:/授权协议:Apache开发语言:JavaScript操作...

    JSON对比工具介绍(含单元测试对比,接口API响应对比【忽略指定噪声字段key】)

    1,对于单元测试对比JSON,可使用文档中第一个工具集。 2,对于API响应JSON数据,需要对比时使用文档中第二个工具集,可以指定忽略噪声字段,比较强大。 不废话:https://github.com/kvnxiao/jsonequals 使用至今,...

    jasmine-group:茉莉花测试分组插件

    与JUnit(@Category)和PHPUnit(@group)不同,Jasmine JavaScript单元测试不支持分组测试。 用户必须手动设置fdescribe来专注于几个相关的测试用例。 执行顺序受测试用例名称的限制。 用户很难控制执行顺序。 ...

    Emcee是一种工具,可在许多Mac上使用多个模拟器并行运行iOS测试-Swift开发

    欢迎来到Emcee项目,这是在本地和许多Mac上并行运行...它管理测试执行的顺序,模拟器,并与正在运行的测试一起维护队列。 它可以生成Junit和跟踪报告,以使您了解测试运行在不同计算机上的表现。 使用Emcee最新文档是

    Emcee:Emcee是一种工具,可在许多Mac上使用多个模拟器并行运行iOS测试

    共享队列管理测试执行的顺序。 司仪工作人员自动执行测试并维护其模拟器的生命周期。 Emcee可以生成Junit和跟踪报告,以使您了解不同计算机上的测试运行情况。 使用司仪 最新文档可在。 特征 使用简单的JSON文件...

    Spring4快速学习步骤

    本章学习目标  Spring 框架简介  SpringIOC 的概念和作用  工厂模式设计一个简单的IOC 容器  SpringIOC 的XML 方式HelloWorld  SpringIOC 的XML 方式创建对象配置细节 ... Spring 整合Junit 简化测试类编写

    apiCrawler:接口框架

    apiCrawler ...测试用例集(TestStepModel)的测试步骤序列是测试步骤(TestStep)的有序集合,测试步骤有顺序或依赖关系。 测试用例集(TestStepModel)之间是无序,形成测试场景,在ApiTest中使用Junit5

    WikiTestSelenium

    数据驱动的测试使用SQLite作为数据源,并使用JUnit 4功能进行参数化测试。 我使用的IDE是Eclipse。 一些有用的功能:数据驱动的测试使用SQLite数据库和Java 1.8的try-as-a-resource功能来关闭文件。 SQLite数据库...

    java有难度的笔试题-TDDIntro:TDD介绍

    JUnit、Mockito 和 IntelliJ 在 Java 中进行测试驱动开发 (TDD) 的基础知识。 我们假设我们不需要说服您为什么要进行 TDD,我们只会稍微触及 TDD 的原则。 相反,我们将专注于内容和方式。 什么是TDD? TDD 是在实现...

Global site tag (gtag.js) - Google Analytics