回答:
わかりました。パターンに気付いたので、わかったと思います(間違っている場合は修正してください)。失敗とは、テストケースが失敗したときのことです。つまり、アサーションが正しくありません。エラーは、実際にテストを実行しようとしたときに発生する予期しないエラーです-例外など。
@Test
withで注釈を付ける必要がありexpected = SomeException.class
ます。
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は失敗のみとして単純化します。
次のリンクは、より興味深い入力を提供します。
「JUnitを使用した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のインスタンスである場合、エラー数は増加します。それ以外の場合(任意のThrowable)は、失敗としてカウントされます。
失敗は、JUnitアサーションメソッドによってスローされたAssertionErrorsから、AssertionErrorをスローすることによって、または @Test
アノテーションで、エラーは他の予期しない例外から間違いあり。しかし、それらの間には重要な違いがあります:
失敗とは、テストが正しく実行され、コードの欠陥を特定したことを意味します。
エラーはコードのバグを意味する可能性がありますが、テストさえしていませんでした。また、バグがテスト自体に含まれている可能性もあります。
要するに、失敗は、テストされているコードを書き直す必要があることを意味します。エラーは、書き換えが必要なのが単体テストである可能性があることを意味します。NullPointerException
あなたがテストしていなかった欠陥を検出したので、あなたのコードに失敗があったとしても、これはこれを意味するかもしれません、それでそれをテストすることは賢明かもしれません。
皮肉なことに、junitと他のテスト関連フレームワーク(testng、hamcrest)は、状態とそれが失敗したかどうかを検証するアサート操作を提供しますし、「アンダーフード」にjava.lang.AssertionErrorがところででjava.lang.Errorを延びる、スローされています。
しかし、それはもちろん、完全に有効な上記の回答と矛盾しません。したがって、特定のテストフローを失敗としてマークするためにAssertionErrorをスローできますが、専用のfail()APIを使用する方が適切であるため、対応するマニュアルに実際に記載されているかどうかはわかりません。その他の種類のThrowableは、エラーではなくエラーと見なされます。
java.lang.AssertionError
がスローされた場合は、テストエラーではなくテストエラーとして表示されます。正解なので、自分の答えを受け入れることを検討してください。