`

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测试(软件测试与质量保证实验).rar

    本实验“自动饮料机Junit测试”旨在帮助学生深入理解和应用单元测试,特别是在Java编程环境下。单元测试是一种针对程序代码最小可测试单元进行验证的方法,通常这个单元是函数或方法。Junit是Java领域广泛使用的单元...

    JUnit测试代码示例

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可执行的测试用例来验证代码的功能。在本文中,我们将深入探讨JUnit的核心概念、关键特性以及如何使用JUnit3进行测试。 首先,理解单元测试的概念...

    JUnit_Test_Code.zip_JUnit_JUnit测试_junit测试脚本

    本资源"JUnit_Test_Code.zip"包含了一份关于如何使用JUnit进行测试的实例,以及图文并茂的讲解,对于理解和实践JUnit测试脚本非常有帮助。 在Java开发中,单元测试是对软件中的最小可测试单元进行检查和验证的过程...

    junit4单元测试

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个压缩包文件包含了JUnit4的相关库,使得开发人员能够轻松地在他们的项目中引入单元测试功能。...

    junit测试工具以及安装方法

    本文将详细介绍JUnit测试工具及其安装方法。 **一、JUnit简介** JUnit是一个开源的、基于Java的测试框架,主要用于编写和运行可重复的单元测试。它的设计理念是使测试成为开发过程中的一个自然部分,通过自动化测试...

    测试junit源代码

    - **测试的顺序**:虽然JUnit测试默认无序执行,但可以通过`@FixMethodOrder`控制执行顺序。 7. **总结** JUnit作为Java单元测试的标准工具,其强大的功能和简洁的API使得测试工作变得高效。理解并熟练掌握JUnit...

    junit单元测试文档

    JUnit Vintage用于支持旧版本的JUnit测试运行。其TestEngine允许在JUnit 5平台上运行基于JUnit 3和JUnit 4的测试。这对于迁移旧代码库和维护向后兼容性非常重要。 JUnit 5要求运行时的Java版本为Java 8或更高。尽管...

    软件测试 Junit教程

    - **实验1JUnit单元测试基础.doc:** 这个文档可能详细介绍了如何编写第一个JUnit测试用例,包括基本的断言和测试方法的构造。 - **Junit源代码学习.pdf:** 这份PDF可能包含了对JUnit框架内部实现的深入分析,帮助...

    junit单环测试包括文档和jar文件

    综上所述,"junit单环测试包括文档和jar文件"意味着我们拥有JUnit测试框架的使用文档和库,可以进行详细的单元测试,包括可能涉及循环结构的复杂场景。通过理解和应用这些知识,我们可以更有效地测试和维护我们的...

    junit单元测试junit单元测试junit单元测试

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。单元测试是软件开发过程中的一个重要环节,它旨在对程序中的最小可测试单元——通常是单个...

    测试用例 junit

    随着软件的迭代和更新,测试用例也需要随之调整,以确保其始终与最新的功能和需求保持一致。此外,测试用例的详尽程度对测试工作量和时间安排有直接影响,合理的测试用例设计可以更好地规划测试周期。 在企业级软件...

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

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

    测试工具Junit4.2.zip

    JUnit是Java编程语言中最常用的单元测试框架之一,主要用于编写和执行可重复的、自动化测试用例,以确保代码的质量和功能正确性。Junit 4.2是该框架的一个特定版本,它带来了许多改进和特性,使得测试过程更加高效和...

    Junit4 Test 单元测试

    每个测试用例应尽可能地独立于其他用例,确保它们的执行顺序不会影响测试结果。例如: ```java import org.junit.*; public class MyTestClass { @Test public void testExample() { // 测试代码 assertEquals...

    junit5-samples,使用junit 5的示例应用程序集合。.zip

    JUnit 5是Java编程语言中最流行的单元测试框架之一,它为开发者提供了强大的测试能力,让代码质量得到了显著提升。这个名为"junit5-samples"的压缩包包含了一个使用JUnit 5的示例应用程序集合,旨在帮助开发者更好地...

    junit3.8jar以及源码以及测试案例详解.rar

    5. **固定测试顺序**:Junit 3.8默认按照方法名的字母顺序运行测试,但可通过`@FixMethodOrder`注解指定执行顺序。 6. **测试注解**:如`@Before`和`@After`分别表示在每个测试方法前和后执行的方法,`@BeforeClass...

    Junit4.4 Junit3.8.1

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可执行的测试用例来验证代码的功能。这里我们关注的是JUnit的两个不同版本:JUnit 4.4和JUnit 3.8.1。这两个版本在功能、设计和使用上都有所差异,...

    junit测试jar

    JUnit测试框架是Java编程语言中最常用的单元测试工具之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。标题中的"junit测试jar"指的是JUnit库的JAR文件,这些文件通常用于构建和执行Java应用程序的...

    junit工具使用JUnit 是针对 Java 语言的一个单元测试框架,它被认为是迄今为止所开发的最重要的第三方 Java 库。 它已经成为Java语言事实上的标准单元测试库。

    JUnit 是一个用于编写和运行可重复的、自动化的单元测试的 Java 框架。由 Erich Gamma 和 Kent Beck 开发,JUnit 已经成为 Java 开发者进行单元测试的标准工具。它提供了丰富的断言库,可以验证代码的行为是否符合...

Global site tag (gtag.js) - Google Analytics