✏️作者:银河罐头
📋系列专栏:JavaEE
🌲“种一棵树最好的时间是十年前,其次是现在”
目录
- 为什么学 Junit
- Junit 相关技术
- 注解
- @Test
- @Disabled
- @BeforeAll, @AfterAll
- @BeforeEach, @AfterEach
- 参数化
- 单参数
- CSV 获取参数
- 多参数
- 方法获取参数
- 测试用例执行顺序
- 断言
- 测试套件
以下说明针对版本是 Junit5.
为什么学 Junit
为什么学了 Selenium 还要去学 Junit?
Selenium 是自动化测试框架,Junit 是单元测试框架。
拿着一个技术写自动化测试用例(Selenium3),
拿着一个技术去管理已经编写好了的测试用例(Junit5)
Junit 相关技术
Junit 是针对 Java 的一个单元测试框架。
注解
@Test
表示当前的这个方法是一个测试用例。
添加依赖:
<!-- 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>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.1</version>
</dependency>
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class JunitTest {
@Test
public void Test01(){
System.out.println("这是 JunitTest 里面的 Test01");
}
@Test
void Test02(){
System.out.println("这是 JunitTest 里面的 Test02");
}
@Test
void Test03(){
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#s-top-left111 > a:nth-child(6)")).click();//点击"图片"
}
}
在Junit中,@Test注解的方法默认是public的。
@Disabled
忽略测试用例。
@BeforeAll, @AfterAll
@BeforeAll
//在所有的测试用例之前执行
@AfterAll
//在所有的测试用例之后执行
如果做 UI 自动化,把 创建驱动,打开网页这样的操作放在 @BeforeAll里面。
把关闭浏览器这样的操作放在@AfterAll里面。
@BeforeEach, @AfterEach
@BeforeEach
//在每一个测试用例之前执行
@AfterEach
//在每一个测试用例之后执行
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class JunitTest {
@Test
public void Test01(){
System.out.println("这是 JunitTest 里面的 Test01");
}
@Test
void Test02(){
System.out.println("这是 JunitTest 里面的 Test02");
}
@Disabled
void Test03(){
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com/");
webDriver.findElement(By.cssSelector("#s-top-left111 > a:nth-child(6)")).click();//点击"图片"
}
@BeforeAll
static void SetUp(){
System.out.println("这是 BeforeAll 里面的 SetUp");
}
@AfterAll
static void TearDown(){
System.out.println("这是 AfterAll 里面的 TearDown");
}
@BeforeEach
void beforeEachTest(){
System.out.println("这是 BeforeEach 里面的 beforeEachTest");
}
@AfterEach
void afterEachTest(){
System.out.println("这是 AfterEach 里面的 afterEachTest");
}
}
参数化
单参数
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest {
@Test
void Test01(){
System.out.println("这是 JunitTest 里面的 Test01");
}
@Test
void Test02(){
System.out.println("这是 JunitTest 里面的 Test02");
}
@Disabled
@Test
void Test03(){
System.out.println("这是 JunitTest 里面的 Test03");
}
@BeforeEach
void beforeEachTest(){
System.out.println("这是 BeforeEach 里面的 beforeEachTest");
}
@AfterEach
void afterEachTest(){
System.out.println("这是 AfterEach 里面的 afterEachTest");
}
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void Test04(int num){
System.out.println(num);
}
@ParameterizedTest
@ValueSource(strings = {"1", "2", "3"})
void Test05(String number){
System.out.println(number);
}
}
CSV 获取参数
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void test06(String name){
System.out.println(name);
}
张三1,李四1,王五1
张三2,李四2,王五2
张三3,李四3,王五3
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void test06(String name1,String name2,String name3){
System.out.println(name1);
System.out.println(name2);
System.out.println(name3);
}
张三1,李四1,王五1
张三2,李四2,王五2
张三3,李四3,王五3
@ParameterizedTest
@CsvSource({"1,2,3"})
void test08(String x){
System.out.println(x);
}
@ParameterizedTest
@CsvSource({"1,2,3,''"})
void test08(String x,String y,int z,String q){
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(q);
System.out.println("==========================");
}
多参数
方法获取参数
多参数:传不同类型的参数
@ParameterizedTest
@MethodSource("Generator")
void test07(int id, String name){
System.out.println("id = " + id + ", name = " + name);
}
public static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments(1,"张三"),
Arguments.arguments(2,"李四"),
Arguments.arguments(3,"王五"));
}
@ParameterizedTest 和 @Test 不能一起使用
测试用例执行顺序
测试用例执行顺序能够人为控制吗?
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)
public class JunitTest01 {
@Order(2)
@Test
void B(){
System.out.println("B测试用例");
}
@Order(3)
@Test
void test01(){
System.out.println("test01测试用例");
}
@Order(4)
@Test
void test02(){
System.out.println("test02测试用例");
}
@Order(1)
@Test
void A(){
System.out.println("A测试用例");
}
}
- 随机运行方式
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)
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest01 {
// @Order(2)
@Test
void B(){
System.out.println("B测试用例");
}
// @Order(3)
@Test
void test01(){
System.out.println("test01测试用例");
}
// @Order(4)
@Test
void test02(){
System.out.println("test02测试用例");
}
// @Order(1)
@Test
void A(){
System.out.println("A测试用例");
}
}
断言
断言相等
断言不相等
断言为空
断言不为空
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest02 {
@ParameterizedTest
@ValueSource(ints = {1})
void Test01(int num){
System.out.println(num);
Assertions.assertEquals(2,num);
}
}
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class JunitTest02 {
@ParameterizedTest
@ValueSource(ints = {1})
void Test01(int num){
System.out.println(num);
// Assertions.assertEquals(1,num);
// Assertions.assertNotEquals(2,num);
String str = "abc";
// Assertions.assertNull(str);
Assertions.assertNotNull(str);
}
}
测试套件
- 通过 class 运行测试用例
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
@Suite
@SelectClasses({JunitTest02.class,JunitTest.class,JunitTest01.class})
public class RunSuite {
}
- 通过包运行测试用例
package Test09;
import org.junit.jupiter.api.Test;
public class Test09 {
@Test
void Test01(){
System.out.println("package Test09 Test01");
}
}
package Test08;
import org.junit.jupiter.api.Test;
public class Test07 {
@Test
void Test007(){
System.out.println("Test08 package Test007");
}
}
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
@Suite
//@SelectClasses({JunitTest02.class,JunitTest.class,JunitTest01.class})
@SelectPackages(value = {"Test09","Test08"})
public class RunSuite {
}