`
godandghost
  • 浏览: 33340 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

[Junit] 测试方法执行顺序

阅读更多
引用自:http://www.cnblogs.com/lukehuang/p/3284766.html,以作备忘。谢谢原作者的知识分享。

Brief

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

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

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

当没有指定任何顺序时,按默认来执行。

Sorters

1. MethodSorters.DEFAULT
默认顺序由方法名hashcode值来决定,如果hash值大小一致,则按名字的字典顺序确定。

由于hashcode的生成和操作系统相关(以native修饰),所以对于不同操作系统,可能会出现不一样的执行顺序,在某一操作系统上,多次执行的顺序不变。

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)
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.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
test001Second
test003Second


2. NAME_ASCENDING

结果始终为:
test001Second
test002Second
test003Second


3. JVM

多数情况下 结果为:
test002Second
test001Second
test003Second

偶尔出现:
test001Second
test003Second
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;
}


三种执行顺序的定义如下:
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测试方法的执行顺序也不是确定的。
分享到:
评论

相关推荐

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

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

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

    JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有(下列注解标示了单元测试的不同运行阶段执行的代码): @BeforeClass 全局只会执行一次,而且是第一个运行 @Before 在测试方法运行之前运行(每个测试...

    MyBatis 需要注意的地方junit注解

    @FixMethodOrder 指定测试方法的执行顺序 @ContextConfiguration 参数locations="classpath:spring-mybatis.xml" 指向src下的该文件 执行顺序: @BeforeClass---@Before---@Test---@After---@Before ---@Test---@...

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

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

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

    执行顺序受测试用例名称的限制。 用户很难控制执行顺序。 要求: 提供分组测试功能; 提供功能使运行特定的测试套件更加容易; 提供功能来更容易地定义执行顺序。 安装 您可以通过在项目目录中运行以下命令来...

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

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

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

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

    apiCrawler:接口框架

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

    突破程序员基本功的16课.part2

    16.3 系统测试和自动化测试 16.3.1 系统测试概述 16.3.2 自动化测试 16.3.3 常见自动化测试工具 16.4 性能测试 16.4.1 性能测试概述 16.4.2 性能测试的相关概念 16.4.3 常见性能测试工具 16.5 小结

    编码

    它为测试执行和报告提供了一个框架,使测试开发人员可以使用他们更喜欢的任何工具进行实际测试。 我们遵循由JUnit建立的用于断言和匹配的模式。命令行选项该组件支持多个参数,所有参数都是可选的。 他们是: itest...

    校内API开发. pdf

    为了使测试更容易极端编程思路方法创立人Kent Beck创建了种简单称为JUnit框架使人们可以用Java编写测试 用例作为.NET“工厂”你可以运用同等公开资源NUnit(见资源)它是建立在JUnit最初观念上你可以把它同 Visual ...

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

    您可以将单元测试视为我们编写的小程序,用于验证类中的方法是否执行我们期望它们执行的操作。 TDD 循环 以下顺序以本书为准. 此过程的基本步骤如下所示: 编写一个小的失败单元测试 以最简单的方式使这个新测试通过...

    2014-Group-17:Zephyr 管理,OOP 课程项目

    17 组UML: 类图:每个类对应一个与应用程序交互的用户。 所有这些用户都需要登录才能执行分配给他们的相应职责。 因此他们使用登录类。...Junit 测试: 测试包含代码应实现的每个功能的测试方法。 因为

    resource-ordering

    资源排序 运行 ./gradlew cleanTest 测试... 在 java 命令上发送的用于执行测试的类路径的顺序不正确: 构建/类/测试 构建/类/主要 构建/资源/主要 构建/资源/测试 因此输出为: Test run read: FROM MAIN RESOURCES

    Spring.3.x企业应用开发实战(完整版).part2

    7.6.3 增强织入的顺序 7.6.4 访问连接点信息 7.6.5 绑定连接点方法入参 7.6.6 绑定代理对象 7.6.7 绑定类注解对象 7.6.8 绑定返回值 7.6.9 绑定抛出的异常 7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 ...

    Spring3.x企业应用开发实战(完整版) part1

    7.6.3 增强织入的顺序 7.6.4 访问连接点信息 7.6.5 绑定连接点方法入参 7.6.6 绑定代理对象 7.6.7 绑定类注解对象 7.6.8 绑定返回值 7.6.9 绑定抛出的异常 7.7 基于Schema配置切面 7.7.1 一个简单切面的配置 7.7.2 ...

    TDDIntro-master

    单元测试您可以将单元测试视为我们编写的小程序,用于验证类中的方法是否执行我们期望它们执行的操作。TDD 循环以下顺序基于《》一书。 此过程的基本步骤如下所示: 编写一个小的失败单元测试以最简单的方式使这个新...

    java笔试题重复字符串-TWU101-TDDIntro:TWU101-TDD介绍

    您可以将单元测试视为我们编写的小程序,用于验证类中的方法是否执行我们期望它们执行的操作。 TDD 循环 以下顺序以本书为准. 此过程的基本步骤如下所示: 编写一个小的失败单元测试 以最简单的方式使这个新测试通过...

    JAVA程序开发大全---上半部分

    5.4.2 JUnit测试套件 75 5.5 JUnit应用实例:数据库程序单元测试 77 5.6 本章小结 80 第6章 Java Web应用程序的开发 81 6.1 Java Web应用程序概述 81 6.2 Tomcat服务器的安装和配置 82 6.2.1 Tomcat服务器的下载 82 ...

Global site tag (gtag.js) - Google Analytics