Saya punya base class yang mewakili database test di TestNG, dan saya ingin menjelaskan bahwa semua kelas mulai dari kelas ini adalah kelompok "db-test", namun saya telah menemukan bahwa ini doesn't tampak mungkin. Saya telah mencoba @Menguji penjelasan:
@Test(groups = { "db-test" })
public class DBTestBase {
}
Namun, hal ini tidak't bekerja karena @Menguji penjelasan akan mencoba untuk membuat sekelompok metode tes, dan peringatan/kesalahan pop up di eclipse ketika tes lari.
Jadi saya mencoba menonaktifkan tes, jadi setidaknya kelompok ditugaskan:
@Test(enabled = false, groups = { "db-test" })
public class DBTestBase {
}
tapi kemudian ada @BeforeTest (dan serupa lainnya anotasi) JUGA mendapatkan keluarga... yang tentu saja tidak apa yang saya inginkan.
Saya ingin beberapa cara untuk membubuhi keterangan kelas sebagai jenis tertentu dari grup, tapi itu doesn't cukup tampaknya mungkin dalam TestNG. Apakah ada yang punya ide lain?
Jawabannya adalah melalui kustom org.testng.IMethodSelector:
Its includeMethod() dapat mengecualikan apapun metode yang kita inginkan, seperti yang publik tidak dijelaskan metode.
Namun, untuk mendaftarkan kustom Jawa MethodSelector, anda harus menambahkannya ke XMLTest contoh dikelola oleh setiap TestRunner, yang berarti anda perlu anda sendiri kustom TestRunner.
Tapi, untuk membangun kustom TestRunner, anda perlu untuk mendaftarkan TestRunnerFactory, melalui -testrunfactory pilihan.
TAPI itu -testrunfactory tidak PERNAH diperhitungkan oleh TestNG kelas... sehingga anda perlu juga untuk menentukan custom TestNG kelas :
Ok... itu's mimpi buruk. Tapi itu juga adalah sebuah kode-tantangan, sehingga harus sedikit menantang ;)
Semua kode ini tersedia di DZone snippet.
Seperti biasa untuk kode tantangan:
Pembaruan dari Mike Batu:
I'm akan menerima hal ini karena kedengarannya cukup dekat dengan apa yang akhirnya saya lakukan, tapi saya pikir saya akan menambahkan apa yang saya lakukan juga.
Pada dasarnya, saya membuat sebuah Kelompok penjelasan yang berperilaku seperti kelompok properti dari Tes ini (dan lainnya) anotasi.
Kemudian, saya membuat GroupsAnnotationTransformer, yang menggunakan IAnnotationTransformer untuk melihat semua tes dan tes kelas yang didefinisikan, kemudian memodifikasi tes untuk menambahkan kelompok-kelompok, yang bekerja sempurna dengan kelompok eksklusi dan inklusi.
Memodifikasi membangun untuk menggunakan anotasi baru transformator, dan semuanya bekerja dengan sempurna!
Nah... satu peringatan adalah bahwa hal itu doesn't menambahkan kelompok-kelompok non-tes metode... karena pada saat saya melakukan ini, ada lagi penjelasan transformator yang memungkinkan anda mengubah apa-APA, tapi entah bagaimana itu't termasuk dalam TestNG saya menggunakan untuk beberapa alasan... jadi itu adalah ide yang baik untuk membuat anda sebelum/setelah dijelaskan metode untuk alwaysRun=true... yang cukup untuk saya.
Hasil akhir adalah yang bisa saya lakukan:
@Groups({ "myGroup1", "myGroup2"})
public class MyTestCase {
@Test
@Groups("aMethodLevelGroup")
public void myTest() {
}
}
Dan saya membuat transformator bekerja dengan subclassing dan semuanya.
Tampaknya kepada saya sebagai berikut: kode-tantangan (komunitas wiki pos):
Bagaimana untuk dapat menjalankan semua metode uji Diperpanjang kelas dari kelompok 'aGlobalGroup' tanpa:
Jawaban pertama adalah mudah: tambahkan kelas TestNG(kelompok = { "aGlobalGroup" }) pada kelas Dasar tingkat
Kelompok itu akan berlaku untuk semua metode umum dari kedua kelas Dasar dan Diperpanjang kelas.
TAPI: bahkan non-testng metode umum (dengan tidak TestNG penjelasan) akan dimasukkan dalam kelompok itu.
TANTANGAN: hindari termasuk orang-orang non-TestNG metode.
@Test(groups = { "aGlobalGroup" })
public class Base {
/**
*
*/
@BeforeClass
public final void setUp() {
System.out.println("Base class: @BeforeClass");
}
/**
* Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
* Will be executed even if the TestNG class tested is a sub-class.
*/
@Test(groups = { "aLocalGroup" })
public final void aFastTest() {
System.out.println("Base class: Fast test");
}
/**
* Test not part a 'aGlobalGroup', but still included in that group due to the class annotation. <br />
* Will be executed even if the TestNG class tested is a sub-class.
*/
@Test(groups = { "aLocalGroup" })
public final void aSlowTest() {
System.out.println("Base class: Slow test");
//throw new IllegalArgumentException("oups");
}
/**
* Should not be executed. <br />
* Yet the global annotation Test on the class would include it in the TestNG methods...
*/
public final void notATest() {
System.out.println("Base class: NOT a test");
}
/**
* SubClass of a TestNG class. Some of its methods are TestNG methods, other are not. <br />
* The goal is to check if a group specify in the super-class will include methods of this class. <br />
* And to avoid including too much methods, such as public methods not intended to be TestNG methods.
* @author <a href="http://stackoverflow.com/users/6309/vonc">VonC</a>
*/
public static class Extended extends Base
{
/**
* Test not part a 'aGlobalGroup', but still included in that group due to the super-class annotation. <br />
* Will be executed even if the TestNG class tested is a sub-class.
*/
@Test
public final void anExtendedTest() {
System.out.println("Extended class: An Extended test");
}
/**
* Should not be executed. <br />
* Yet the global annotation Test on the class would include it in the TestNG methods...
*/
public final void notAnExtendedTest() {
System.out.println("Extended class: NOT an Extended test");
}
}
Anda dapat menentukan @Menguji penjelasan pada metode tingkat yang memungkinkan untuk fleksibilitas maksimum.
public class DBTestBase {
@BeforeTest(groups = "db-test")
public void beforeTest() {
System.out.println("Running before test");
}
public void method1() {
Assert.fail(); // this does not run. It does not belong to 'db-test' group.
}
@Test(groups = "db-test")
public void testMethod1() {
Assert.assertTrue(true);
}
}
Apakah ini bekerja untuk anda atau saya melewatkan sesuatu dari pertanyaan anda.