详解自动化之单元测试工具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("你好");//通过
}
相关推荐
hqxstudying10 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs29 分钟前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing35 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍1 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
宇钶宇夕1 小时前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化