web-dev-qa-db-ja.com

アサートの1つが失敗した場合でも、junit4でのテスト実行の継続

テストケースのアサートの1つが失敗した場合でも実行を継続する機能を提供するJfuncを使用して既存のフレームワークを構築しています。 Jfuncはjunit 3.xフレームワークを使用します。しかし、現在junit4に移行しているため、Jfuncを使用できなくなり、junit 4.10 jarに置き換えました。
問題は、フレームワークでjfuncを広く使用しているためです。junit4では、テストケースでアサートの1つが失敗した場合でも、コードの実行を継続したいです。
誰もこれに対する提案/アイデアを持っていますか、私はjunitでテストをよりアトミックにする必要があることを知っています、つまりテストケースごとに1つアサートしますが、何らかの理由でフレームワークでそれを行うことはできません。

48
user85

ErrorCollector ルールを使用してこれを行うことができます。

使用するには、最初にルールをテストクラスのフィールドとして追加します。

_public class MyTest {
    @Rule
    public ErrorCollector collector = new ErrorCollector();

    //...tests...
}
_

次に、アサートをcollector.checkThat(...)の呼び出しに置き換えます。

例えば.

_@Test
public void myTest() {
    collector.checkThat("a", equalTo("b"));
    collector.checkThat(1, equalTo(2));
}
_
63
Chris B

ErrorCollectorも使用しますが、assertThatも使用し、try catchブロックに配置します。

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

@Rule
public ErrorCollector collector = new ErrorCollector();

@Test
public void calculatedValueShouldEqualExpected() {
    try {
        assertThat(calculatedValue(), is(expected));
    } catch (Throwable t) {
        collector.addError(t);
        // do something
    }
}
17
StatusQuo

assertj-soft assertion を使用することもできます

@Test
public void testCollectErrors(){
   SoftAssertions softly = new SoftAssertions();
   softly.assertThat(true).isFalse();
   softly.assertThat(false).isTrue();
   // Don't forget to call SoftAssertions global verification !
   softly.assertAll();
}

また、softly.assertAll()を手動で呼び出さずに使用する他の方法もあります。

  1. ルール付き
  2. 自動閉鎖可能
  3. 静的assertSoftlyメソッドを使用
3
marok

Try/finallyブロックを使用します。これは私の場合でうまくいきました:

...
try {
    assert(...)
} finally {
    // code to be executed after assert
}
...
2
Danut M

試行-キャッチ、「トライ」でアサーションを使用、「キャッチ」で可能性のあるエラーをコレクションに追加。その後、テストの最後にtearDown()で例外をスローします。したがって、アサートで失敗/エラーが発生した場合、キャッチされてテストが続行されます。 (例のコレクションは静的です。各@TestのsetUp()で新しいインスタンスを作成することもできます)

    public static List<String> errors = new ArrayList<>();


    try {
        //some assert...
    }
    catch (AssertionError error) {
        errors.add(error.toString());
    }



    @After
    public void tearDown() {

        try {
            if (!errors.isEmpty()) {
                throw new AssertionError(errors);
            }
        }
        finally {
            //empty list because it's static, alternatively make instance for each test in setUp()
            errors.clear();
        }
    }
0
Radek Sip