2009-12-17 20 views
27

'u kullanırken Bu yaklaşımı, jUnit'i Suite'lerle kurarak aşağıdan kullanın. Her Testclass'da @BeforeClass uygulamasının herhangi bir test yapılmaya başlamadan önce çalıştırılacağı sorunu yaşadık. (Her n TestClass dosyası için @BeforeClass çalışır, sonra çalıştırdıktan sonra, ilk MyTest.class dosyaları @Test) çalıştırmaya başladı.JUnit 4 @BeforeClass & @AfterClass

Bu, çok fazla kaynak ve bellek ayırmamıza neden olur. Düşüncelerim, yanlış olması gerektiğiydi, her bir @BeforeClass, yalnızca gerçek test sınıfının çalıştırılmasından önce değil, Suite başlatıldığında çalıştırılmalı mıydı?

@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests.class, Mytests2.class, n1, n2, n }) 
public class AllTests { 
    // empty 
} 


public class MyTests { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
     ... 

public class MyTests2 { // no extends here 
    @BeforeClass 
    public static void setUpOnce() throws InterruptedException { 
     ... 
    @Test 
     ... 
+0

her sınıfların tetkiklerden önce infaz mı veya tüm yalnızca önce çalıştırılan ilk (ama sonra ikinci tüm @BeforeClass çalıştırmadan çalıştırılır tekrar)? İkincisi, @BeforeClass bu testte @Test yöntemlerinden önce çalıştığı için iyi görünmüyor. Her bir sınıfın testinden sonra temizlemediğiniz sürece bellek miktarı değişmeyecektir (ve bunlar sadece tüm paket tamamlandıktan sonra gerçekleşmektedir). –

+1

Şu anda anladığım şey, her @ İlk Harekatın ilk çalıştırıldığıdır. @BeforeClass (Mytests) @BeforeClass (Mytests2) @Test (MyTests) @Test (MyTests2) benim açımdan anda , bu doğru değil. Yanılıyorsam düzeltin, ancak bu soruna neden olan bir şey yanlış ayarlanmış olmalıdır. –

cevap

43

AllTests sınıfında, suite başlatıldığında çalıştırılacak @BeforeClass yöntemini yazın.

public class MyTests1 { 
    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("MyTests1.beforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("MyTests1.before"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("MyTests1.AfterClass"); 
    } 

    @After 
    public void after() { 
     System.out.println("MyTests1.after"); 
    } 

    @Test 
    public void test1() { 
     System.out.println("MyTests1.test1"); 
    } 

    @Test 
    public void test2() { 
     System.out.println("MyTests1.test2"); 
    } 
} 



public class MyTests2 { 
    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("MyTests2.beforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("MyTests2.before"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("MyTests2.AfterClass"); 
    } 

    @After 
    public void after() { 
     System.out.println("MyTests2.after"); 
    } 

    @Test 
    public void test1() { 
     System.out.println("MyTests2.test1"); 
    } 

    @Test 
    public void test2() { 
     System.out.println("MyTests2.test2"); 
    } 
} 




@RunWith(Suite.class) 
@Suite.SuiteClasses({ MyTests1.class, MyTests2.class }) 
public class AllTests { 

    @BeforeClass 
    public static void beforeClass() { 
     System.out.println("AllTests.beforeClass"); 
    } 

    @Before 
    public void before() { 
     System.out.println("AllTests.before"); 
    } 

    @AfterClass 
    public static void afterClass() { 
     System.out.println("AllTests.AfterClass"); 
    } 

    @After 
    public void after() { 
     System.out.println("AllTests.after"); 
    } 

    @Test 
    public void test1() { 
     System.out.println("AllTests.test1"); 
    } 

    @Test 
    public void test2() { 
     System.out.println("AllTests.test2"); 
    } 

} 

ÇIKIŞ

AllTests.beforeClass 
MyTests1.beforeClass 
MyTests1.before 
MyTests1.test1 
MyTests1.after 
MyTests1.before 
MyTests1.test2 
MyTests1.after 
MyTests1.AfterClass 
MyTests2.beforeClass 
MyTests2.before 
MyTests2.test1 
MyTests2.after 
MyTests2.before 
MyTests2.test2 
MyTests2.after 
MyTests2.AfterClass 
AllTests.AfterClass 

hth

+4

'AllTests.test1()' ve '" AllTests.test2() 'hiçbir zaman idam edilmez? – Theodor

+0

@nayakam Bu derhal sorunu çözer, ama sonra bireysel test sınıfları veya subsuites kendi üzerinde çalıştırılamaz düşünüyorum kendi? – nsandersen

-4

Ben @BeforeClass instanciation de yürütür, düşünüyorum.

+0

Yapmıyor. "@BeforeClass ile bir public statik void no-arg yönteminin eklenmesi, sınıftaki herhangi bir test yönteminden önce bir kez çalıştırılmasına neden olur. Üst sınıfların @BeforeClass yöntemleri geçerli sınıftan önce çalıştırılır." (Kaynak: JUnit belgeleri) – Jorn

+0

Sadece bellekte sorun yaşayanlar için bazı ek bilgiler ekleyeceğiz. JUnit, çalışırken tüm durumları kaydedecek ve ayrıca tüm JUnit testleri gerçekleştirilinceye kadar tüm statik değişkenleri kaydedecektir. Bu aynı zamanda 1000-6000 JUnit testleri arasında çalıştığımız için de büyük bir problemdi. Bu, sonucu en sonunda göstermesi gerektiğinden. –

1

JUnit'te @RunWith ile aşina değilim, bu yüzden yanlış bir şey yapmış olabilirim, ancak açıkladığınız davranışı çoğaltma gibi görünmüyor.

@RunWith(Suite.class) 
@Suite.SuiteClasses({ FirstTest.class, SecondTest.class, ThirdTest.class }) 
public class AllTests { 
    // empty 
} 

Ve FirstTest.java bu gibi bakarak: sınıfa ile

public class FirstTest { 
    @BeforeClass 
    public static void doBeforeClass() { 
     System.out.println("Running @BeforeClass for FirstTest"); 
    } 

    @Test 
    public void doTest() { 
     System.out.println("Running @Test in " + getClass().getName()); 
    } 
} 

... SecondTest.java ve ThirdTest.java ile hemen hemen aynı.

Running @BeforeClass for FirstTest 
Running @Test in FirstTest 
Running @BeforeClass for SecondTest 
Running @Test in SecondTest 
Running @BeforeClass for ThirdTest 
Running @Test in ThirdTest 

Bu Sun'ın JDK 1.6.0_12 üzerinde JUnit 4.5.0 (Eclipse 3.5.1 varsayılan JUnit) ile: Ben test çıkış olsun. Örneğimdeki herhangi bir farkı seninkilerden fark edebilir misin? Belki farklı bir JDK/JVM? Bunların bir faktör olup olmadığını bilmek için JUnit'in iç yapısını bilmiyorum.

+0

Tanımladığınız gibi, benim de almam gereken şey buydu. Ama önce bir grup @BeforeClass alıyorum, sonra ilk @Test, @Test ve benzerlerini görüyorum. Sun'ın JDK'sini Kullanmak 1.6.0_17, Eclipse 3.5, ancak daha sonra Fonksiyon testlerimiz ant, maven ile çalışıyoruz. Bunun bir kısmı sonuçları etkileyebilir mi? Eclipse'de kurup çalıştırırsam, bu sorun biraz karınca veya maven gibi görünüyor. –

+0

Üzgünüz, ya karınca ya da maven'de JUnit koşturmada size yardımcı olamam. Kullandığım örnek için export.xml dosyasını verdim ve test hedefi ile çalıştırdım ve aradığınız davranışı aldım, bu yüzden JUnit ant görevinde yanlış bir şey olduğundan şüphe ediyorum. * şaşkın omuz silkme * – Grundlefleck