详解自动化之单元测试工具Junit

目录

1.注解

[1.1 @Test](#1.1 @Test)

[1.2 @BeforeEach](#1.2 @BeforeEach)

[1.3 @BeforeAll](#1.3 @BeforeAll)

[1.4 @AfterEach](#1.4 @AfterEach)

[1.5 @AfterAll](#1.5 @AfterAll)

[2. 用例的执行顺序](#2. 用例的执行顺序)

[通过 @order() 注解来排序](#通过 @order() 注解来排序)

[3. 参数化](#3. 参数化)

[3.1 单参数](#3.1 单参数)

[3.2 多参数](#3.2 多参数)

[3.3 多参数(从第三方csv文件读取数据源)](#3.3 多参数(从第三方csv文件读取数据源))

[3.4 动态参数@ParameterizedTest + @MethodSource()](#3.4 动态参数@ParameterizedTest + @MethodSource())

[4. 测试套件](#4. 测试套件)

[4.1 指定类来运行实例@Suite + @SelectClasses](#4.1 指定类来运行实例@Suite + @SelectClasses)

[4.2 指定包名来运行包下所有测试用例](#4.2 指定包名来运行包下所有测试用例)

[5. 断言 Assertions类](#5. 断言 Assertions类)

[5.1 断言匹配/不匹配Assertions.assertEquals()](#5.1 断言匹配/不匹配Assertions.assertEquals())

[5.2 断言结果为真/假Assertions.assertTrue()](#5.2 断言结果为真/假Assertions.assertTrue())

[5.3 断言结果为空/非空Assertions.assertNull()](#5.3 断言结果为空/非空Assertions.assertNull())


自动化就是 selenium 脚本来实现的,junit 是 java 的单元测试工具,只不过在实现自动化的时候需要借用一下 junit 库里面提供的一些注解

注:博主的版本为 Junit5,支持的 Java 版本最低要为 8

添加依赖:

java 复制代码
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

1.注解

1.1 @Test

@Test 表示当前方法为测试方法,执行这个类的时候会自动执行这个注释下的所有方法

java 复制代码
public class JunitTest {

    @Test//表示当前方法是测试方法,执行这个类时会自动执行这个类下的所有带 @Test 注解的用例
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

    @Test
    static void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }
}

1.2 @BeforeEach

@BeforeEach 当前方法需要在每个用例执行之前都执行一遍

java 复制代码
    @BeforeEach// 表示当前方法需要在每个用例执行之前都执行一遍
//    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }
    @Test
    void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }

1.3 @BeforeAll

@BeforeAll 表示当前方法需要在所有用例执行之前执行一次

java 复制代码
    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

    @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @Test
    static void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }

1.4 @AfterEach

@AfterEach 表示当前发给发需要在每个用例执行之后都执行一遍

java 复制代码
    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

    @AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍
//    @Test
    void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }

1.5 @AfterAll

@AfterAll 表示当前用例需要在每个用例执行之后执行一遍

java 复制代码
    @Test
    void baseZhujie(){
        System.out.println("这是一个测试方法");
    }

//    @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
//    @AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍
    @AfterAll// 当前方法需要在所有用例执行之后执行一次
//    @Test
    static void aaa(){
        System.out.println("aaa");
    }
    @Test
    void bbb(){
        System.out.println("bbb");
    }

注意:

@BeforeAll 和 @AfterAll 修饰的方法需要用 static 进行修饰才能正常运行

2. 用例的执行顺序

在先前我一直以为用例的执行顺序是按照排列顺序来执行的:

对比这两个实例中的用例的执行顺序,我又产生了是不是按照方法名的字母顺序来执行的呢?

但是后面我才了解到官方网站是并没有说明用例默认的执行顺序的!!

通过 @order() 注解来排序

  1. 要先使用注解说明当前类下所有的用例需要使用 order 注解来进行排序
  2. 然后通过 Order 来指定用例的具体执行顺序
java 复制代码
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 通过 order 来排序
public class JunitTest {
    @Order(1)
    @Test
    void editloginTest(){
    System.out.println("loginTest");
    }
    @Order(3)
    @Test
    void AindexTest(){
        System.out.println("indexTest");
    }
    @Order(2)
    @Test
    void editTest(){
        System.out.println("editTest");
    }
}

3. 参数化

目的:尽可能的用一个用例来模拟多个用户的行为

3.1 单参数

@ParameterzedTest + @ValueSource(数据类型方法 = {参数1,参数2,参数3,...})

java 复制代码
    //声明该方法为参数化方法
    @ParameterizedTest
    //参数来源--单参数
    @ValueSource(strings = {"lucky","mary","tom"})
    void methodPramsTest(String username){
        System.out.println("name:" + username );
    }

3.2 多参数

@parameterizedTest + @CsvSource({"", "", '", ...}) 每个双引号就是一组测试用例

java 复制代码
    //声明该方法为参数化方法
    @ParameterizedTest
    //参数来源--单参数
    @CsvSource({"张三,123","李四,123","王五,123"})//多参数(从注解中手动编写数据源)
    void methodPramsTest(String username,int age){
        System.out.println("name:" + username + " age:" + age);
    }

3.3 多参数(从第三方csv文件读取数据源)

@ParameterizedTest + @CsvFileSource(files = "文件路径+名字")

这里的这个 csv 文件,不要直接改后缀生成,要用系统自带的 Excel 工具,来打开和编辑 csv 文件

这里出现乱码的情况就是因为没有使用电脑系统自带的Excel来编辑

3.4 动态参数@ParameterizedTest + @MethodSource()

@ParameterizedTest + @MethodSource("方法名")

java 复制代码
    @ParameterizedTest
    @MethodSource("paramSupport")
    void methodPramsTest(String username,int age){
        System.out.println("name:" + username + " age:" + age);
    }
    static Stream<Arguments> paramSupport() throws InterruptedException {
        //构造动态参数
        String[] arr = new String[5];
        for (int i = 0; i < arr.length; i++) {
            Thread.sleep(500);
            arr[i] = System.currentTimeMillis() + "";
        }
        return Stream.of(
                Arguments.arguments(arr[0],10),
                Arguments.arguments(arr[1],14),
                Arguments.arguments(arr[2],13),
                Arguments.arguments(arr[3],12),
                Arguments.arguments(arr[4],11)
        );
    }

注意:当@MethodSource不指定数据源时,会自动寻找与用例方法名相同的静态方法

4. 测试套件

当我们需要测试多个类中的用例时,如果一个类一个类的去运行,那是非常耗时耗力的,

如果我们能够同时运行多个类就很好,所以可以使用测试套件来同时运行多个测试类

4.1 指定类来运行实例@Suite + @SelectClasses

java 复制代码
//标识为测试套件类,而不是测试类
@Suite
@SelectClasses({aaa.class,bbb.class,ccc.class})//指定类
public class runSuite {

}

注意:想要用例被运行,用例必须要被 @Test 修饰

4.2 指定包名来运行包下所有测试用例

java 复制代码
//标识为测试套件类,而不是测试类
@Suite
@SelectPackages("com.junit1121")//指定包名运行包下所有用例
public class runSuite {

}

但是我们的运行结果为:

在这里类 aaa,bbb,ccc 中的用例都没有正常运行

那是因为:

如果使用包名来指定运行的范围,那么该包下来所有的测试类的命名需要以Test/Tests结尾(T必须要大写)

5. 断言 Assertions类

5.1 断言匹配/不匹配Assertions.assertEquals()

断言匹配:Assertions.assertEquals(期待得到对象,实际得到)

断言不匹配:Assertions.assertNotEquals(期待得到对象,实际得到)

java 复制代码
    @Test
    void TestBefo(){
        ChromeDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
        String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下
        // 假如这里获取到的值不是"百度一下"而是"搜狐一下"这就是一个bug
        System.out.println(test);
        // 断言
        // 断言匹配/不匹配
        Assertions.assertEquals("搜狐一下",test);
        driver.quit();
    }

5.2 断言结果为真/假Assertions.assertTrue()

断言结果为真:Assertions.assertTrue()

断言结果为假:Assertions.assertFalse()

java 复制代码
    @Test
    void ddd(){
        // 断言结果为真/假
//        Assertions.assertTrue(1==1);
        Assertions.assertFalse(1==0);
    }

5.3 断言结果为空/非空Assertions.assertNull()

断言结果为空:Assertions.assertNull()

断言结果为非空:Assertions.assertNotNull()

java 复制代码
@Test
void ggg() {
    String aaa = null;
    Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {
    Assertions.assertNotNull("你好");//通过
}
相关推荐
Java内核笔记6 分钟前
万字避坑!Spring Boot 3.x 升 4.0 最全升级指南(附 Migration Checklist,建议收藏⭐)
java·后端
Lottie202626 分钟前
电商自动化提质增效:API接口落地的核心价值与实战用法
运维·自动化
cfm_29141 小时前
SpringBoot启动原理
java·spring boot·spring
漫随流水2 小时前
Java——springboot web案例
java·开发语言·spring boot
从此以后自律2 小时前
Java Object 类常用方法全讲解
java·开发语言
念何架构之路2 小时前
Docker 容器状态机 学习
java·学习·docker
你有我备注吗2 小时前
SQL学习之查询
java·sql·学习
xixi09243 小时前
JMeter5.6.3基础使用教程1
java·开发语言
带刺的坐椅3 小时前
用 Solon ReActAgent 落地发票识别与智能报销
java·llm·solon·react-agent
罗超驿3 小时前
15.Java异常处理:从束手无策到从容应对
java·开发语言