2013-10-05 15 views
24

Şu anda ilk Java projemi yapıyorum ve bunu tamamen TDD yapmak istiyorum. Testleri yazmak için JUnit kullanıyorum. Görünüşe göre JUnit, data providers için destek sağlamaz, bu da aynı yöntemi bir argümanın 20 farklı versiyonuyla test etmeyi oldukça can sıkıcı kılar. Java için veri sağlayıcıları destekleyen en popüler/standart test aracı nedir? TestNG numaralı telefondan geldim, ancak bunun ne kadar popüler olduğu ya da alternatiflerle nasıl kıyaslandığı hakkında hiçbir fikrim yok.Java testlerini veri sağlayıcıları ile yazma

Bu davranışı elde etmenin bir yolu JUnit'i kullanmanın güzel bir yolu ise, o zaman işe yarayabilir.

+0

JUnit parametreli testlere sahiptir. –

+0

Ancak, uyarılmış JUnit testinin Eclipse entegrasyonunun berbat olduğu konusunda uyarınız. a) Tek bir parametre seti çalıştırmak mümkün değildir, b) test sırasında gerçekten başarısız olan JUnit penceresinden söylemek zor. (listede [0], [1], [2] gibi bir şey görüyorsunuz). – qqilihq

+2

@qqilihq JUnit 4.11 artık parametreli testleri daha iyi adlandırmanın yollarını kullanmaktadır, bu yüzden artık bu tür bir sorununuz yok https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md – dkatzel

cevap

23

JUnit 4 okunabilirliği vs esneklik içinde İhtiyaçlarınıza bağlı olarak php veri sağlayıcıları

@RunWith(Parameterized.class) 
public class MyTest{ 
    @Parameters 
    public static Collection<Object[]> data() { 
      /*create and return a Collection 
      of Objects arrays here. 
      Each element in each array is 
      a parameter to your constructor. 
      */ 

    } 

    private int a,b,c; 


    public MyTest(int a, int b, int c) { 
      this.a= a; 
      this.b = b; 
      this.c = c; 
    } 

    @Test 
    public void test() { 
      //do your test with a,b 
    } 

    @Test 
    public void testC(){ 
     //you can have multiple tests 
     //which all will run 

     //...test c 
    } 
} 
+4

Benzer olsa da, benzer değil. PHP veri sağlayıcıları, yöntemlerinize argümanları iletir. Örneğinizde argümanlar, test sınıfının yapıcısına iletilir. Değerler listesine sahip olmak istediğim birden çok test yöntemim varsa ne olur? Her biri için bir test dersi oluşturmak çok garip olurdu. –

+0

Her bir "@ Test" ile açıklanmış birden fazla test yöntemine sahip olabilirsiniz. Tüm testler kullanılacaktır. Ben aynı liste argümanları veya öğeleri aynı listeyi kullanan birden çok sınama var için ne kadar iyi olduğunu göstermek için cevabımı biraz güncelledim – dkatzel

+8

. Çakışma yoksa, gerçekten yardımcı olmaz. Benim durumumda, geçerli girişlerin bir listesi ve çakışmaları olmayan bir geçersiz giriş listesi var. Bunları bir araya getirmek son derece tuhaf olurdu. –

6

aynı işlevi olduğunu testini parametreli etti seçebilirsiniz Parameterized - junit en dkatzel tarafından açıklanan, seçeneğinde inşa etti. biraz farklı bir işlevselliğe sahip

@TestWith({ 
     "clerk,  45'000 USD, GOLD", 
     "supervisor, 60'000 GBP, PLATINUM" 
    }) 
    public void canAcceptDebit(Employee employee, Money money, ClientType clientType) { 
     assertTrue( employee.canAcceptDebit(money, clientType) ); 
    } 

veya junitParams: Diğer seçenekler yapmanız diyelim zohhak gibi dış kütüphaneleri tarafından sağlanan dış junit koşucular vardır. Sadece en uygun olanı seçin.

36

Şirketimizde çalışan iş arkadaşlarımız, on github (https://github.com/TNG/junit-dataprovider)'u bulabileceğiniz JUnit için TestNG stilinde ücretsiz olarak kullanılabilen bir DataProvider yazdı.

Çok büyük projelerde kullanıyoruz ve bizim için iyi çalışıyor. JUnit'in Parameterized'a göre bazı avantajları vardır, çünkü ayrı sınıfların yükünü azaltacaktır ve tek testleri de yapabilirsiniz.

bir örnek bu

@DataProvider 
public static Object[][] provideStringAndExpectedLength() { 
    return new Object[][] { 
     { "Hello World", 11 }, 
     { "Foo", 3 } 
    }; 
} 

@Test 
@UseDataProvider("provideStringAndExpectedLength") 
public void testCalculateLength(String input, int expectedLength) { 
    assertThat(calculateLength(input)).isEqualTo(expectedLength); 
} 

Edit şöyle görünür: v1.7 yana, aynı zamanda verileri (dizeleri, listeler) temin etmek ve ayrı bir yöntemdir böylece sağlayıcı satır içine alabilirsiniz başka yollar destekler Mutlaka gerekli değil.

Tam çalışma örneği, github kılavuz sayfasında bulunabilir. Ayrıca, yardımcı sınıflardaki sağlayıcıların toplanması ve diğer sınıflardan erişilmesi gibi birkaç özellik daha var. El ile sayfa çok ayrıntılı, eminim orada cevaplanmış soruları bulacaksınız.

+2

Yukarıdaki örneği çalıştırmaya çalıştığınız kişiler için: Test sınıfınıza '@RunWith (DataProviderRunner.class)' notu eklemeyi unutmayın! – ADi3ek

İlgili konular