【Junit5】就这篇,带你从入门到进阶

news2024/11/25 12:34:46

目录

前言 

1.前置工作

2、注解

2、断言(Assertions类) 

2.1、断言 匹配/不匹配

2.2、断言结果 为真/为假

2.3、断言结果 为空/不为空

3、用例的执行顺序

3.1、用例执行顺序是怎样的?

3.2、通过order注解来排序

4、参数化

4.1、单参数

4.2、多参数

4.2.1、方法一:注解里手动编写数据源

4.2.2、方法二:从第三方csv文件读取数据源

4.3、动态参数

5、测试套件

5.1、指定类来运行用例

5.2、指定包名来运行包下的所有用例


前言 


我们对自己的项目实施Web自动化测试使用的是selenium脚本实现的,而junit就是一个强大的单元测试工具,让测试更加完整全面,接下来我们就来学习一下junit的强大功能吧~

1.前置工作


首先因该先在我们的项目中引入junit5的依赖,如下:

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.8.2</version>
            <scope>test</scope>
        </dependency>

注意:

a)junit5支持的java版本最低为8;

b)如果之前用过junit,例如junit4,现在下载junit5,可能会下载失败,所以最好找到之前下载好的junit4依赖,删除之后再重新下载junit5。

2、注解


junit中提供了非常强大的注解功能,想要很好的测试自己的项目,我们需要知道以下五个注解:

1.@Test 是作用在方法上的,表示该方法时测试方法,执行当前这个类时,会自动的执行该类下所有带@Test注解的用例。

例如,创建一个Test1类,再这个类里创建两个方法aaa和bbb,只有aaa方法有@Test注解,那么就只会执行aaa方法,代码如下:

public class Test1 {

    @Test
    public void aaa() {
        System.out.println("执行了aaa方法");
    }

    public void bbb() {
        System.out.println("执行了bbb方法");
    }

}

执行结果如下:

2.@BeforeEach 是作用在方法上的,表示当前方法需要再每一个用例执行之前都执行一次。

例如,当前类下有两个测试用例(aaa和bbb方法),还有一个被@BeforeEach修饰的方法(ccc方法),那么当程序运行起来时,执行的顺序就是 ccc -> aaa -> ccc -> bbb ,如下代码:

class Test2 {

    @Test
    public void aaa() {
        System.out.println("执行了aaa方法");
    }

    @Test
    public void bbb() {
        System.out.println("执行了bbb方法");
    }

    @BeforeEach
    public void ccc() {
        System.out.println("执行了ccc方法");
    }

}

执行结果如下:

3.@BeforeAll 是作用在方法上的,表示当前方法需要在当前类下所有用例执行之前执行一次,并且被该注解修饰的方法必须是静态方法。

例如:当前类下有两个用例aaa和bbb方法,还有一个被@BeforeAll修饰的静态方法ccc,那么当程序运行起来时,就会先执行ccc方法,在执行aaa和bbb方法,如下代码:

class Test3 {

    @Test
    public void aaa() {
        System.out.println("执行了aaa方法");
    }

    @Test
    public void bbb() {
        System.out.println("执行了bbb方法");
    }

    @BeforeAll
    public static void ccc() {
        System.out.println("执行了ccc方法");
    }

}

执行结果如下:

4.@AfterEach 的功能和 @BeforeEach 相反,也就是说表示当前方法需要每个用例执行之后都执行一次。

@AfterAll 的功能和 @BeforeAll 相反,也就是说表示当前方法在当前类下的所有用例执行完了以后执行一次,并且被该注解修饰的方法必须是静态的。

2、断言(Assertions类) 


2.1、断言 匹配/不匹配

assertEquals:有两个参数(参数支持很多种类型,例如Java的基本类型,还有很多这里就不一一列举了),第一个参数是我们期望的结果,第二个参数是实际的结果,此方法表示如果期望结果和实际结果一致就继续执行下一条指令,若不一致,就会打印如下日志

上图就是比较 期望结果1,和实际结果2,代码如下:

    @Test
    public void test() {
        Assertions.assertEquals(1, 2);
    }

那么,不难理解,asserNotEquals 和 assertEquals 表示意思正好相反,也就是说 asserNotEquals 当期望结果和实际结果符合时,就会报错并打印日志。

2.2、断言结果 为真/为假

assertTrue:有一个boolean类型的参数(状态),就像一个if语句一样,用来判断所给的状态是否为true,若为true则程序继续正常运行,若为false则打印如下日志:

上图的状态就是比较1 == 2,代码如下:

    @Test
    public void test2() {
        Assertions.assertTrue(1 == 2);
    }

那么不难理解,assertFalse 就表示当状态的结果为true时,程序就会报错并打印日志。

