`
godandghost
  • 浏览: 34510 次
  • 性别: 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测试方法的执行顺序也不是确定的。
分享到:
评论

相关推荐

    自动饮料机Junit测试(软件测试与质量保证实验).rar

    1. **独立性**:每个测试用例应独立于其他用例,不依赖于测试执行的顺序。 2. **可重复性**:测试用例应该总是返回相同的结果,只要输入条件不变。 3. **覆盖率**:测试应尽可能覆盖所有代码路径,包括正常情况和...

    junit测试工具以及安装方法

    3. **固定顺序执行测试**:使用`@FixMethodOrder`和`@Test`的`order`参数可以指定测试执行顺序。 4. **参数化测试**:使用`@RunWith(Parameterized.class)`和`@Parameters`可以实现参数化的测试用例。 5. **假对象与...

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

    在Android开发中,单元测试是确保代码质量的重要环节。传统的单元测试往往需要创建单独的测试工程,这不仅增加了项目的复杂性,还...同时,控制测试执行顺序有助于我们更好地组织测试逻辑,确保测试的全面性和准确性。

    JUnit测试代码示例

    6. **测试运行器**:JUnit3默认的运行器会顺序执行所有的测试,如果有测试失败,它会立即停止执行剩余的测试。 下面是一个简单的JUnit3测试示例: ```java import junit.framework.*; public class MyTest ...

    JUnit_Test_Code.zip_JUnit_JUnit测试_junit测试脚本

    9. **测试固定顺序**:通过`@FixMethodOrder`注解和`MethodSorters`枚举,可以控制测试方法的执行顺序。 10. **Mockito集成**:JUnit常与Mockito框架结合使用,用于模拟复杂的依赖关系,确保测试的隔离性。 资源中...

    测试junit源代码

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

    junit4单元测试

    为了控制测试的执行顺序,JUnit4提供了`@FixMethodOrder`和`@Test(order = N)`注解,使得你可以按照指定的顺序执行测试方法。这在某些需要特定执行顺序的场景下很有帮助。 除了基本的测试功能,JUnit4还可以与其他...

    软件测试 Junit教程

    - **初始化:** 测试执行前,首先会运行`@BeforeClass`标注的方法,然后是`@Before`标注的方法。 - **执行测试:** 按照`@Test`标注的方法顺序执行。 - **清理:** 每个测试方法执行后,会运行`@After`标注的方法,...

    测试用例 junit

    4. **执行条件**:测试执行的前置条件和顺序。 5. **预期结果**:测试成功时应该得到的输出或系统状态。 6. **测试步骤**:详细的操作步骤,指导测试人员如何进行测试。 7. **测试脚本**:自动化测试中使用的代码...

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

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

    junit测试jar

    同时,`@FixMethodOrder`注解可以控制测试方法的执行顺序。 总的来说,JUnit是Java开发中的关键工具,它简化了单元测试的编写和执行,提高了代码质量,并且随着版本的更新,其功能不断完善,为开发者提供了更多的...

    junit测试JDBC错误源代码

    在这个“junit测试JDBC错误源代码”中,开发者遇到了一个困扰:预期在数据库中插入两条数据,但实际操作并未按预期执行。为了分析并解决这个问题,我们需要深入理解JDBC的操作流程以及JUnit如何用于测试这些操作。 ...

    测试工具Junit4.2.zip

    11. **TestNg兼容性**:JUnit 4.2在某些方面兼容TestNG的特性,比如使用`@Test`注解的`priority`属性设置测试执行顺序。 总的来说,Junit 4.2是一个强大的测试工具,通过其丰富的注解和API,开发者可以编写出结构...

    Java多线程Junit测试GroboUtils-5.zip

    1. **线程控制**:提供类或方法来启动、停止、等待或中断线程,以便在测试中精确控制多线程的执行顺序。 2. **同步辅助**:包含一些实用工具,帮助在测试中设置和解除锁,或者管理信号量,确保测试的可预测性。 3. *...

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

    它提供了丰富的注解(如@Test、@Before、@After等)来定义测试用例的结构和执行顺序。例如,`@Test`注解标记的方法表示这是一个待执行的测试用例,而`@Before`和`@After`则分别用于定义在每个测试用例之前和之后需要...

    Junit4.4 Junit3.8.1

    5. **固定运行顺序**:测试默认按定义的顺序运行,没有提供控制执行顺序的机制。 **JUnit 4.4** JUnit 4是一个重大改进,引入了许多新特性和增强,使得测试更加灵活和强大: 1. **注解的广泛使用**:除了`@Test`外...

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

    JUnit3 使用 `public void test*()` 形式的命名规则来识别测试方法,而在 JUnit4 中,引入了注解机制,测试方法可以通过 `@Test` 注解来标识,使得代码更清晰,可读性更强。 3. Junit4 深入学习 3.1. Fixture 的...

    Junit简介和扩展

    - **@FixMethodOrder**:控制测试方法的执行顺序。 #### JUnit4之@Rule扩展 - **@Rule之TestWatcher**:监控测试方法的状态变化。 - **@Rule之TestName**:记录每个测试方法的名称。 - **@Rule之ExternalResource*...

    Junit4 Test 单元测试

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

Global site tag (gtag.js) - Google Analytics