2

私のテストには多くの共通ロジックがあるため、拡張して共有することにしました。私は 2 つのクラスを書きましTestNumberOneTestBase

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 テスト クラス全体を実行します (テスト メソッドが 1 つしかない場合でも) -> 出力は正しい順序である必要があります
  • テスト リストの anyTest メソッドをクリックし、次に TestNumberOne でクリックします -> 出力の順序が正しくありません

(また、スリープ状態で実行すると、出力は正しい順序であることがわかりますが、テストが終了すると並べ替えられます)

したがって、それらは正しい順序で実行され、出力が台無しになるだけです。

于 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

テストを実行すると、TestBaseも独自のjunitテストとして実行されていると思います。代わりにHelperBaseと呼んでみてください。

于 2013-03-05T15:19:28.020 に答える
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 に答える