2.3、断言结果 为空/不为空

assertNull:有一个Object(这里讲的是常用用法)参数,用来判断这个参数是否为null,若这个参数为null,则程序正常运行,若不为null,则程序报错并打印如下日志:

上图的断言参数是一个赋值了"hello0"的String类型对象,如下代码:

    @Test
    public void test3() {
        String str = "hello";
        Assertions.assertNull(str);
    }

那么不难理解,assertNotNull 就是表示当参数为空时,程序报错并打印日志。

3、用例的执行顺序


3.1、用例执行顺序是怎样的?

junit 5 官方网站并没有明确说明用例默认的执行顺序的规则,实际上,测试用例并不会按照我们编写的用例的顺序来执行,这会带来什么问题呢?

例如,我们要对QQ登录页面编写测试用例,那么我们期望的顺序是:1.检查登录页面是否正确、2.检查能否正常登录、3.异常登录。但由于实际的用例执行顺序不可知,有可能就变成了先检查“2.能否正常登录”,然后再“1.检查登录页面是否正常”,显然不合理,那么我们有什么办法控制测试用例的执行顺序呢?接着往下看~

3.2、通过order注解来排序

首先要先使用注解 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 说明当前类下素有的用例需要使用 order 注解来进行排序(注意:该注解必须要用在类上),然后通过Order注解来指定测试用例的执行顺序,该注解的参数便是执行顺序。

例如,现在有三个测试方法,按照指定顺序执行,如下代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Test2 {

    @Test
    @Order(1)
    public void aaa() {
        System.out.println("第一执行aaa");
    }

    @Test
    @Order(2)
    public void bbb() {
        System.out.println("第二执行bbb");
    }

    @Test
    @Order(3)
    public void ccc() {
        System.out.println("第三执行ccc");
    }

}

执行结果如下:

4、参数化


什么是参数化的用例呢?就是尽可能的通过一个用例,多组参数来模拟用户的行为。在使用参数化的注解之前需要先用注解 @ParameterizedTest 声明该方法为参数化方法,接着参数化的注解有两种实现方法,如下:

Ps:使用了参数化注解的方法,就不用使用@Test注解了~

4.1、单参数

单参数便是指测试的方法只有一个参数~

通过 @ValueSource 注解提供数据来源。

使用方式: @ValueSource(数据类型方法={参数1,参数2....})

数据类型方法如下(来自官方文档):

例如,有三个String类型的参数,如下代码:

class Solution {

    @ParameterizedTest
    @ValueSource(strings = {"周杰伦", "林俊杰", "薛之谦"})
    public void getString(String str) {
        System.out.println(str);
    }

}

执行结果如下:

4.2、多参数

多参数便是指测试的方法有多个参数~

4.2.1、方法一:注解里手动编写数据源

通过 @CsvSource 注解提供数据来源。

使用方式:每一个双引号就是一组参数(测试用例)

如下代码:

    @ParameterizedTest
    @CsvSource({"周杰伦,18", "林俊杰,19", "薛之谦,20"})
    public void getString(String name, String age) {
        System.out.println("name:" + name + ",age:" + age);
    }

执行结果:

 但是当我们的测试用例有几十上百个的时候,再用这个方法来写测试用例就不合适了,那么就可以使用以下办法~

4.2.2、方法二:从第三方csv文件读取数据源

针对一个测试方法有很多种用例时,我们可以使用Excel表格来填写数据,具体的,先创建一个csv为后缀的文件后,一定要注意,使用系统自带的Excel工具来打开和编辑csv文件,如下:

 

 通过 @CsvFileSource 注解提供数据来源。

使用方式:注解的参数就是写测试用例的文件的绝对路径。

如下代码:

    @ParameterizedTest
    @CsvFileSource(files = "D:\\mytest\\test.csv")
    public void getString(String name, String age) {
        System.out.println("name:" + name + ",age:" + age);
    }

 执行结果:

4.3、动态参数

如果我们希望测试的参数是动态改变的(比如引入时间戳),就需要写一个方法,在这个方法里创建随机测试实例,然后将这个方法作为数据源,也就是 @MethodSource 注解的参数(表示参数的该方法必须是静态的方法)。

如下代码:

    @ParameterizedTest
    @MethodSource("createString")//匹配的方法必须是静态的
    public void getString(String name, int id) {
        System.out.println("name:" + name + ",id:" + id);
    }


    /**
     * 注意:
     * 1.首先方法必须是静态的
     * 2.如果返回的数据类型是统一的,就直接写具体类型。
     * 如果不统一,就需要使用组合类型Arguments
     * @return
     */
    public static Stream<Arguments> createString() {
        String[] arr = new String[3];
        for(int i = 0; i < 3; i++) {
            arr[i] = System.currentTimeMillis() + "";
        }
        return Stream.of(
                Arguments.arguments(arr[0], 1),
                Arguments.arguments(arr[1], 2),
                Arguments.arguments(arr[2], 3)
        );
    }

