✏️作者:银河罐头
📋系列专栏: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 {
}





![[期末网页作业]-小米官网(html+css+js)](https://img-blog.csdnimg.cn/2427fd4b89e840c5b4d1bb9992762837.png)














