0

JUnit テスト用に次のコードがあります。

import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
public class JUnitHelloWorld {
    protected String s;
    @Before
    public void setup() {
        s = "HELLO WORLD";
    }
    @Test
    public void testHelloWorldSuccess() {
        s = s.toLowerCase();
        assertEquals("hello world", s);
    }
    // will fail even if testHelloWorldSuccess is called first
    @Test
    public void testHelloWorldFail() {
        assertEquals("hello world", s);
    }
}

さて、コメントによると、最初のメソッドが最初に呼び出されたとしても、2 番目のメソッドが失敗するのはなぜですか? s の値を小文字に変更する最初の方法ではありませんか?

4

3 に答える 3

4

@Before各テストの前に発生します。これは、常にセットアップを実行してからテストを実行するため、それらを実行する順序は重要ではないことを意味します。

タグ@BeforeClassは、期待どおりの動作を提供します。これは、テストが開始される前に 1 回実行されます。

于 2012-06-21T04:15:19.353 に答える
1

JUnit は、コードの順序で各テスト ケース (@Test を使用したメソッド) を実行しません。そのため、各テスト ケースは互いに独立している必要があります。

また、@Before タグを使用したセットアップ メソッドは、各テスト メソッドの前に常に実行されます。

したがって、コードの実行順序は次のようになります (必ずしもそうとは限りません)。

  1. 設定()
  2. testHelloWorldSuccess()
  3. 設定()
  4. testHelloWorldFail()

ただし、次のように実行することもできます。

  1. 設定()
  2. testHelloWorldFail()
  3. 設定()
  4. testHelloWorldSuccess()
于 2012-06-21T04:18:28.387 に答える
0

JUnitの場合、テストケースの実行順序は固定されていません。メソッドm1の後にメソッドm2を記述し、実行中にm2が最初に実行される場合があります。最善のアプローチは、テストケースがテストケースの実行順序に基づいてはならないことです。クラス全体に対してのみ何かを1回実行する場合は、@BeforeClassを試してください。

上記のシナリオでは、これを試してください。

    protected String s;
    private int flag ;
       @BeforeClass
       public beforeClass(){
           flag = 0;
       }
        @Before
        public void setup() {
            s = "HELLO WORLD";

        }
        @Test
        public void testHelloWorldSuccess() {
        flag = 1;
            s = s.toLowerCase();
            assertEquals("hello world", s);
        }
        // won't fail even if testHelloWorldSuccess is called first
        @Test
        public void testHelloWorldFail() {
        if(flag == 1)
            assertEquals("hello world", s);
        else
        assertEquals("HELLO WORLD", s);
        }
于 2012-06-21T04:23:34.983 に答える