Junit
Junit是一個(gè)開源的用于Java語言的單元測試框架,也是Java方向使用最廣泛的單元測試框架。
在pom.xml中引入Junit5相關(guān)依賴
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.8.2</version>
<scope>test</scope>
</dependency>
1. 注解
-
@Test
:表示一個(gè)方法/用例 -
BeforeEach
:表示被注解的方法在其它所有方法執(zhí)行前都要執(zhí)行一遍,也就是說其它方法有3個(gè)它就要執(zhí)行3遍 -
@BeforeAll
:表示被注解的方法在其它方法之前執(zhí)行(使用該注解的方法必須定義成static) -
@AfterEach
:表示被注解的方法應(yīng)該在其它方法執(zhí)行后都要執(zhí)行一遍,其它方法有4個(gè)就執(zhí)行4遍 -
@AfterAll
:表示被注解的方法在其它方法后執(zhí)行一遍就可以了(使用該注解的方法必須定義成static)
public class JunitDemo {
private static ChromeOptions options;
private static ChromeDriver driver;
@BeforeAll
public static void init() {
options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));//隱式等待兩秒
}
@Test
public void test1() {
driver.get("https://www.baidu.com");
driver.findElement(By.cssSelector("#kw")).sendKeys("Junit");
driver.findElement(By.cssSelector("#su")).click();
}
@AfterAll
public static void quit() throws InterruptedException {
driver.quit();
}
}
前后執(zhí)行代碼
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class JunitDemo2 {
@BeforeEach
public void BeforeEach() {
System.out.println("@BeforeEach");
}
@AfterEach
public void AfterEach() {
System.out.println("@AfterEach");
}
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
@Test
public void test3() {
System.out.println("test3");
}
}
運(yùn)行結(jié)果
@BeforeEach
test1
@AfterEach
@BeforeEach
test2
@AfterEach
@BeforeEach
test3
@AfterEach
2.斷言
很多編程語言都有斷言C語言和Java都是有斷言功能的,但斷言一遍是出現(xiàn)在測試階段,如果在生產(chǎn)環(huán)境使用斷言,只要一旦觸發(fā)斷言程序就會(huì)立即終止。
在Junit中提供了一些斷言方法
-
Assertions.assertEquals(預(yù)期值,實(shí)際值)
:如果預(yù)期和實(shí)際值不相同就會(huì)觸發(fā)斷言 -
Assertions.assertNotEquals(預(yù)期值,實(shí)際值)
:如果預(yù)期值和實(shí)際值匹配就會(huì)觸發(fā)斷言
public class AssertDemo {
private static ChromeOptions options;
private static ChromeDriver driver;
@BeforeAll
public static void init() {
options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
}
@Test
public void test1() {
driver.get("https://www.baidu.com");
WebElement element = driver.findElement(By.cssSelector("#su"));
String button = element.getAttribute("value");
Assertions.assertEquals("百度一下",button);
}
@AfterAll
public static void quit() {
driver.quit();
}
}
-
Assertions.assertTrue()
:如果括號里的表達(dá)式值為False就會(huì)觸發(fā)斷言 -
Assertions.assertFalse()
:如果括號里的表達(dá)式值為True就會(huì)觸發(fā)斷言 -
Assertions.assertNull()
:如果括號里的表達(dá)式的值不為null就會(huì)觸發(fā)斷言 -
Assertions.assertNotNull()
:如果括號里的表達(dá)式的值為null就會(huì)觸發(fā)斷言
3.測試用例執(zhí)行順序
Junit的默認(rèn)執(zhí)行順序是不確定的,官網(wǎng)文檔中也沒有給出明確的執(zhí)行順序。但我們可以使用Junit里提供的方法來手動(dòng)設(shè)置用例的執(zhí)行順序,文檔中給出了很多的排序方法。
這里介紹方法的排序,通過@order
注解來排序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//標(biāo)注當(dāng)前類使用方法來進(jìn)行排序
public class JunitOrderTest {
@Test
@Order(3)
void test1() {
System.out.println("aaa");
}
@Test
@Order(2)
void test2() {
System.out.println("bbb");
}
@Test
@Order(1)
void test3() {
System.out.println("ccc");
}
}
運(yùn)行結(jié)果
ccc
bbb
aaa
4.測試套件Suite
1) 指定多個(gè)類
通過測試套件可以將多個(gè)類的測試用例一起執(zhí)行,通過@Suite
和@SelectClasses
注解配合實(shí)現(xiàn)
/**
* 指定類來添加到套件中執(zhí)行
*/
@Suite
@SelectClasses({JunitDemo.class,JunitDemo2.class})
public class RunAllSuite {
@Test
void test() {
System.out.println("@Suite");
}
}
運(yùn)行結(jié)果
2) 指定包
指定包,添加到套件中執(zhí)行,需要注意的是執(zhí)行包下面所有Test命名的文件中的所有@Test注解的用例。
這里指定的是junit包下的Test命名的類
@Suite
@SelectPackages("junit")//指定包下所有以Test命名的類中所有被@Test注解的用例
public class runAllSuite {
}
5. 參數(shù)化
有的時(shí)候我們的測試方法需要傳遞參數(shù),而有多個(gè)參數(shù)寫多個(gè)方法又比較麻煩,所以需要使用Junit的參數(shù)化。通過@ParameterizedTest
注解標(biāo)注類型參數(shù)化。
1) 單參數(shù)
單參數(shù)通過@ValueSource
注解來實(shí)現(xiàn),@ValueSource(類型={參數(shù)1,參數(shù)2,…})
@ValueSource
中支持的類型有:
- short
- byte
- int
- long
- float
- double
- char
- boolean
- Stirng
- Class
在對應(yīng)的類型使用后面+s使用
public class ParameterTest {
@ParameterizedTest
@ValueSource(strings = {"張三","李四","王五"})
void test1(String name) {
System.out.println("name:"+name);
}
}
運(yùn)行結(jié)果
name:張三
name:李四
name:王五
2) 多參數(shù)
多參數(shù)使用@CsvSource
注解,@CsvSource(value={“張三,18”,“李四,20”,…})
public class ParameterTest {
/**
* 多參數(shù)
* @param name
* @param age
*/
@ParameterizedTest
@CsvSource(value = {"張三,18","李四,20","王五,25"})
void test2(String name,Integer age) {
System.out.println("name:"+name+"age:"+age);
}
}
運(yùn)行結(jié)果
name:張三
name:李四
name:王五
多參數(shù)可以指定分割符,通過delimiterString屬性設(shè)置
public class ParameterTest {
@ParameterizedTest
@CsvSource(value = {"張三-18","李四-20","王五-25"},delimiterString = "-")
void test3(String name,Integer age) {
System.out.println("name:"+name+"age:"+age);
}
}
如果參數(shù)里包含逗號就要使用單引號做轉(zhuǎn)義字符
@ParameterizedTest
@CsvSource(value = {"'張,三',18","李四,20","王五,25"})
void test2(String name,Integer age) {
System.out.println("name:"+name+"age:"+age);
}
3) 文件注入
如果參數(shù)非常多,在代碼中編寫不太友好,就可以借助文件注入的方式來添加,通過@CsvFileSource
來指定
指定讀取resources目錄
@ParameterizedTest
@CsvFileSource(resources = "/test.txt",delimiterString = " ") //指定文件中參數(shù)以空格分割
void test4(String name,int age) {
System.out.println("name:"+name+"age:"+age);
}
test.txt文件內(nèi)容
張三 18
李四 20
王五 25
趙六 30
指定讀取本機(jī)文件
@ParameterizedTest
@CsvFileSource(files = "C:\\Users\\HeHanYu\\Desktop\\code\\Java\\JavaCode\\spring\\ssm_blog_system\\src\\test\\java\\file\\test.txt",delimiterString = " ")
void test5(String name,int age) {
System.out.println("name:"+name+"age:"+age);
}
6.動(dòng)態(tài)參數(shù)
單參數(shù)
通過@MethodSource
指定方法的返回值為動(dòng)態(tài)參數(shù),返回值可以是Stream流,List、Set等
public class ParameterTest {
@ParameterizedTest
@MethodSource("demo")
void test6(String name) {
System.out.println(name);
}
static Stream<String> demo() {
return Stream.of("張三","李四");
}
static List<String> createV() {
List<String> list = new ArrayList<>();
list.add("張三");
list.add("李四");
list.add("王五");
return list;
}
static Set<String> createValue() {
Set<String> set = new HashSet<>();
set.add("張三");
set.add("李四");
set.add("王五");
return set;
}
}
多參數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-503048.html
使用Arguments
可以實(shí)現(xiàn)多參數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-503048.html
public class ParameterTest {
@ParameterizedTest
@MethodSource("multiparameter")
void test7(String name,int age) {
System.out.println(name+":"+age);
}
static Stream<Arguments> multiparameter() {
return Stream.of(Arguments.arguments("張三",18),Arguments.arguments("李四",25));
}
}
到了這里,關(guān)于單元測試框架——Junit5的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!