JUnit Assertions karşılaştırması


85

Bugün JUnit iddiaları yerine java iddiası olan bir JUnit test vakası gördüm — Birini diğerine tercih etmenin önemli avantajları veya dezavantajları var mı?


JUnit iddiaları ile Java 'assert' anahtar sözcüğü arasında kesinlikle olgusal farklılıklar vardır. Bu hiç de fikir temelli bir soru değil.
Thomas W

Yanıtlar:


95

JUnit4'te, bir JUnit assert tarafından atılan istisna (aslında Hata), java assertanahtar sözcüğü (AssertionError) tarafından atılan hatayla aynıdır , bu nedenle, assertTrueyığın izleme ile tamamen aynıdır ve farkı anlayamazsınız.

Bununla birlikte, iddiaların JVM'de özel bir bayrakla çalışması gerektiğinden, birçok testin yalnızca JUnit testleri çalıştırıldığında birisinin sistemi bu bayrakla yapılandırmayı unutması nedeniyle başarılı görünmesine neden olması gerekir - bu iyi değil.

Genel olarak, bu nedenle, JUnit'i kullanmanın assertTruedaha iyi bir uygulama olduğunu, çünkü testin çalıştırılmasını garanti ettiğini, tutarlılığı (bazen assertThatjava anahtar kelimesi olmayan diğer iddiaları kullanırsınız ) ve JUnit'in davranışının geçerli olduğunu iddia ediyorum. gelecekte değişmesi gerekir (bir tür filtreye veya gelecekteki başka bir JUnit özelliğine bağlanmak gibi), kodunuz bundan yararlanabilecektir.

Java'daki assert anahtar kelimesinin gerçek amacı, onu çalışma süresi cezası olmadan kapatabilmektir. Bu, birim testleri için geçerli değildir.


26

Yerleşik assertifadeden daha zengin bir API sundukları ve daha da önemlisi JVM argümanını assertgerektiren aksine açıkça etkinleştirilmeleri gerekmediği için JUnit iddialarını tercih ederim -ea.


1
-eaher zaman etkindir mvn test, buna gerek yoktur -ea. Daha zengin api, iyi yakalama. Bazen API'nin testte kötüye kullanıldığını düşünüyorum çünkü uygulamanın bir parçası değil (a in api), ona sadece daha zengin yöntemler demeyi tercih ediyorum.
Acımasız

20

Bir test başarısız olduğunda daha fazla bilgi alırsınız.

assertEquals(1, 2); sonuçlanır java.lang.AssertionError: expected:<1> but was:<2>

vs

assert(1 == 2); sonuçlanır java.lang.AssertionError

mesaj bağımsız değişkenini eklerseniz daha fazla bilgi edinebilirsiniz assertEquals


9
deneyin assert 1==2: "1 is not 2";.
Acımasız

@PeterRader -ea etkinleştirilmediğinde assert anahtar kelimesini deneyin. Ya da daha iyisi, her zaman çalışan JUnit iddialarını kullanın.
Thomas W

1
@ThomasW -ea etkin olmadığında test değildir. JUnit iddiaları her zaman işe yaramaz, yalnızca bir çerçeve olan JUnit'i kullanmaya karar verirseniz ve maven bağımlılığı durumunda, yalnızca test kapsamında olması gereken bir maven bağımlılığı varsa çalışırlar. Burada iki tarafımız var: Neyi tercih edersiniz? 1. Taraf : Yalnızca test kapsamında bir bağımlılık olarak, indirilmesi gereken bir çerçeve kullanın, bu tutulma src / main-klasöründe olmayan sınıflarda kullanmanıza izin verir, ancak orada derlenmez çünkü maven yalnızca testte junit'e sahiptir. kapsam veya 2. Taraf : Yerleşik malzemeleri kullanın.
Acımasız

1
@PeterRader Bu soru JUnit test durumları hakkındadır. Bu bağlamda JUnit veya benzeri bir onaylama sınıfı kullanılmalıdır çünkü bunlar her zaman etkindir. Ben şahsen Java 'assert' anahtar kelimesinin geçmişte etkinleştirilmemiş olması nedeniyle yakalandım ve güvenilmez iddiaların test kodunda yeri olduğuna inanmıyorum.
Thomas W

Özellik kodundaki iddiaların ayrı bağlamında - sağlam programlama uygulaması için önemlidir, ancak aslında sorunun konusu olmasa da - hem Spring hem de Google Guava, her zaman etkin olan onaylama sınıflarına sahiptir. Doğruluğu sağlamak için bunların parametre ve durum ön koşulları olarak cömertçe kullanılmasını tavsiye ederim. Bunun ötesinde, performans açısından kritik alanlarda, Java küçük bir alan olabilir assertdoğruluğu kontroller için - tercih edilebilir olacağını performansını etkileyecek ve böylece en iyi engelli varsayılan olarak bulunmaktadır. Ancak deneyimlerime göre, iddiaların çoğu her zaman açık olmalıdır.
Thomas W

8

JUnit asserts'i test senaryolarında ve kodda java'nın assert'ini kullanın derim. Başka bir deyişle, gerçek kod, aşikar olduğu üzere asla JUnit bağımlılıklarına sahip olmayacaktır ve eğer bir testse, JUnit varyasyonlarını kullanmalıdır, asla iddia etmeyecektir.


0

JUnit kullanıyorsanız, JUnit iddialarını kullanmanız gerektiğini söyleyebilirim. assertTrue()temelde aynıdır assert, Aksi takdirde neden JUnit kullanasınız ki?


4
JUnit'i test çalıştırma çerçevesi için kullanırsınız. İddialar, JUnit'in size verdiği değerin gerçekten küçük bir parçasıdır. JUnit olmadan Assertdaha fazla standart şablon gerekir. assertJUnit olmadan bütün bir çerçeve yazmanız gerekir.
Yishai

1
Daha çok, aracı kullanacaksanız, ALETİ KULLANIN diyordum. düzenli eski assert ifadeleri JUnit test durumlarında biraz saçma görünüyor. Benim görüşüme göre gerçek koda aitler.
CheesePls

1
@CheesePls "normal eski iddia ifadeleri" aslında JUnit'in iddia ettiğinden daha yenidir.
dolmen

0

Yalnızca parlak ve yeni şeyler kullanıyorsanız, ancak Java'da 1.4SE'ye kadar kullanılmadığını iddia ediyorsanız, bu geçerli olmayabilir. Bu nedenle, daha eski teknolojiye sahip bir ortamda çalışmanız gerekiyorsa, uyumluluk nedenleriyle JUnit'e yönelebilirsiniz.

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.