前面我們學(xué)習(xí)了Selenium自動(dòng)化測(cè)試框架,但是有的時(shí)候測(cè)試用例會(huì)很多,我們需要一個(gè)工具來(lái)管理這些測(cè)試用例,而Junit就是一個(gè)很好的管理工具,簡(jiǎn)單點(diǎn)來(lái)說(shuō),Junit就是一個(gè)針對(duì)Java的單元測(cè)試框架;
目錄
一.?關(guān)于Junit5
二. Junit使用
2.1 添加Maven依賴(lài)
2.2 注解
2.3 斷言
2.4 套件
一.?關(guān)于Junit5
Java 語(yǔ)言的單元測(cè)試框架相對(duì)統(tǒng)一,JUnit 和TestNG 幾乎始終處于市場(chǎng)前兩位。其中 JUnit 以較長(zhǎng)的發(fā)展歷史和源源不斷的功能演進(jìn),得到了大多數(shù)用戶(hù)的青睞;
Junit5 由?JUnit Platform
?+?JUnit Jupiter
?+?JUnit Vintage3
?部分構(gòu)成,借用 IBM Developer 的一張圖來(lái)說(shuō)明?JUnit 5 的架構(gòu)?:
JUnit Platform?:
其主要作用是在 JVM 上啟動(dòng)測(cè)試框架。它定義了一個(gè)抽象的 TestEngine API 來(lái)定義運(yùn)行在平臺(tái)上的測(cè)試框架;也就是說(shuō)其他的自動(dòng)化測(cè)試引擎或開(kāi)發(fā)人員自己定制的引擎都可以接入 Junit 實(shí)現(xiàn)對(duì)接和執(zhí)行。同時(shí)還支持通過(guò)命令行、Gradle 和 Maven 來(lái)運(yùn)行;
JUnit Jupiter?:
這是 Junit5 的核心,可以看作是承載 Junit4 原有功能的演進(jìn),包含了 JUnit 5 最新的編程模型和擴(kuò)展機(jī)制;很多豐富的新特性使 JUnit ?動(dòng)化測(cè)試更加方便、功能更加豐富和強(qiáng)大。也是測(cè)試需要重點(diǎn)學(xué)習(xí)的地方;Jupiter 本身也是?一個(gè)基于 Junit Platform 的引擎實(shí)現(xiàn),對(duì) JUnit 5 而言,JUnit Jupiter API 只是另一個(gè) API;
JUnit Vintage?:
Junit 發(fā)展了10數(shù)年,Junit 3 和 Junit 4 都積累了大量的?用戶(hù),作為新一代框 架,這個(gè)模塊是對(duì) JUnit3,JUnit4 版本兼容的測(cè)試引擎,使舊版本 junit 的?動(dòng)化測(cè)試腳本也可以順暢運(yùn)行在 Junit5 下,它也可以看作是基于 Junit Platform 實(shí)現(xiàn)的引擎范例;
JUnit 5 對(duì) Java 運(yùn)行環(huán)境的最低要求是 Java 8;
二. Junit使用
2.1 添加Maven依賴(lài)
我們?cè)诓僮?Junit 的時(shí)候要添加相應(yīng)的依賴(lài),可以去Maven倉(cāng)庫(kù)自行下載,這里給出一段代碼:
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.1</version> </dependency>
2.2 注解
1)Test
表示方法是測(cè)試方法,與Junit4的@Test不同,不能聲明任何屬性,因?yàn)镴Unit Jupiter中的測(cè)試擴(kuò)展需要通過(guò)專(zhuān)用的注解;
public class Junit_Test { @Test void Test01(){ System.out.println("測(cè)試用例1"); } @Test void Test02(){ System.out.println("測(cè)試用例2"); } }
?
2)Disable
用于禁用一個(gè)測(cè)試類(lèi)或測(cè)試方法;類(lèi)似于JUnit 4的' @Ignore '。即執(zhí)行單元測(cè)試時(shí),會(huì)忽略對(duì)應(yīng)的測(cè)試類(lèi)或者測(cè)試方法;
public class Junit_Test { @Test void Test01(){ System.out.println("測(cè)試用例1"); } @Test void Test02(){ System.out.println("測(cè)試用例2"); } @Disabled void Test03(){ System.out.println("測(cè)試用例3"); } }
3)?BeforeAll 和 AfterAll
BeforeAll:表示方法在所有測(cè)試方法之前運(yùn)行;
AfterAll:表示方法在所有測(cè)試方法之后運(yùn)行;
public class Junit_Test { @AfterAll // 需要添加一個(gè)關(guān)鍵字static,是針對(duì)這個(gè)類(lèi)的 static void Test05(){ System.out.println("測(cè)試用例AfterAll"); } @Test void Test01(){ System.out.println("測(cè)試用例1"); } @Test void Test02(){ System.out.println("測(cè)試用例2"); } @Disabled void Test03(){ System.out.println("測(cè)試用例3"); } @BeforeAll // 需要添加一個(gè)關(guān)鍵字static,是針對(duì)這個(gè)類(lèi)的 static void Test04(){ System.out.println("測(cè)試用例BeforeAll"); }
?針對(duì)這個(gè)操作,通常情況下,創(chuàng)建驅(qū)動(dòng),打開(kāi)網(wǎng)頁(yè),都放到BeforeAll里面,關(guān)閉瀏覽器放到AfterAll里;
4)BeforeEach 和?AfterEach
BeforeEach:表示方法應(yīng)該在當(dāng)前類(lèi)中每個(gè) @Test, @RepeatedTest, @ParameterizedTest 或 @TestFactory 方法之前執(zhí)行;類(lèi)似于Junit4的@Before 。即在每個(gè)單元測(cè)試之前執(zhí)行,如果測(cè)試類(lèi)有n個(gè)測(cè)試方法,則被執(zhí)行n次;
AfterEach:
表示方法應(yīng)該在當(dāng)前類(lèi)中每個(gè) @Test, @RepeatedTest, @ParameterizedTest 或 @TestFactory 方法之后執(zhí)行;類(lèi)似于Junit4的@After 。即在每個(gè)單元測(cè)試之后執(zhí)行,如果測(cè)試類(lèi)有n個(gè)測(cè)試方法,則被執(zhí)行n次;
public class Junit_Test { @AfterAll // 需要添加一個(gè)關(guān)鍵字static,是針對(duì)這個(gè)類(lèi)的 static void Test05(){ System.out.println("測(cè)試用例AfterAll"); } @Test void Test01(){ System.out.println("測(cè)試用例1"); } @Test void Test02(){ System.out.println("測(cè)試用例2"); } @Disabled void Test03(){ System.out.println("測(cè)試用例3"); } @BeforeAll // 需要添加一個(gè)關(guān)鍵字static,是針對(duì)這個(gè)類(lèi)的 static void Test04(){ System.out.println("測(cè)試用例BeforeAll"); } @BeforeEach void Test06(){ System.out.println("測(cè)試用例BeforeEach"); } @AfterEach void Test07(){ System.out.println("測(cè)試用例AfterEach"); } }
5)ParameterizedTest
表示方法是參數(shù)化測(cè)試,這里我們需要引入對(duì)應(yīng)的依賴(lài),這里和Junit的版本保持一致:
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency>
@ParameterizedTest // 傳入整形參數(shù) @ValueSource(ints = {1,2,3}) void Test08(int num){ System.out.println(num); } @ParameterizedTest // 傳入字符串 @ValueSource(strings ={"1","2","3"}) void Test09(String nums){ System.out.println(nums); }
?
CSV獲取參數(shù):
@ParameterizedTest @CsvFileSource(resources = "test01.csv") void Test10(String name){ System.out.println(name); }
?
方法獲取參數(shù),可傳入不同類(lèi)型的參數(shù):
// 通過(guò)方法名獲取參數(shù) @ParameterizedTest @MethodSource("method") void Test11(int num, String name) { System.out.println(num + ":" + name); } // 輸出不同類(lèi)型的參數(shù) public static Stream<Arguments> method() { return Stream.of(Arguments.arguments(1, "張三"), Arguments.arguments(2, "李四"), Arguments.arguments(3, "王五")); }
6)TestMethodOrder
按照指定順序來(lái)執(zhí)行測(cè)試用例
// 按照指定順序 //@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 按照隨機(jī)順序 @TestMethodOrder(MethodOrderer.Random.class) public class Junit_Test1 { // 第三個(gè)執(zhí)行 @Order(3) @Test void Test01() { System.out.println("測(cè)試用例1"); } // 第一個(gè)執(zhí)行 @Order(1) @Test void Test02() { System.out.println("測(cè)試用例2"); } // 第二個(gè)執(zhí)行 @Order(2) @Test void Test03() { System.out.println("測(cè)試用例3"); } }
2.3 斷言
斷言(assertions)是測(cè)試方法中的核心部分,用來(lái)對(duì)測(cè)試需要滿足的條件進(jìn)行驗(yàn)證。這些斷言方法都是 orgjuiit.jupiter.api.Assertions的靜態(tài)方法。JUnit5內(nèi)置的斷言可以分成如下幾個(gè)類(lèi)別:檢查業(yè)務(wù)邏輯返回的數(shù)據(jù)是否合理;
1)assertEquals :判斷兩個(gè)對(duì)象或兩個(gè)原始類(lèi)型是否相等
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num){ // 第一個(gè)參數(shù)是預(yù)期的,第二個(gè)參數(shù)是實(shí)際的 Assertions.assertEquals(1,num); System.out.println(num); }
2)assertNotEquals:判斷兩個(gè)對(duì)象或兩個(gè)原始類(lèi)型是否不相等
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num){ // 第一個(gè)參數(shù)是預(yù)期的,第二個(gè)參數(shù)是實(shí)際的 // 判斷是否相等 //Assertions.assertEquals(1,num); // 判斷不相等 Assertions.assertNotEquals(2,num); System.out.println(num); }
3)assertSame:判斷兩個(gè)對(duì)象引用是否指向同一個(gè)對(duì)象
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num) { // 判斷是否指向同一個(gè)對(duì)象 Object obj1 = new Object(); Object obj2 = new Object(); Assertions.assertSame(obj1, obj2, "不是同一個(gè)對(duì)象"); }
4)assertNotNull:判斷給定的對(duì)象引用是否不為null
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num){ // 判斷是否為空 String str = null; Assertions.assertNull(str); }
2.4 套件
使用 JUnit5 測(cè)試套件,您可以運(yùn)行分散到多個(gè)測(cè)試類(lèi)和不同包中的測(cè)試;
1)SelectClasses指定通過(guò)class運(yùn)行測(cè)試套件時(shí)要選擇的類(lèi)
@Suite // 先執(zhí)行Junit_Test.class,再執(zhí)行Junit_Test1.class @SelectClasses({Junit_Test.class,Junit_Test1.class}) public class RunSuite { }
1)SelectPackages指定通過(guò)包運(yùn)行測(cè)試套件時(shí)要選擇的類(lèi)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-463396.html
@Suite @SelectPackages(value = {"Pack1","Pack2"}) public class RunSuite { }
到這里關(guān)于Junit常用的操作就介紹完了,有問(wèn)題的小伙伴可以私信我,感覺(jué)有幫助的,希望可以留下你們的小贊~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-463396.html
到了這里,關(guān)于Junit5單元測(cè)試框架詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!