JUnitの失敗とエラーの違いは何ですか?


93

私は大規模なコードベースでJUnitテストを実行していますが、「エラー」が表示されることもあれば、「エラー」が表示されることもあります。違いは何ですか?

回答:


116

わかりました。パターンに気付いたので、わかったと思います(間違っている場合は修正してください)。失敗とは、テストケースが失敗したときのことです。つまり、アサーションが正しくありません。エラーは、実際にテストを実行しようとしたときに発生する予期しないエラーです-例外など。


5
ただし、拡張java.lang.AssertionErrorがスローされた場合は、テストエラーではなくテストエラーとして表示されます。正解なので、自分の答えを受け入れることを検討してください。
ponzao 2010

はい、それがまさに違いです。そして実用的な観点からは、「違いはありません」-エラーや失敗が発生した場合は、修正する必要があります。したがって、JUnitで「失敗」と「エラー」を別々にカウントするのはおそらく間違いでした。JUnit 4は2つを組み合わせます(以下の回答で説明されています)。
ジェフグリッグ2013年

例外が予想される場合は、@Testwithで注釈を付ける必要がありexpected = SomeException.classます。
ダウンヒル

@JeffGrigg実用的な違いがあります。複数のテストケースで1つの動作に依存している場合でも、その動作をアサートするテストケースを1つだけ記述し、残りのすべてでキャッチされていない可能性が高いランタイム例外をスローできます。これは、実行するために特定の動作に依存しているにもかかわらず、残りのテストケースが別のテストケースをテストしていることを示しています。その動作が壊れると、1つのテストケースのみが失敗を報告し、残りはエラーを報告します。これから、多くのテストケースが合格しなかったとしても、修正すべきバグが1つしかないことがわかります。
RonJRH

org.junit.Assert.assertEquals()が失敗した場合、JUnit4 HTMLレポートでエラーと見なされます。これはあなたの発言(私が今まで気付いていた)と矛盾します。これにもっと光を当ててくれませんか?
クリシュノム

15

Junitのアサーションフレームワークを通じてバブルされない例外をテストがスローすると、エラーとして報告されます。たとえば、NullPointerまたはClassNotFound例外はエラーを報告します。

String s = null;
s.trim();

または、

try {

    // your code
} catch(Exception e) {
    // log the exception
    throw new MyException(e);
}

そうは言っても、以下は失敗を報告します:

Assert.fail("Failure here");

または、

Assert.assertEquals(1, 2);

あるいは:

throw new AssertionException(e);

使用しているJunitのバージョンによって異なります。JUnit 4は失敗とエラーを区別しますが、JUnit 4は失敗のみとして単純化します。

次のリンクは、より興味深い入力を提供します。

http://www.devx.com/Java/Article/31983/1763/page/2


これは正確ではありません。JUnit 4では、テストの失敗とエラーの違いはなくなっていません。テストしたところです。リンクされた記事は誤解を招くものでした。「JUnit 4はエラーを使用するだけで簡単になる」と述べましたが、jUnit.framework.AssertionFailedErrorを使用する必要がないように、JUnit 4がjava.lang.AssertionErrorをテストエラーに変換することを強調する必要があります。利点は、プロジェクトがJUnitにリンクしていなくても、プロダクションコードでテストアサーションの記述を開始できることです。テストエラーとテスト失敗の区別も非常に役立ち、削除すると後退します。
RonJRH

RonJRH、デフォルトのjunitレポートでエラーを確認できますか?
Neel

はいニール。試してみたところです。ここに画像をリンクする方法は正確にはわかりませんが、これは私のテストの結果を示しています。imagebucket.net
abpxucddkvn1

6

「JUnitを使用したJava 8の実用的なユニットテスト」から:

JUnitのアサーション(またはアサート)は、テストにドロップする静的メソッド呼び出しです。各アサーションは、いくつかの条件が真であることを確認する機会です。アサートされた条件が満たされない場合、テストはその場で停止し、JUnitはテストの失敗を報告します。

(JUnitがテストを実行すると、例外がスローされてキャッチされない可能性もあります。この場合、JUnitはテストエラーを報告します。)


5

以下のテストでは、テストエラーテストエラーの違いについて説明します。

テストエラーとテストエラーをスローする行にコメントしました。

    @Test
    public void testErrorVsTestFailure() {

        final String sampleString = null;

        assertEquals('j', sampleString.charAt(0) );
        //above line throws test error as you are trying to access charAt() method on null reference

        assertEquals(sampleString, "jacob");
        //above line throws Test failure as the actual value-a null , is not equal to expected value-string "jacob"
        }

したがって、Junitは、例外が発生するたびにテストエラーを表示し、期待される結果の値が実際の値と一致しない場合にテストの失敗を表示します。


2

ソースクラス:JUnitReportReporter.java

public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) {
//......

            for (ITestResult tr : (Set) entry.getValue()) {
                TestTag testTag = new TestTag();

                boolean isSuccess = tr.getStatus() == 1;
                if (!(isSuccess)) {
                    if (tr.getThrowable() instanceof AssertionError)
                        ++errors;
                    else {
                        ++failures;
                    }
                }
}

上記の方法で以下の行を見ることができるように

tr.getThrowable()instanceof AssertionError

AssertionErrorのインスタンスである場合、エラー数は増加します。それ以外の場合(任意のThrowable)は、失敗としてカウントされます。


1

失敗は、JUnitアサーションメソッドによってスローされたAssertionErrorsから、AssertionErrorをスローすることによって、または @Testアノテーションで、エラーは他の予期しない例外から間違いあり。しかし、それらの間には重要な違いがあります:

失敗とは、テストが正しく実行され、コードの欠陥を特定したことを意味します。

エラーはコードのバグを意味する可能性がありますが、テストさえしていませんでした。また、バグがテスト自体に含まれている可能性もあります。

要するに、失敗は、テストされているコードを書き直す必要があることを意味します。エラーは、書き換えが必要なのが単体テストである可能性があることを意味します。NullPointerExceptionあなたがテストしていなかった欠陥を検出したので、あなたのコードに失敗があったとしても、これはこれを意味するかもしれません、それでそれをテストすることは賢明かもしれません。


0

皮肉なことに、junitと他のテスト関連フレームワーク(testng、hamcrest)は、状態とそれが失敗したかどうかを検証するアサート操作を提供しますし、「アンダーフード」にjava.lang.AssertionErrorがところででjava.lang.Errorを延びる、スローされています。

しかし、それはもちろん、完全に有効な上記の回答と矛盾しません。したがって、特定のテストフローを失敗としてマークするためにAssertionErrorをスローできますが、専用のfail()APIを使用する方が適切であるため、対応するマニュアルに実際に記載されているかどうかはわかりません。その他の種類のThrowableは、エラーではなくエラーと見なされます。


0

基本的に、エラーとはアサーションが満たされていないことを指しエラーは異常なテストの実行が原因です。各IDEには、合格失敗エラーの色が異なるシンボリックアイコンがあると思いますテストのます。

詳細については、こちらを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.