JUnit testlerini büyük bir kod tabanında çalıştırıyorum ve bazen "Hatalar" aldığımı, diğer zamanlarda ise "Arızalar" aldığımı fark ediyorum. Fark ne?
Yanıtlar:
Tamam, bir model fark ettim ve anladığımı düşünüyorum (yanılıyorsam düzeltin). Bana öyle geliyor ki, başarısızlıklar test durumlarınızın başarısız olduğu zamandır - yani iddialarınız yanlış. Hatalar, testi gerçekten çalıştırmaya çalışırken ortaya çıkan beklenmedik hatalardır - istisnalar vb.
@Test
ile açıklama eklemelisiniz expected = SomeException.class
.
Testiniz, Junit'te Onay çerçevesi aracılığıyla ortaya çıkmayan bir istisna atarsa, hata olarak rapor edilir. Örneğin, bir NullPointer veya ClassNotFound istisnası bir hata bildirir:
String s = null;
s.trim();
veya,
try {
// your code
} catch(Exception e) {
// log the exception
throw new MyException(e);
}
Bunu söyledikten sonra, aşağıdakiler bir başarısızlık bildirecektir:
Assert.fail("Failure here");
veya,
Assert.assertEquals(1, 2);
ya da:
throw new AssertionException(e);
Kullandığınız Junit sürümüne bağlıdır. Junit 4-, bir başarısızlık ve bir hata arasındaki ayrımı yapacak, ancak Junit 4 bunu yalnızca başarısızlık olarak basitleştiriyor.
Aşağıdaki bağlantı daha ilginç girdiler sağlar:
"Java 8'de JUnit ile Pragmatik Birim Testi" nden:
JUnit'teki iddialar (veya iddialar), testlerinize bıraktığınız statik yöntem çağrılarıdır. Her iddia, bazı koşulların doğru olduğunu doğrulamak için bir fırsattır. İddia edilen bir koşul doğru değilse, test orada durur ve JUnit bir test hatası bildirir.
(JUnit testinizi çalıştırdığında, bir istisna atılması ve yakalanmaması da mümkündür. Bu durumda, JUnit bir test hatası bildirir.)
Test hatası ve test hatası veren satırı yorumladım.
@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"
}
Böylece Junit, bir istisna aldığınızda test hatası gösterir ve beklenen sonuç değeriniz gerçek değerinizle eşleşmediğinde test hatası gösterir.
Kaynak sınıf: 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;
}
}
}
Yukarıdaki yöntemde aşağıdaki satırda görebileceğiniz gibi
tr.getThrowable () AssertionError örneği
AssertionError örneği olduğunda hata sayısı artar, aksi takdirde (herhangi bir Throwable) hata olarak sayılır.
@Test
Hataların JUnit onaylama yöntemleri tarafından atılan AssertionErrors'dan veya bir AssertionError atarak ya da notunuzda bildirdiğiniz bir istisna atarak ve Hataların diğer beklenmedik İstisnalardan geldiği konusunda haklısınız. Ancak aralarında önemli bir ayrım var:
Başarısızlık, testinizin doğru şekilde çalıştığı ve kodunuzda bir kusur tespit ettiği anlamına gelir.
Bir hata, kodunuzda bir hata anlamına gelebilir, ancak sizin test etmediğiniz bir hata. Ayrıca hatanın testin kendisinde olduğu anlamına da gelebilir.
Kısacası, bir hata, test edilen kodu yeniden yazmanız gerektiği anlamına gelir. Hata, yeniden yazmanız gereken birim testi olabileceği anlamına gelir. Hata kodunuzda olsa bile bu anlama gelebilir, örneğin a NullPointerException
, çünkü test etmediğiniz bir kusur tespit ettiniz, bu yüzden bunu test etmek akıllıca olabilir.
İronik olarak, junit ve diğer test ile ilgili çerçeveler (testng, hamcrest), durumu doğrulayan ve başarısız olursa onaylama işlemleri sağlar. "başlık altında" bir java.lang.AssertionError atılır ve btw, java.lang.Error'ı genişletir.
Ancak, elbette tamamen geçerli olan yukarıdaki cevaplarla hiçbir şekilde çelişmez. Bu nedenle, belirli bir test akışını hata olarak işaretlemek için AssertionError atılabilir, ancak bunun ilgili kılavuzlarda gerçekten belgelendiğinden emin değilim, çünkü özel fail () API kullanmak daha uygun. Diğer Atılabilir türler, hata olarak değil, hata olarak değerlendirilecektir.
Temelde, başarısızlıkları yerine getirilmemiş iddiaların atıfta ederken hatalar anormal test yürütme kaynaklanmaktadır . ve ben her IDE için farklı renkler ile sembolik simgeleri olduğunu düşünüyorum geçirilen , başarısız ve hata ile testler.
Daha fazla bilgi için bunu kontrol edin .
java.lang.AssertionError
atılırsa, bir test hatası yerine bir test hatası olarak gösterilecektir. Doğru olduğu için kendi cevabınızı kabul etmeyi düşünmelisiniz.