[跟著官方文檔學(xué)JUnit5][四][WritingTests][學(xué)習(xí)筆記]
1.禁用測(cè)試
可以通過@Disabled注解、通過條件測(cè)試執(zhí)行中討論的注解之一或通過自定義執(zhí)行條件禁用整個(gè)測(cè)試類或單個(gè)測(cè)試方法。
下面是一個(gè)@Disabled測(cè)試類
import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @Disabled("Disabled until bug #99 has been fixed") class DisabledClassDemo { @Test void testWillBeSkipped() { } }
下面是一個(gè)測(cè)試類,其中包含一個(gè)@Disabled測(cè)試方法
import com.example.util.Calculator; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class DisabledClassDemo1 { private final Calculator calculator = new Calculator(); @Disabled("Disabled until bug #42 has been resolved") @Test void testWillBeSkipped() { assertEquals(3, calculator.add(1, 1)); } @Test void testWillBeExecuted() { assertEquals(2, calculator.add(1, 1)); } }
輸出結(jié)果
注意:JUnit團(tuán)隊(duì)建議開發(fā)人員提供一個(gè)簡(jiǎn)短的解釋,說明為什么禁用了測(cè)試類或測(cè)試方法。
2.條件測(cè)試執(zhí)行
JUnit Jupiter中的ExecutionCondition拓展API允許開發(fā)人員啟用或禁用容器,或者根據(jù)特定條件以編程方式進(jìn)行測(cè)試。此類條件的最簡(jiǎn)單示例是內(nèi)置的DisableCondition,它支持@Disabled注解(參考禁用測(cè)試)。除了@Disabled之外,JUnit Jupiter還支持org.junit.jupiter.api.condition包中的其他幾個(gè)基于注解的條件,這些條件允許開發(fā)人員以聲明方式啟用或禁用容器和測(cè)試。注冊(cè)多個(gè)執(zhí)行條件拓展時(shí),只要其中一個(gè)條件返回禁用狀態(tài),就會(huì)禁用容器或測(cè)試。如果你希望提供有關(guān)它們可能被禁用的原因的詳細(xì)信息,則與這些內(nèi)置條件關(guān)聯(lián)的每個(gè)注解都有一個(gè)可用于此目的的disabledReason屬性。
組合注解
注意以下各節(jié)中列出的任何條件注解也可以用作元注解,以便創(chuàng)建自定義組合注解。比如,@EnabledOnOS演示中的@TestOnMac注解演示了如何將@Test和@EnabledOnOS組合到單個(gè)可重用的注解中。
如果條件注解在給定元素上直接存在,間接存在或元存在多次,則只會(huì)使用JUnit發(fā)現(xiàn)的第一個(gè)此類注解;任何其他聲明都將被忽略。但請(qǐng)注意,每個(gè)條件注解可以與org.junit.jupiter.api.condition包中的其他條件注解結(jié)合使用。
2.1.操作系統(tǒng)條件
容器或測(cè)試可以通過@EnabledOnOS和@DisabledOnOS注解在特定操作系統(tǒng)上啟用或禁用
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.*; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; class TestOnOS { @Test @EnabledOnOs(OS.MAC) void onlyOnMacOS() { //... } @TestOnMac void testOnMac() { //... } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Test @EnabledOnOs(OS.MAC) @interface TestOnMac{ } @Test @EnabledOnOs({OS.LINUX,OS.MAC}) void onLinuxOrMac() { //... } }
2.2.JRE條件
容器或測(cè)試可以通過@EnabledOnJre和@DisabledOnJre注解在特定版本的JRE上啟用或禁用,也可以通過@EnabledForJreRange和@DisabledForJreRange注解在特定版本的JRE上啟用或禁用。默認(rèn)范圍是Java 8為最低值。
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.*; class TestOnJava { @Test @EnabledOnJre(JRE.JAVA_8) void onlyOnJava8() { //... } @Test @EnabledOnJre({JRE.JAVA_9, JRE.JAVA_10}) void onJava9Or10() { //... } @Test @EnabledForJreRange(min = JRE.JAVA_9, max = JRE.JAVA_18) void fromJava9to18() { //... } @Test @DisabledOnJre(JRE.JAVA_9) void notOnJava9() { //... } @Test @DisabledForJreRange(min = JRE.JAVA_9, max = JRE.JAVA_14) void notFromJava9to14() { //... } }
2.3.系統(tǒng)屬性條件
容器或測(cè)試可以通過@EnabledIfSystemProperty和@DisabledIfSystemProperty注解根據(jù)命名JVM系統(tǒng)屬性的值來啟用或禁用。通過matches屬性提供的值將被解釋為正則表達(dá)式。
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIfSystemProperty; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; class TestOnSystemProperty { @Test @EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*") void onlyOn64BitArchitectures() { //... } @Test @DisabledIfSystemProperty(named = "ci-server", matches = "true") void notOnCiServer() { //... } }
2.4.環(huán)境變量條件
容器或測(cè)試可以通過@EnabledIfEnvironmentVariable和@DisabledIfEnvironmentVariable注解,根據(jù)操作系統(tǒng)中命名的環(huán)境變量的值來啟用或禁用。通過matches屬性提供的值將被解釋為正則表達(dá)式。
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; class TestOnEnvironmentVariable { @Test @EnabledIfEnvironmentVariable(named = "ENV", matches = "staging-server") void onlyOnStagingServer() { //... } @Test @DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*") void notOnDeveloperWorkstation() { //... } }
2.5.定制條件
容器或測(cè)試可以根據(jù)方法通過@EnabledIf的布爾值返回啟用或禁用,@DisabledIf注解。該方法通過其名稱提供給批注。如果需要,條件方法可以采用ExtensionContext類型的單個(gè)參數(shù)。
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIf; import org.junit.jupiter.api.condition.EnabledIf; class TestOnCustomConditionDemo { @Test @EnabledIf("customCondition") void enabled() { //... } @Test @DisabledIf("customCondition") void disabled() { //... } boolean customCondition() { return true; } }
條件方法也可以定位在測(cè)試類之外。在這種情況下,必須通過其完全限定名稱引用
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIf; class TestOnExternalConditionDemo { @Test @EnabledIf("com.example.conditionaltest.ExternalCondition") void enabled() { //... } } class ExternalCondition{ static boolean customCondition() { return true; } }
注意:在類級(jí)別使用@EnabledIf或@DisabledIf時(shí),條件方法必須始終是靜態(tài)的。位于外部類中的條件方法也必須是靜態(tài)的。在任何其他情況下,可以同時(shí)使用靜態(tài)方法或?qū)嵗椒ā?/p>
3.標(biāo)記和過濾
通過@Tag注解標(biāo)記測(cè)試類和方法。以后可用于篩選測(cè)試發(fā)現(xiàn)和執(zhí)行。
import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @Tag("fast") @Tag("model") class TaggingDemo { @Test @Tag("taxes") void testingTaxCalculation() { } }
4.測(cè)試執(zhí)行順序
默認(rèn)情況下,將使用確定性但不明顯的算法對(duì)測(cè)試類和方法進(jìn)行排序。可確保測(cè)試套件后續(xù)運(yùn)行以相同的順序執(zhí)行測(cè)試類和測(cè)試方法,從而允許可重復(fù)的生成。
4.1.方法順序
盡管真正的單元測(cè)試通常不依賴于執(zhí)行順序,但有時(shí)需要強(qiáng)制執(zhí)行特定的測(cè)試方法執(zhí)行順序。在編寫繼承測(cè)試或功能測(cè)試時(shí),測(cè)試的順序很重要,特別是與@TestInstance(Lifecycle.PER_CLASS)結(jié)合使用時(shí)。
若要控制測(cè)試方法的執(zhí)行順序,使用@TestMethodOrder注解測(cè)試類或測(cè)試接口,并指定所需的MethodOrderer實(shí)現(xiàn)。可以自定義MethodOrderer,也可以使用以下內(nèi)置MethodOrderer實(shí)現(xiàn)。
MethodOrderer.DisplayName:根據(jù)測(cè)試方法的顯示名稱按字母數(shù)字對(duì)測(cè)試方法進(jìn)行排序(參照顯示名稱生成優(yōu)先級(jí)規(guī)則)
MethodOrderer.MethodName:根據(jù)測(cè)試方法的名稱和形式參數(shù)列表按字母數(shù)字對(duì)測(cè)試方法進(jìn)行排序。
MethodOrderer.OrderAnnotation:根據(jù)通過@Order注解指定的值對(duì)測(cè)試方法進(jìn)行數(shù)值排序
MethodOrderer.Random:偽隨機(jī)排序并支持自定義種子配置
MethodOrderer.Alphanumeric:根據(jù)測(cè)試方法的名稱和正式參數(shù)列表按字母數(shù)字對(duì)測(cè)試方法進(jìn)行排序;
下面示例演示如何保證測(cè)試方法按通過@Order注解指定的順序執(zhí)行。
import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class OrderedTestsDemo { @Test @Order(1) void nullValues() { // perform assertions against null values } @Test @Order(2) void emptyValues() { // perform assertions against null values } @Test @Order(3) void validValues() { // perform assertions against null values } }
設(shè)置默認(rèn)方法排序
可以使用junit.jupiter.testmethod.order.default配置參數(shù)來指定默認(rèn)情況下要使用MethodOrderer的完全限定類名。就想通過@TestMethodOrder注解配置的排序器一樣,提供的類必須實(shí)現(xiàn)MethodOrderer接口。默認(rèn)排序器將用于所有測(cè)試,除非封閉的測(cè)試類或接口上存在@TestMethodOrder注解。
例如,要默認(rèn)使用MethodOrderer.OrderAnnotation方法排序器,應(yīng)將配置參數(shù)設(shè)置為相應(yīng)的完全限定類名(例如:在src/test/resouces/junit-platform.properties中)
junit.jupiter.testmethod.order.default = \ org.junit.jupiter.api.MethodOrderer$OrderAnnotation
4.2.類順序
盡管測(cè)試類通常不應(yīng)依賴于它們的執(zhí)行順序,但有時(shí)需要強(qiáng)制執(zhí)行特定的測(cè)試類執(zhí)行順序。您可能希望按隨機(jī)順序執(zhí)行測(cè)試類,以確保測(cè)試類之間沒有意外的依賴關(guān)系,或者您可能希望對(duì)測(cè)試類進(jìn)行排序以優(yōu)化生成時(shí)間,有以下方案。
首先運(yùn)行以前失敗的測(cè)試和更快的測(cè)試:“快速失敗”模式
啟用并行執(zhí)行后,首先運(yùn)行較長的測(cè)試:“最短測(cè)試計(jì)劃執(zhí)行持續(xù)時(shí)間”模式
各種其他用例
若要為整個(gè)測(cè)試套件全局配置測(cè)試類執(zhí)行順序,請(qǐng)使用 junit.jupiter.testclass.order.default 配置參數(shù)指定要使用的 ClassOrderer 的完全限定類名。提供的類必須實(shí)現(xiàn)類順序接口。
您可以實(shí)現(xiàn)自己的ClassOrderer,也可以使用以下內(nèi)置ClassOrderer實(shí)現(xiàn)。
ClassOrderer.ClassName:根據(jù)測(cè)試類的完全限定類名按字母數(shù)字順序?qū)y(cè)試類進(jìn)行排序
ClassOrderer.DisplayName:根據(jù)測(cè)試類的顯示名稱按字母數(shù)字順序?qū)y(cè)試類進(jìn)行排序(請(qǐng)參閱顯示名稱生成優(yōu)先級(jí)規(guī)則)
ClassOrderer.OrderAnnotation:根據(jù)通過@Order注解指定的值對(duì)測(cè)試類進(jìn)行數(shù)值排序
ClassOrderer.Random:對(duì)偽隨機(jī)測(cè)試類進(jìn)行排序,并支持自定義配置種子
例如,對(duì)于要在測(cè)試類上接受@Order注解,應(yīng)使用具有相應(yīng)完全限定類名的配置參數(shù)來配置ClassOrderer.OrderAnnotation類排序器,例如:在src/test/resouces/junit-platform.properties中
junit.jupiter.testclass.order.default = \ org.junit.jupiter.api.ClassOrderer$OrderAnnotation
配置的ClassOrderer將應(yīng)用于所有頂級(jí)測(cè)試類(包括靜態(tài)嵌套測(cè)試類)和@Nested測(cè)試類。
注意:頂級(jí)測(cè)試類將相對(duì)于彼此進(jìn)行排序;然而,@Nested測(cè)試類將相對(duì)于共享同一封閉類的其他@Nested測(cè)試類進(jìn)行排序。
若要在本地為@Nested測(cè)試類配置測(cè)試類執(zhí)行順序,請(qǐng)?jiān)谝判虻腀Nested測(cè)試類的封閉類上聲明@TestClassOrder注解,并提供要直接在@TestClassOrder注解中使用的ClassOrderer實(shí)現(xiàn)的類引用。配置的類排序器將以遞歸方式應(yīng)用于@Nested測(cè)試類及其子測(cè)試類。請(qǐng)注意,本地@TestClassOrder聲明始終覆蓋通過junit.jupiter.testclass.order.default配置參數(shù)全局配置的繼承@TestClassOrder聲明或ClassOrderer。
下面的示例演示如何保證@Nested測(cè)試類按通過@Order注解指定的順序執(zhí)行。
import org.junit.jupiter.api.*; @TestClassOrder(ClassOrderer.OrderAnnotation.class) class OrderedNestedTestClassesDemo { @Nested @Order(1) class PrimaryTests { @Test void test1() { //... } } @Nested @Order(2) class SecondaryTests{ @Test void test2() { //... } } }
Java junit
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。