1.junit
1.1 junit是什么
JUnit是一個Java語言的單元測試框架。
雖然我們已經(jīng)學(xué)習(xí)了selenium測試框架,但是有的時候測試用例很多,我們需要一個測試工具來管理這些測試用例,Junit就是一個很好的管理工具,簡單來說Junit是一個針對Java單元測試的框架。Junit由Junit Platform _ Junit Jupiter + junit Vintage3部分組成。
1.2 Junit和Selenium的關(guān)系
Junit和Selenium是完全不同的兩個東西?。。?/strong>
在一個燈串上,如果說selenium編寫的測試用例是一個小燈泡,那么junit就是把它們串起來的線。junit是用來管理selenium的測試用例的。
2.junit技術(shù)
2.0 前置工作
在pom.xml文件中添加依賴
引入selenium:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.7.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
參數(shù)化:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.2</version>
</dependency>
測試套件:
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.1</version>
<scope>test</scope>
</dependency>
2.1 junit常用注解
@Test
@Test表示當(dāng)前的方法是一個測試用例
使用:
@Test
void + 方法名(){}
舉例:
//表示當(dāng)前的方法是一個測試用例
@Test
void Test01(){
// 創(chuàng)建了一個options對象,用來給請求設(shè)置一些參數(shù)
ChromeOptions options = new ChromeOptions();
// 允許所有的請求
options.addArguments("--remote-allow-origins=*");
//設(shè)置驅(qū)動路徑
System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");
// 創(chuàng)建了一個驅(qū)動
WebDriver webDriver = new ChromeDriver(options);
//打開百度
webDriver.get("https://www.baidu.com/");
}
@BeforeAll 和 @AfterAll
這兩個注解在整個類測試的時候會執(zhí)行一次。
@BeforeAll表示在當(dāng)前類所有測試用例執(zhí)行之前運(yùn)行
@AfterAll表示在當(dāng)前類所有測試用例執(zhí)行之后運(yùn)行
并且這兩個方法都有static修飾,都只執(zhí)行一次
使用:
@BeforeAll
static void 方法名(){}
舉例:
//當(dāng)前類里面所有的測試用例執(zhí)行之前執(zhí)行這個方法
@BeforeAll
static void SetUp(){
System.out.println("開始執(zhí)行@BeforeAll修飾的方法");
}
使用:
@AfterAll
static void 方法名(){}
舉例:
//當(dāng)前類里面所有的測試用例執(zhí)行之后執(zhí)行這個方法
@AfterAll
static void TearDown(){
System.out.println("開始執(zhí)行@AfterAll對應(yīng)的方法");
}
運(yùn)行結(jié)果:
@BeforeEach 和 @AfterEach
這兩個注解會在每一個測試用例執(zhí)行的時候都執(zhí)行一次。
- @BeforeEach表示在每個測試方法執(zhí)行前運(yùn)行
- @AfterEach表示在每個測試方法執(zhí)行后運(yùn)行
舉例:
@BeforeEach
void BeforeTest(){
System.out.println("這是一個@BeforeEach注解");
}
@AfterEach
void AfterTest(){
System.out.println("這是一個@AfterEach注解");
}
結(jié)果:
@Disabled
作用:忽略當(dāng)前的測試用例
舉例:
//忽略當(dāng)前的測試用例
@Disabled
//表示當(dāng)前的方法是一個測試用例
@Test
void Test01(){
// 創(chuàng)建了一個options對象,用來給請求設(shè)置一些參數(shù)
ChromeOptions options = new ChromeOptions();
// 允許所有的請求
options.addArguments("--remote-allow-origins=*");
//設(shè)置驅(qū)動路徑
System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");
// 創(chuàng)建了一個驅(qū)動
WebDriver webDriver = new ChromeDriver(options);
//打開百度
webDriver.get("https://www.baidu.com/");
}
結(jié)果:并沒有執(zhí)行這個測試用例
2.2 junit測試用例執(zhí)行順序
有人覺得junit的測試順序是從上到下的,是這樣嗎?
先來看一個示例:
@Test
void Test06(){
System.out.println("這是測試用例5");
}
@Test
void Test05(){
System.out.println("這是測試用例4");
}
@Test
void Test04(){
System.out.println("這是測試用例3");
}
@Test
void Test02(){
System.out.println("這是測試用例1");
}
@Test
void Test03(){
System.out.println("這是測試用例2");
}
結(jié)果:
以上結(jié)果表明了它不是按照從上到下執(zhí)行的測試用例。
指定順序執(zhí)行
使用@TestMethodOrder(MethodOrderer.OrderAnnotation.class)+ @Order(數(shù)字)
注解順序執(zhí)行測試用例。
舉例:
//按照指定順序執(zhí)行測試用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
@Order(1)
@Test
void Test06(){
System.out.println("這是測試用例5");
}
@Order(2)
@Test
void Test05(){
System.out.println("這是測試用例4");
}
@Order(3)
@Test
void Test04(){
System.out.println("這是測試用例3");
}
@Order(4)
@Test
void Test02(){
System.out.println("這是測試用例1");
}
@Order(5)
@Test
void Test03(){
System.out.println("這是測試用例2");
}
}
結(jié)果:
是按照order里面的順序執(zhí)行的。
隨機(jī)執(zhí)行
使用@TestMethodOrder(MethodOrderer.Random.class)
隨機(jī)執(zhí)行測試用例。
舉例:
//按照隨機(jī)順序執(zhí)行測試用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {
@Order(1)
@Test
void Test06(){
System.out.println("這是測試用例5");
}
@Order(2)
@Test
void Test05(){
System.out.println("這是測試用例4");
}
@Order(3)
@Test
void Test04(){
System.out.println("這是測試用例3");
}
@Order(4)
@Test
void Test02(){
System.out.println("這是測試用例1");
}
@Order(5)
@Test
void Test03(){
System.out.println("這是測試用例2");
}
}
2.3 參數(shù)化測試
測試方法一般需要傳參數(shù)。
單參數(shù)
使用 @ParameterizedTest + @ValueSource()
配合傳遞單參數(shù)
@ParameterizedTest : 注冊參數(shù)
?。?!注意:這兩個注解不能和@Test一起使用,并且只能傳一種類型的參數(shù)
示例:
@ParameterizedTest //注冊
@ValueSource(strings = {"1","2","3"})
void Test07(String str){
System.out.println(str);
}
結(jié)果:
多參數(shù)
上面只可以傳入一種類型的參數(shù),所以如果我們需要傳入多種類型的參數(shù),就可以使用csv 。
CSV
①直接傳參數(shù):使用@ParameterizedTest + @CsvSource()
配合
舉例:
@ParameterizedTest
@CsvSource({"1,2","3,4"})
void Test08(String str,int num){
System.out.println(str+" "+num);
}
結(jié)果:
②傳遞文件:使用@ParameterizedTest+ @CsvFileSource(resources = "文件名.csv")
配合
!?。∽⒁猓何募仨毷?csv類型
示例:
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void Test09(int id,String name){
System.out.println("id="+id+",name="+name);
}
test01.csv文件內(nèi)容:
1,溫溫
2,蘇蘇
3,憐憐
結(jié)果:
方法傳參
使用@ParameterizedTest + @MethodSource("方法名")
傳入一個方法
示例:
@ParameterizedTest //注冊參數(shù)
@MethodSource("Generator") //注冊的參數(shù)是什么
void Test10(String num,String name){
System.out.println(num+" "+name);
}
Generator方法代碼:
public static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments("1,溫溫","2,蘇蘇"));
}
結(jié)果:
2.4 斷言
在軟件測試中,斷言(Assertion)是一種用于檢查程序或系統(tǒng)在執(zhí)行某些操作或運(yùn)行某些代碼后是否符合預(yù)期行為的技術(shù)手段。在測試中,斷言通常用于驗(yàn)證代碼的正確性,確保代碼在滿足特定條件時會產(chǎn)生預(yù)期的結(jié)果。
示例:
@ParameterizedTest
@ValueSource(ints = {10})
void Test11(int num){
//斷言相等
Assertions.assertEquals(num,10);
//斷言不相等
Assertions.assertNotEquals(num,11);
}
@ParameterizedTest
@ValueSource(strings = {"1"})
void Test11(int num){
//斷言為空
Assertions.assertNull(num);
//斷言不為空
Assertions.assertNotNull(num);
}
2.5 測試套件
測試套件(test suite)有時也稱為驗(yàn)證套件(validation suite),是許多測試用例的集合,測試用例可用來測試一程式是否正確工作,測試套件包括許多測試用例,一般也會有針對測試用例及其測試目的的詳細(xì)說明,在進(jìn)行測試時的系統(tǒng)組態(tài)資訊以及測試前需進(jìn)行的步驟。
通過測試套件,將服務(wù)于同一個測試目的或同一運(yùn)行環(huán)境下的一系列測試用例有機(jī)的組合起來。測試套件是按照測試計(jì)劃所定義的各個階段的測試目標(biāo)決定的,即先有測試計(jì)劃,后面才有測試套件。
例如:此時有三個類的測試用例都需要測試。
通過測試套件全部測試:
方法①:在括號中寫入測試類文章來源:http://www.zghlxwxcb.cn/news/detail-608405.html
@Suite
@SelectClasses({JunitTest.class, JunitTest02.class})
public class RunSuite {
}
方法②:根據(jù)指定的包來運(yùn)行多個測試用例文章來源地址http://www.zghlxwxcb.cn/news/detail-608405.html
@Suite
@SelectPackages({"org.example.junit01","org.example.junit"})
public class RunSuit {
}
到了這里,關(guān)于【軟件測試】單元測試工具---Junit詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!