junit4和junit5_JUnit5 TestSuite替代
junit4和junit5
JUnit4具有TestSuite類(lèi)來(lái)聚合多個(gè)測(cè)試。 這在JUnit 5中不可用。通常,通過(guò)套件中的一堆命名測(cè)試進(jìn)行的測(cè)試發(fā)現(xiàn)有些糟透了。 但是,如果目標(biāo)不是測(cè)試發(fā)現(xiàn),而是不同測(cè)試類(lèi)之間的資源共享,那么創(chuàng)建一個(gè)父對(duì)象是有意義的。
JUnit 5提供了@Nested批注,以允許子類(lèi)在其父類(lèi)的上下文中運(yùn)行。 假定子類(lèi)是非靜態(tài)的,因此可以訪問(wèn)其父類(lèi)的實(shí)例值。 如果我們要共享測(cè)試資源,則可能需要考慮測(cè)試套件的類(lèi)級(jí)別設(shè)置,并以某種方式將其連接到子類(lèi)的類(lèi)級(jí)別設(shè)置中。
讓我們來(lái)設(shè)計(jì)一個(gè)偽造的例子來(lái)說(shuō)明這個(gè)問(wèn)題:
@Testcontainers // use docker images @Testcontainers // use docker images class MyTest { // make a DB at the start of the test in a docker container // takes a few minutes to boot up @Container private static final DatabaseContainer DB = createDbContainer(); private static MyDao dao; @BeforeAll static void beforeAll() { dao = createDaoFrom(DB); } @Test void daoFeatureOne() { assertThat(dao.find( "no data" )).isEmpty(); } }上面是一個(gè)測(cè)試,它在測(cè)試類(lèi)的全局生命周期中啟動(dòng)數(shù)據(jù)庫(kù)。 它將一個(gè)dao對(duì)象連接到它,并且可以進(jìn)行多個(gè)測(cè)試以重用該dao 。
在理想情況下,我們可以為每個(gè)測(cè)試重置所有內(nèi)容,但是數(shù)據(jù)庫(kù)是啟動(dòng)的昂貴資源。 也許我們可以添加一些beforeEach和afterEach掛鉤來(lái)清理其數(shù)據(jù),但是我們不想退回?cái)?shù)據(jù)庫(kù)。 每一次。 類(lèi)似地,如果每次運(yùn)行,我們的dao一些框架啟動(dòng)成本可能是不希望的。
上面作為我們項(xiàng)目中的唯一測(cè)試是可以的,但是如果還有其他需要該數(shù)據(jù)庫(kù)的測(cè)試又該怎么辦呢?如果真的需要AGES來(lái)運(yùn)行呢?
JUnit 5中沒(méi)有套件
是不是很煩 如果我們可以做的話:
@JUnit5TestSuite // not real @Children ({MyDaoTest. class , MyOtherDaoTest. class }) @Testcontainers class MyTestSuite { @Container private static final DatabaseContainer DB = createDbContainer(); }那將是很棒的……但是這會(huì)給我們帶來(lái)一些問(wèn)題:
- 我們?nèi)绾未_保子測(cè)試不在套件之外運(yùn)行?
- 這些測(cè)試如何訪問(wèn)“ DB”對(duì)象?
套房的另一種選擇
假設(shè)我們有一個(gè)靜態(tài)方法getDb在需要時(shí)提供數(shù)據(jù)庫(kù)。
現(xiàn)在,讓我們重寫(xiě)原始的DaoTest以使用它,并使其抽象化,以便測(cè)試運(yùn)行器不會(huì)將其拾取:
abstract class MyTestImpl implements DbProvider { private static MyDao dao; @BeforeAll static void beforeAll() { // access to the database container // from the static method (statically imported) dao = createDaoFrom(getDb()); } @Test void daoFeatureOne() { assertThat(dao.find( "no data" )).isEmpty(); } }現(xiàn)在我們有一個(gè)可以在套件中運(yùn)行的部分測(cè)試,讓我們定義套件。 我們還使用@Nested來(lái)插入子類(lèi):
@Testcontainers // use docker images @Testcontainers // use docker images class MyTest { // make a DB at the start of the test in a docker container // takes a few minutes to boot up @Container private static final DatabaseContainer DB = createDbContainer(); // provide the getDb function to access the container public static DatabaseContainer getDb() { return DB; } // test suite members are just nested classes that extend // the abstract class of each member of the suite @Nested class MyTest extends MyTestImpl { } // ... add more suite members with more @Nested }缺點(diǎn)
由于類(lèi)在彼此的靜態(tài)位上運(yùn)行,因此存在產(chǎn)生混亂的風(fēng)險(xiǎn)。
每個(gè)嵌套類(lèi)都必須是子類(lèi)的事實(shí)也有點(diǎn)時(shí)髦……
但這有效并且構(gòu)成了有效的測(cè)試套件。
翻譯自: https://www.javacodegeeks.com/2020/04/junit5-testsuite-alternative.html
junit4和junit5
總結(jié)
以上是生活随笔為你收集整理的junit4和junit5_JUnit5 TestSuite替代的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java oca_OCA第5部分中的Ja
- 下一篇: 医疗生产备案号查询(医疗生产备案)