2

我的测试有很多共同的逻辑,所以我决定通过扩展来分享它。我写了两个类:TestNumberOnewhich extends TestBase.

TestBase.java

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;

/**
 * @author Pavel
 * @since 2013-03-03
 */
public class TestBase {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("beforeClass() in TestBase");
        System.out.flush();
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("afterClass() in TestBase");
        System.out.flush();
    }

    @Before
    public void before() {
        System.out.println("before() in TestBase");
        System.out.flush();
    }

    @After
    public void after() {
        System.out.println("after() in TestBase");
        System.out.flush();
    }
}

TestNumberOne.java

import org.junit.*;

/**
 * @author Pavel
 * @since 2013-03-03
 */
public class TestNumberOne extends TestBase {

    @Test
    public void anyTest() {
        System.out.println("anyTest() in TestNumberOne");
        System.out.flush();
    }
}

当我执行测试时,我得到了如此奇怪的输出:

before() in TestBase
anyTest() in TestNumberOne
after() in TestBase
beforeClass() in TestBase
afterClass() in TestBase

为什么它有如此奇怪的顺序?是否有任何扩展 JUnit 测试类的约定?

更新:

  1. 测试在 IDEA 中运行
  2. 为了得到如此奇怪的结果,我已经运行了几次(其他结果符合预期)
4

4 回答 4

2

这绝对是一个 IntelliJ IDEA 问题。

如果我通过 maven 运行您的代码,它运行正常;如果我在 IntelliJ 中运行它几次,那么我有时会像你一样得到不正确的输出。

实际上,我找到了一种重现它的方法:

  • 在每条输出消息后添加 Thread.sleep(1000)。
  • 在运行测试窗口中关闭“跟踪运行测试”(运行测试列表上方的蓝色圆圈)
  • 在 IntelliJ 中运行整个 TestNumberOne 测试类(即使您只有一种测试方法)-> 输出应该是正确的顺序
  • 单击测试列表中的 anyTest 方法,然后在 TestNumberOne -> output is in wrong order

(同样,如果您在睡眠状态下运行它,您会看到输出顺序正确,但在测试结束时会重新排序)

因此它们以正确的顺序运行,只有输出混乱。

于 2013-03-06T19:41:23.073 回答
1

当我尝试你的代码时,我得到了预期的输出,即

beforeClass() in TestBase
before() in TestBase
anyTest() in TestNumberOne
after() in TestBase
afterClass() in TestBase

(与 Eclipse 一起启动)。这是惯例^^你的结果确实很奇怪......

于 2013-03-05T15:37:35.380 回答
0

不知道任何约定。在 junit 3 中,基类通常是抽象的。

以下似乎以合理的顺序出现(可能除了拆解)。

import org.junit.*;
public class BaseTestCase {
    public static String method() {
        return Thread.currentThread().getStackTrace()[2].getMethodName() + "()";
    }
    @BeforeClass public static void classSetupBaseClass() {
        System.out.println(method());
    }
    @AfterClass public static void classTeardownBaseClass() {
        System.out.println(method());
    }
    @Before public void setupBaseClass() {
        System.out.println(method());
    }
    @After public void teardownBaseClass() {
        System.out.println(method());
    }
    @Test public void aTestInBaseClass() {
        System.out.println(method());
    }
}


import static org.junit.Assert.*;
import org.junit.*;

public class  So15183669 extends BaseTestCase {
    @BeforeClass public static void classSetup() {
        System.out.println(method());
    }
    @AfterClass public static void classTeardown() {
        System.out.println(method());
    }
    @Before public void setup() {
        System.out.println(method());
    }
    @After public void teardown() {
        System.out.println(method());
    }
    @Test public void aTest() {
        System.out.println(method());
    }
}


classSetupBaseClass()
classSetup()
setupBaseClass()
setup()
aTest()
teardown()
teardownBaseClass()
setupBaseClass()
setup()
aTestInBaseClass()
teardown()
teardownBaseClass()
classTeardown()
classTeardownBaseClass()
于 2013-03-03T08:40:28.560 回答
0

我认为当您运行测试时,您的 TestBase 也作为它自己的 junit 测试运行。尝试将其命名为 HelperBase。

于 2013-03-05T15:19:28.020 回答