执行结果:

5、测试套件


有时候我们需要用一个或多了个类下的测试用例,或者是指定包来运行包下的所有测试用例,就需要用到测试套件。

5.1、指定类来运行用例

首先要创建一个类,通过 @Suite 注解标识该类为测试套件类(不是测试类),然后使用 @SelectClasses 注解来声明我们要指定的类(通过这个类来运行测试用例),如下代码:

Ps:要运行的用例必须要使用 @Test 注解

测试套件类如下:

@Suite
@SelectClasses({one.class, two.class})
public class RunSuite {
}

测试类如下:

public class one {

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

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

}
public class two {

    @Test
    public void ccc() {
        System.out.println("ccc");
    }

    @Test
    public void ddd() {
        System.out.println("ddd");
    }

}

执行结果如下:

5.2、指定包名来运行包下的所有用例

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

代码如下:

@Suite
@SelectPackages("com.oneTest")
public class RunSuite {
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Firefox 110, Chrome 110, Chromium 110 官网离线下载 (macOS, Linux, Windows)

Mozilla Firefox, Google Chrome, Chromium, Apple Safari 请访问原文链接&#xff1a;https://sysin.org/blog/chrome-firefox-download/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 天下只剩三种&#xff08;主流&am…

feign技巧 - form方式传值

feign技巧 - form方式传值。 0. 文章目录1. 前言2. 调用样例3. 原理解析3.1 feign端序列化参数3.2 SpringMVC服务端解析参数3.3 补充 - 继承关系不会被传递的原因3.4 补充 - 不能使用GET。4. 总结1. 前言 直接正题。 如何使用feign进行fom表单方式的请求调用&#xff0c;以及其…

leaflet 上传KMZ文件,并在map上显示(062)

第062个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中本地上传包kmz文件,解析并在地图上显示图形。在制作本示例的过程中,还有点缺憾,就是kmz中的图片文件没有在jszip中处理好,只能先解压缩后,将图片文件放到public/文件加下,暂时留一个遗憾点,以后再做…

又发现一个ChatGPT体验站,辅助写代码真方便

♥️ 作者&#xff1a;Hann Yang ♥️ 主页&#xff1a;CSDN主页 ♥️ 2022博客之星Top58&#xff0c;原力榜Top10/作者周榜Top13 ♥️ “抢走你工作的不会是 AI &#xff0c;而是先掌握 AI 能力的人” ChatGPT 美国OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发…

【刷题笔记】--两数之和Ⅳ,从二叉树中找出两数之和

法一&#xff1a;深度搜索中序遍历双指针 思路&#xff1a;通过中序遍历二叉树得到一个递增的数列&#xff0c;再在这个递增的二叉树中找到这两数。 主要学到双指针这个方法。 对于一般数列&#xff0c;我们要找到两数满足其之和等于目标数&#xff0c;我们一般会进行暴力&a…

C++请求SpringBoot的接口问题记录

问题描述最近忙一个小东西&#xff0c;遇到一个很有意思的问题&#xff0c;记录一下。 需求非常简单&#xff0c;就是java侧提供一个接口给C侧调用。 接口按照业务规范提供出来了&#xff0c;在postman中请求一下&#xff0c;出入参都正常。 关于这个接口请求方式为postJson方式…

C++:提高篇: 栈-寄存器和函数状态:栈指针帧指针详解

栈指针和帧指针前言1、EBP和ESP详解2、push &#xff0c;leave &#xff0c;call汇编指令分析3、下面用一个图总结前言 &#x1f697;&#x1f697;&#x1f697;&#xff1a;在刚接触 ESP和EBP概念时&#xff0c;我一直认为&#xff1a;ESP指向栈顶指针&#xff0c;EBP指向栈…

为什么说百度下个月推出文心一言会被ChatGPT完全碾压

作者&#xff0c;姚远&#xff1a; Oracle ACE&#xff08;Oracle和MySQL数据库方向&#xff09;华为云MVP 《MySQL 8.0运维与优化》的作者中国唯一一位Oracle高可用大师拥有包括 Oracle 10g和12c OCM在内的20数据库相关认证。曾任IBM公司数据库部门经理现在一家第三方公司任首…

操作系统——2.操作系统的特征

这篇文章&#xff0c;我们来讲一讲操作系统的特征 目录 1.概述 2.并发 2.1并发概念 2.1.1操作系统的并发性 3.共享 3.1共享的概念 3.2共享的方式 4.并发和共享的关系 5.虚拟 5.1虚拟的概念 5.2虚拟小结 6.异步 6.1异步概念 7.小结 1.概述 上一篇文章&#xff0c;我们…

实时数据仓库

1 为什么选择kafka? ① 实时写入&#xff0c;实时读取 ② 消息队列适合&#xff0c;其他数据库受不了 2 ods层 1&#xff09;存储原始数据 埋点的行为数据 (topic &#xff1a;ods_base_log) 业务数据 (topic &#xff1a;ods_base_db) 2&#xff09;业务数据的有序性&#x…

论文阅读 - Early Detection of Fake News by Utilizing the Credibility of News

论文链接&#xff1a;https://arxiv.org/pdf/2012.04233.pdf 目录 摘要 1 简介 2 相关工作 2.1 基于特征的方法 2.2 深度学习方法 3 问题表述 4 拟议的框架 4.2 用户可信度预测 4.3 虚假新闻分类 4.3.1 新闻内容表示 4.3.2 融合注意力单元 5 实验 5.1 数…

工厂模式--设计模式

分类&#xff1a; 1、简单工厂&#xff1a;可根据自变量的不同返回不同类的实例 应用&#xff1a;将类名和类的全路径放入到配置文件&#xff0c;通过文件流将内容读取放入到map集合中保存&#xff0c;通过反射读取类全路径读取到该类&#xff0c;然后调用类方法。 详细设计&…

山东大学2022算法期末

接力&#xff1a;山东大学2021算法期末 2022 SDU算法导论期末考试 2020 计科 计算题 三道 35’ (1) 画BFS树 (2) 做DFS说明各种边的分类使用floyd或者矩阵乘法求全源最短路&#xff0c;求最短路矩阵以及前驱矩阵&#xff08;3个点&#xff0c;比较友好&#xff0c;应该没有…

idea推送镜像到desktop报错:Cannot run program “docker-credential-desktop“ 系统找不到指定的文件。

windows Docker 搭建仓库 打开docker desktop 。 打开windows cmd窗口或powershell窗口。 输入"docker run -d -p 5000:5000 --name test registry:2 "运行一个名字叫test的registry容器。 idea配置springboot项目的docker插件 在pom.xml中的plugins中加入下面代码…

Kaldi语音识别技术(五) ----- 特征提取

Kaldi语音识别技术(五) ----- 特征提取 文章目录Kaldi语音识别技术(五) ----- 特征提取一、识别流程二、MFCC特征提取概述三、文件格式文件格式说明提取部分数据修复提取数据提取剩余部分数据四、特征提取特征提取—C特征提取—并行提取特征提取—特征查看五、CMVNCMVN—脚本CM…

SpringMVC执行流程(面试题)

SpringMVC是Spring框架中的组成成员之一&#xff0c;是一个针对于Web开发的一个类似于Servlet技术的一个web应用框架&#xff0c;它包含了MVC架构的特点&#xff0c;让Web变得更加简单。在SpringMVC框架中&#xff0c;一个比较核心的组件就是他的前端控制器&#xff0c;这个前端…

sql复习(子查询、创建和管理表)

一、子查询 子查询 (内查询) 在主查询之前一次执行完成 子查询的结果被主查询(外查询)使用 1.单行子查询 只返回一行&#xff0c;使用单行比较操作符。 --谁的工资比Able高&#xff1f; select last_name,salary from employees where salary > (select salaryfrom empl…

idea插件生成dao类service类controller类以及mapper.xml

idea插件生成dao类service类controller类以及mapper.xml 安装插件Easycode和MybatisX&#xff0c;不用自己写代码 1.Files——》Settings——》Plugins&#xff0c;分别搜索Easycode和MybatisX&#xff0c;点击下载。 2.新建一个springboot模板&#xff0c;选择的依赖如下 3.…

初探Spring采用Spring配置文件管理Bean

文章目录Spring容器演示--采用Spring配置文件管理Bean&#xff08;一&#xff09;创建Maven项目&#xff08;二&#xff09;添加Spring依赖&#xff08;三&#xff09;创建杀龙任务类&#xff08;四&#xff09;创建勇敢骑士类&#xff08;五&#xff09;采用传统方式让勇敢骑士…

JAVA内存模型(JMM)

JMM一、JMM——原子性-(synchronized)二、JMM——可见性-问题2.1 退不出的循环2.2 可见性——解决2.3 可见性三、JMM——有序性-问题3.1 诡异的结果3.2 解决方法3.3 有序性理解3.4 happens-beforeJMM 即 Java Memory Model&#xff0c;简单地说&#xff0c;JMM定义了一套在多线…