Pertanyaan Sebelum dan Sesudah Suite dieksekusi hook di jUnit 4.x


Saya mencoba melakukan preform setup dan teardown untuk satu set tes integrasi, menggunakan jUnit 4.4 untuk menjalankan tes. Pembongkaran harus dijalankan dengan andal. Saya mengalami masalah lain dengan TestNG, jadi saya ingin kembali ke jUnit. Kait apa yang tersedia untuk eksekusi sebelum tes apa pun dijalankan dan setelah semua tes selesai?

Catatan: kami menggunakan maven 2 untuk build kami. Saya sudah mencoba menggunakan maven pre- & post-integration-test fase, tetapi, jika tes gagal, maven berhenti dan tidak berjalan post-integration-test, yang tidak membantu.


76
2017-09-17 13:07


asal


Jawaban:


Ya, memungkinkan untuk menjalankan dan mengatur metode sebelum dan sesudah pengujian di dalam rangkaian uji. Biarkan saya menunjukkan dalam kode:

package com.test;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class})
public class TestSuite {

    @BeforeClass
    public static void setUp() {
        System.out.println("setting up");
    }

    @AfterClass
    public static void tearDown() {
        System.out.println("tearing down");
    }

}

Jadi kelas Test1 Anda akan terlihat seperti ini:

package com.test;

import org.junit.Test;


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

}

... dan Anda dapat membayangkan bahwa Test2 tampak serupa. Jika Anda menjalankan TestSuite, Anda akan mendapatkan:

setting up
test1
test2
tearing down

Jadi Anda dapat melihat bahwa set up / robek hanya berjalan sebelum dan sesudah semua tes, masing-masing.

Hasil tangkapan: ini hanya berfungsi jika Anda menjalankan rangkaian uji, dan tidak menjalankan Test1 dan Test2 sebagai tes JUnit individual. Anda menyebutkan bahwa Anda menggunakan maven, dan plugin maven surefire suka menjalankan pengujian secara individual, dan bukan bagian dari suite. Dalam hal ini, saya akan merekomendasikan membuat superclass yang setiap kelas tes meluas. Superclass kemudian berisi metode @BeforeClass dan @AfterClass yang beranotasi. Meskipun tidak cukup bersih seperti metode di atas, saya pikir ini akan berhasil untuk Anda.

Untuk masalah dengan tes gagal, Anda dapat mengatur maven.test.error.ignore agar build berlanjut pada tes yang gagal. Ini tidak disarankan sebagai latihan berkelanjutan, tetapi ini akan membuat Anda berfungsi sampai semua tes Anda lulus. Untuk detail lebih lanjut, lihat dokumentasi maven pasti.


107
2017-10-07 02:51



Seorang rekan saya menyarankan hal berikut: Anda dapat menggunakan RunListener khusus dan menerapkan metode testRunFinished (): http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html#testRunFinished(org.junit.runner.Result)

Untuk mendaftar, RunListener cukup konfigurasikan plugin pasti seperti berikut: http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html bagian "Menggunakan pendengar khusus dan reporter"

Konfigurasi ini juga harus dipilih oleh plugin failsafe. Solusi ini sangat bagus karena Anda tidak perlu menentukan Suites, kelas uji coba atau hal-hal lain - itu memungkinkan Maven melakukan sihirnya, menunggu semua tes selesai.


31
2018-02-07 17:29



Anda dapat menggunakan Annotation @ClassRule di JUnit 4.9+ sebagai Saya dijelaskan dalam jawaban pertanyaan lain.


11
2017-10-03 18:15



Dengan menggunakan anotasi, Anda dapat melakukan sesuatu seperti ini:

import org.junit.*;
import static org.junit.Assert.*;
import java.util.*;

class SomethingUnitTest {
    @BeforeClass
    public static void runBeforeClass()
    {

    }

    @AfterClass
    public static void runAfterClass()
    {  

    }

    @Before  
    public void setUp()
    {

    }

    @After
    public void tearDown()
    {

    }

    @Test
    public void testSomethingOrOther()
    {

    }

}

8
2017-09-17 13:32



Disini kita

  • ditingkatkan ke JUnit 4.5,
  • menulis anotasi untuk menandai setiap kelas atau metode pengujian yang membutuhkan layanan kerja,
  • menulis penangan untuk setiap anotasi yang berisi metode statis untuk mengimplementasikan pengaturan dan pembongkaran layanan,
  • memperpanjang Runner biasa untuk menemukan anotasi pada tes, menambahkan metode handler statis ke dalam rantai eksekusi uji pada titik-titik yang sesuai.

3
2018-04-01 18:13



Asalkan semua tes Anda dapat memperpanjang kelas "teknis" dan berada dalam paket yang sama, Anda dapat melakukan sedikit trik:

public class AbstractTest {
  private static int nbTests = listClassesIn(<package>).size();
  private static int curTest = 0;

  @BeforeClass
  public static void incCurTest() { curTest++; }

  @AfterClass
  public static void closeTestSuite() {
      if (curTest == nbTests) { /*cleaning*/ }             
  }
}

public class Test1 extends AbstractTest {
   @Test
   public void check() {}
}
public class Test2 extends AbstractTest {
   @Test
   public void check() {}
}

Ketahuilah bahwa solusi ini memiliki banyak kekurangan:

  • harus melakukan semua tes paket
  • harus subkelas kelas "techincal"
  • Anda tidak dapat menggunakan @BeforeClass dan @AfterClass di dalam subclass
  • jika Anda hanya menjalankan satu tes dalam paket, pembersihan tidak dilakukan
  • ...

Untuk informasi: listClassesIn () => Bagaimana Anda menemukan semua subclass dari kelas tertentu di Jawa?


3
2017-09-27 15:51



Adapun "Catatan: kami menggunakan maven 2 untuk membangun kami. Saya sudah mencoba menggunakan fase pra-dan pasca-integrasi maven, tetapi, jika tes gagal, maven berhenti dan tidak menjalankan uji pasca-integrasi , yang tidak membantu. "

Anda dapat mencoba failsafe-plugin sebagai gantinya, saya pikir itu memiliki fasilitas untuk memastikan pembersihan terjadi terlepas dari pengaturan atau status tahap menengah


2
2017-12-07 14:54



Satu-satunya cara saya berpikir kemudian untuk mendapatkan fungsi yang Anda inginkan adalah melakukan sesuatu seperti

import junit.framework.Test;  
import junit.framework.TestResult;  
import junit.framework.TestSuite;  

public class AllTests {  
    public static Test suite() {  
        TestSuite suite = new TestSuite("TestEverything");  
        //$JUnit-BEGIN$  
        suite.addTestSuite(TestOne.class);  
        suite.addTestSuite(TestTwo.class);  
        suite.addTestSuite(TestThree.class);  
        //$JUnit-END$  
     }  

     public static void main(String[] args)  
     {  
        AllTests test = new AllTests();  
        Test testCase = test.suite();  
        TestResult result = new TestResult();  
        setUp();  
        testCase.run(result);  
        tearDown();  
     }  
     public void setUp() {}  
     public void tearDown() {}  
} 

Saya menggunakan sesuatu seperti ini dalam gerhana, jadi saya tidak yakin bagaimana portabel itu di luar lingkungan itu


1
2017-09-17 13:50



Sejauh yang saya tahu tidak ada mekanisme untuk melakukan ini di JUnit, namun Anda dapat mencoba subclassing Suite dan mengesampingkan metode run () dengan versi yang menyediakan hook.


0
2017-09-17 13:28