大規模なコードベースでJUnitテストを実行していますが、「エラー」が発生する場合と「失敗」が発生する場合があることに気付きました。違いは何ですか?
わかりました、パターンに気付いたばかりで、それを見つけたと思います(間違っていたら修正してください)。失敗は、テストケースが失敗したとき、つまりアサーションが間違っているときのように思えます。エラーは、実際にテストを実行しようとしたときに発生する予期しないエラーです-例外など。
テストが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は障害のみを単純化します。
次のリンクは、より興味深い入力を提供します。
「Java 8」での実用的なユニットテスト」から:
JUnitのアサーション(またはアサート)は、テストにドロップする静的メソッド呼び出しです。各アサーションは、ある条件が当てはまることを検証する機会です。アサートされた条件が当てはまらない場合、テストはそこで停止します。 JUnitはテストの失敗を報告します。
(JUnitがテストを実行すると、例外がスローされてキャッチされない可能性があります。この場合、JUnitはテストエラーを報告します。)
テストエラーとテストエラーをスローする行をコメントしました。
@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は、例外を取得するたびにテストエラーを表示し、期待される結果値が実際の値と一致しない場合にテストエラーを表示します
ソースクラス: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のインスタンスである場合、エラーカウントは増加します。それ以外の場合、(スロー可能)は失敗としてカウントされます。
間違いは、JUnitアサーションメソッドによってスローされたAssertionErrorsから、またはAssertionErrorをスローして、@ Testアノテーションで宣言した例外をスローして、エラーが他の予期しない例外から発生するのは当然です。しかし、それらの間には重要な違いがあります。
失敗とは、テストが正しく実行され、コードの欠陥が特定されたことを意味します。
エラーはコードのバグを意味する可能性がありますが、テストすらしていませんでした。バグがテスト自体にあることを意味する場合もあります。
つまり、失敗とは、テスト中のコードを書き直す必要があることを意味します。エラーは、書き換えが必要な単体テストである可能性があることを意味します。 NullPointerExceptionなどのコードに障害があったとしても、テストしていなかった欠陥を検出したため、これを意味する場合があります。そのため、テストするのが賢明かもしれません。