0

私のテストケースでは、複数のアサーションを使用することが義務付けられています。問題は、1つのアサーションに失敗した場合、実行が停止することです。私はそのテストケースがアサーションの失敗に遭っても実行を続け、実行後にアサーションの失敗をすべて表示することを望みます。例えばJunit 4フレームワークを使用してセレンでassert文が失敗しても実行を継続します

:この例では、ここで

assertTrue("string on failure",condition1); 
assertTrue("string on failure",condition2); 
assertTrue("string on failure",condition3); 
assertTrue("string on failure",condition4); 
assertTrue("string on failure",condition5); 

私はアサートがCONDITION2のために失敗した場合、それは完全に実行した後、すべての障害を実行し、表示するために継続することを望みます。

答えて

1

あなたが探している機能は、ソフトアサーションと呼ばれ、assertj

SoftAssertions soft = new SoftAssertions(); 
    soft.assertThat(<things>).isEqualTo(<other_thing>); 
    soft.assertAll(); 

ソフトアサーションが失敗で例外がスローされることなく、次のステップに実行できるようになります試してみてください。最後にassertAll()メソッドをすべてスローし、oneceで収集したエラーを返します。

+0

しかしこれはJunitに当てはまります....私はこれがtestngのものだと思った –

+0

AssertJはJUnitを依存関係として持っています(https://mvnrepository.com/artifact/org.assertj/assertj-core/3.5.1)ので、うまくいくはずです例外を収集し、ただちにすべてを吐き出すだけです。そのコンセプトは、単なる単体テストのフレームワークや言語と結びついていません。実際、Pythonでのソフトアサーション(http://pythontesting.net/strategy/delayed-assert)の実装は、@jeremiahが提案したものとまったく同じです。 – pr4bh4sh

4

純粋なJUnitソリューションの場合は、ErrorCollector TestRuleを使用してアサーションを処理します。

ErrorCollectorテストの実行が完了するまで、ルールは報告しません。

あなたの具体的な例では
import org.hamcrest.core.IsEqual; 
import org.hamcrest.core.IsNull; 
import org.hamcrest.text.IsEmptyString; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.rules.ErrorCollector; 

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

    @Test 
    public void testMultiAssertFailure() { 
     collector.checkThat(true, IsEqual.equalTo(false)); 
     collector.checkThat("notEmpty", IsEmptyString.isEmptyString()); 
     collector.checkThat(new Object(), IsNull.nullValue()); 
     collector.checkThat(null, IsNull.notNullValue()); 

     try { 
      throw new RuntimeException("Exception"); 
     } catch (Exception ex){ 
      collector.addError(ex); 
     } 
    } 
} 

assertTrue("string on failure",condition1); 
assertTrue("string on failure",condition2); 
assertTrue("string on failure",condition3); 
assertTrue("string on failure",condition4); 
assertTrue("string on failure",condition5); 

は、ここで他のオプションは、多くの人々はとにかく常にやるべきことを言うことがベストプラクティスです

Matcher<Boolean> matchesTrue = IsEqual.equalTo(true); 
collector.checkThat("String on Failure", condition1, matchesTrue); 
collector.checkThat("String on Failure", condition2, matchesTrue); 
collector.checkThat("String on Failure", condition3, matchesTrue); 
collector.checkThat("String on Failure", condition4, matchesTrue); 
collector.checkThat("String on Failure", condition5, matchesTrue); 
0

になります:それぞれのテストケースにと1つだけをアサートしてください。

こうすることで、それぞれの潜在的な障害は、何らかの形で互いに分離されます。 JUnitはどのテストが失敗したか、そしてどのテストが成功したかを正確に伝えるため、探しているものを直接取得できます。他の概念を導入する必要はありません。

(あなたがErrorCollectorまたはSoftAssertionsのようなものを他の概念を使用するために、かなり簡単でまっすぐ進むされている場合でも、見る - 彼らはあなたのコードの複雑さを少し追加し、読んで理解することが少し難しくなります)

+1

* unit *テストでは、テストごとに1つのアサーションしか実行しないことをお勧めします。 Seleniumのようなツールを混在させることで、テストはもはや「ユニット」レベルのテストではなくなりました。なぜなら、実行中のシステムに対して実行する必要があるからです。これは「統合」テストです。テストの統合レベルでは、検証を分離するという欲求はしばしば価格(時間/パフォーマンス/フィードバック)でもたらされ、マルチアサート機能をより受け入れやすくします。それは、テストが向けられている状況に関するものです。私は単体テストに関してあなたの意見に同意しませんが、統制は不動ではありません(私の経験では) – Jeremiah

+0

ya ..私もそれについて考えました。しかし、小さなセクションのUIを確認するような多くの状況でログインページ)、複数のアサーションが意味を成します。また、上記のソリューションでは、複雑さの代わりに1行または2行のコードしか追加しません –

関連する問題