JUnit'teki başarısızlık ve hata arasındaki fark nedir?


93

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:


117

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.


5
Bununla birlikte, genişleyen herhangi bir şey java.lang.AssertionErroratı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.
ponzao

Evet, tam olarak fark bu. Ve pragmatik bir perspektiften bakıldığında, "fark yoktur" - eğer bir hata veya başarısızlık alırsanız, onu düzeltmeniz gerekir. Bu nedenle, JUnit'te "hataları" ve "hataları" ayrı ayrı saymak muhtemelen bir hataydı. JUnit 4 ikisini birleştirir (aşağıdaki cevapta açıklandığı gibi).
Jeff Grigg

Ve istisna bekleniyorsa, @Testile açıklama eklemelisiniz expected = SomeException.class.
Downhillski

@JeffGrigg pragmatik bir fark var. Birden çok test senaryosunda bir davranışa güveniliyorsa, diğerlerinde yakalanmamış, muhtemelen çalışma zamanı istisnalarını atarken, bu davranışı iddia eden yalnızca bir test senaryosu yazabilirim. Bu, test durumlarının geri kalanının, çalışmak için hala belirli davranışa bağlı olsalar bile başka bir şeyi test ettiğini söylüyor. Bu davranış bozulduğunda, geri kalanı hata bildirirken yalnızca bir test vakası başarısızlık bildirir ve bundan, birçok test vakası başarılı olmamasına rağmen düzeltmem gereken tam olarak bir hatam olduğunu görebilirim.
RonJRH

başarısız olursa org.junit.Assert.assertEquals () JUnit4 HTML raporu tarafından HATA olarak kabul edilir. Bu, ifadenizle çelişiyor (şimdiye kadar farkındaydım). Lütfen buna biraz daha ışık tutabilir misin?
Krishnom

15

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:

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


Bu doğru değil. JUnit 4'te test hatası ile test hatası arasındaki ayrım ortadan kalkmadı. Daha yeni test ettim. Bağlantılı makale yanıltıcıydı. "JUnit 4, yalnızca başarısızlıkları kullanarak bunu kolaylaştırır" dedi, ancak JUnit 4'ün java.lang.AssertionError'ı test başarısızlıklarına dönüştürdüğünü vurgulaması gerekir, böylece junit.framework.AssertionFailedError'ı kullanmak zorunda kalmazsınız. Bunun faydası, proje JUnit'e bağlanmadan üretim kodunda test iddiaları yazmaya başlayabilmenizdir. Test hatası ve test hatası arasındaki ayrım da son derece kullanışlıdır ve kaldırılırsa geriye doğru bir adım olur.
RonJRH

RonJRH, hataları varsayılan junit raporunuzda görebiliyor musunuz?
Neel

Evet Neel. Ben sadece denedim. Buradaki resmi bağlamanın özünden tam olarak emin değilim, ancak bu testimin
RonJRH

6

"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.)


5

Aşağıdaki test, Test Hatası ile Test hatası arasındaki farkı açıklamaktadır .

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.


2

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.


1

@TestHataları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.


0

İ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.


0

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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.