详解自动化之单元测试工具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("你好");//通过
}
相关推荐
_GR9 分钟前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
无限大.22 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw24 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上24 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志27 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
不修×蝙蝠29 分钟前
八大排序--01冒泡排序
java
sky丶Mamba44 分钟前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
数据龙傲天1 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
Elastic 中国社区官方博客1 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
带带老表学爬虫2 小时前
java数据类型转换和注释
java·开发语言