Junit(Java单元测试)

目录

配置文件

注解

@Test 标注测试方法

@BeforeAll 和 @AfterAll 标注在测试之前和之后执行的方法

@BeforeEach 和 @AfterEach 标注在每条测试之前和之后执行的方法

@TestMethodOrder 和 @Order(优先级) 标注测试方法的执行顺序

@ParameterizedTest 将测试方法参数化

@ValueSource 单参数

@CsvSource 多参数

@CsvFileSource 通过文件传递多参数

@MethodSource 通过方法传递多参数

@Suite 测试套件(管理测试顺序)

@SelectClasses 管理测试类的执行顺序

@SelectPackages 管理包的执行顺序

断言

Assertions 类实现断言

执行 JS 脚本


配置文件

        要想使用 Junit 进行单元测试需要引入以下第三方库:

引入后可以使用 @Test,@BeforeEach等注解

        <!-- 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>
            <scope>test</scope>
        </dependency>

        引入后可以进行”参数化“

        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>

        引入后可管理测试用例,如 @Suite

        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.9.1</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>

注解

@Test 标注测试方法

public class JunitTest {
    @Test   //标注下面的方法是测试方法
    public void test01(){
        System.out.println("==========这是第一个测试用例==========");
    }

    @Test
    public void test02(){
        System.out.println("==========这是第二个测试用例==========");
    }
}

@BeforeAll 和 @AfterAll 标注在测试之前和之后执行的方法

    @BeforeAll
    static void Start(){
        System.out.println("********** 测试开始 **********");
    }

    @AfterAll
    static  void End(){
        System.out.println("********** 测试结束 **********");
    }

@BeforeEach 和 @AfterEach 标注在每条测试之前和之后执行的方法

    @BeforeEach
    public void startEach(){
        System.out.println("********** 测试开始 **********");
    }

    @AfterEach
    public void endEach(){
        System.out.println("********** 测试结束 **********");
    }

@TestMethodOrder 和 @Order(优先级) 标注测试方法的执行顺序

        如下代码设置 test01 的执行优先级为 2 小于 test02 的执行优先级 1,所以 test02 测试方法先执行,其次才是 test01 方法

// @TestMethodOrder 指定用哪个方法来进行测试方法排序
//MethodOrderer.OrderAnnotation.class 表示用注解排序测试方法
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
    //设置测试方法执行的优先级,2 的优先级小于 1
    @Order(2)
    //标注下面的方法是测试方法
    @Test
    public void test01(){
        System.out.println("==========这是第一个测试用例==========");
    }

    @Order(1)
    @Test
    public void test02(){
        System.out.println("==========这是第二个测试用例==========");
    }
}

@ParameterizedTest 将测试方法参数化

        注意:使用 @ParameterizedTest 注解就已经代表该方法是一个测试方法,不需要再使用 @Test 方法,否则会报错

@ValueSource 单参数

        如下代码,会依次将 @ValueSource 注解中定义的整数作为参数依次传入 test03 方法中

    //将测试方法参数化
    @ParameterizedTest
    //设置参数的数据源,只支持一个参数
    @ValueSource(ints = {1,2,3,4})
    public void test03(int x){
        System.out.println(x);
    }

@CsvSource 多参数

         如下代码,会依次将 @CsvSource 注解中定义的多组数据作为参数依次传入 test04 方法中

    @ParameterizedTest
    //设置参数的数据源,支持多个参数
    @CsvSource({"雨林, 20","小菊,22"})
    void test04(String name,int age){
        System.out.println("name:"+name+" age:"+age);
    }

@CsvFileSource 通过文件传递多参数

test05.txt 文件内容

张三,28
李四,19
王五,20

        如下代码,以 test05.txt 文件中的数据作为参数,传入 test05 测试方法中

    @ParameterizedTest
    //通过文件传递多参数
    @CsvFileSource(resources = "test05.txt")
    void test05(String name,int age){
        System.out.println("name:"+name+" age:"+age);
    }

        注意,如果该测试方法在包中,那么 test05.txt 文件也要放到相同名称的包中

        如下图,测试方法在 example 包中

        将 test05.txt 文件放到 resources 的 example 包中

@MethodSource 通过方法传递多参数

        如下代码,以 Generate 方法中定义的数据作为参数,传入 test06 测试方法中

    @ParameterizedTest
    //通过方法传递参数
    @MethodSource("Generate")
    void test06(String name,int age){
        System.out.println("name:"+name+" age:"+age);
    }

Generate 方法

public static Stream<Arguments> Generate() {
        return Stream.of(Arguments.arguments("张三",18),
                Arguments.arguments("李四",20));
    }

@Suite 测试套件(管理测试顺序)

        测试套件,用于管理测试顺序(有许多类和包都用于测试,要管理它们的执行顺序)

@SelectClasses 管理测试类的执行顺序

//测试套件,用于管理测试顺序(有许多类和包都用于测试,要管理它们的执行顺序)
@Suite
//管理测试类的执行顺序
@SelectClasses({JunitTest.class,JunitTest1.class})
public class RunTest {
}

        如下图,先执行 JunitTest,再执行 JunitTest1

@SelectPackages 管理包的执行顺序

//测试套件,用于管理测试顺序(有许多类和包都用于测试,要管理它们的执行顺序)
@Suite
//管理测试包的执行顺序
@SelectPackages(value = {"example"})
public class RunTest {
}

        如下图,执行了 example 包下的 JunitTest

断言

        断言(Assertions)在编程和测试中扮演着重要的角色,特别是在自动化测试、单元测试、集成测试以及验证代码逻辑正确性等方面。

        断言的主要作用:

  1. 验证结果:断言用于验证代码执行后的结果是否符合预期。在测试中,我们通常编写一些测试用例来模拟用户行为,并使用断言来检查程序的状态或输出是否与预期一致。

  2. 快速失败:断言可以在发现不符合预期的情况时立即停止测试或程序执行,这有助于快速定位问题。如果没有断言,测试可能会继续执行并产生更多难以追踪的错误。

  3. 提高代码质量:通过编写断言,我们可以确保代码按照预期工作,并在不符合预期时给出清晰的错误消息。这有助于开发人员更快地识别并修复问题,从而提高代码质量。

Assertions 类实现断言

        这里只简单的展示 Assertions 类常用的几个方法:

    @Test
    void test01(){
        int a=1;
        int b=0;
        String tmp=null;
        //断言 a,b 的值相等
        //Assertions.assertEquals(a,b);
        //断言 a,b 的值不相等
        //Assertions.assertNotEquals(a,b);
        //断言 tmp 的值为 null
        //Assertions.assertNull(tmp);
        //断言 tmp 的值不为 null
        Assertions.assertNotNull(tmp);
    }

        如果断言失败就会停止测试,并展示失败的详细信息

执行 JS 脚本

        如果一些操作我们通过 Junit 不好实现或不能实现,那么可以通过执行 JS 脚本的方式来是实现,语法如下:

((JavascriptExecutor)webDriver).executeScript("js脚本");

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现(附源码)(下篇)

作者&#xff1a;后端小肥肠 上篇&#xff1a;【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现&#xff08;上篇&#xff09;_spring security activiti7-CSDN博客 目录 1.前言 2. 核心代码 2.1. 流程定义模型管理 2.1.1. 新增流程定义模型数据 …

转让北京劳务分包地基基础施工资质条件和流程

地基基础资质转让流程是怎样的?对于企业来说&#xff0c;资质证书不仅是实力的证明&#xff0c;更是获得工程承包的前提。而在有了资质证书后&#xff0c;企业才可以安心的准备工程投标&#xff0c;进而在工程竣工后获得收益。而对于从事地基基础工程施工的企业&#xff0c;需…

10.1 Go Goroutine

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

基于STM32开发的智能农业监控系统

目录 引言环境准备智能农业监控系统基础代码实现&#xff1a;实现智能农业监控系统 4.1 土壤湿度传感器数据读取4.2 温湿度传感器数据读取4.3 水泵与风扇控制4.4 用户界面与数据可视化应用场景&#xff1a;农业环境监测与管理问题解决方案与优化收尾与总结 1. 引言 随着智能…

【文末附gpt升级秘笈】AI热潮降温与AGI场景普及的局限性

AI热潮降温与AGI场景普及的局限性 摘要&#xff1a; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI热一度席卷全球&#xff0c;引发了广泛的关注和讨论。然而&#xff0c;近期一些学者和行业专家对AI的发展前景提出了质疑&#xff0c;认为AI热潮将逐渐…

BIOPLUSS引领膳食行业创新、整合与再造

2024年NHNE如期而至&#xff0c;同时今年也是中挪建交70年周年&#xff0c;BIOPLUSS作为挪威品牌代表也参加了此次NHNE国际健康营养博览会&#xff0c;此次NHNE展会吸收了来自30多个国家及地区的1200多家品牌参与&#xff0c;BIOPLUSS同时受挪威领事馆、挪威创新署邀请&#xf…

Chapter 6 Frequency Response of Amplifiers

Chapter 6 Frequency Response of Amplifiers 这一节我们学习单极和差分运放的频率响应. 6.1 General Considerations 我们关心magnitude vs 频率, 因此有低通, 带通, 高通滤波器 6.1.1 Miller Effect Miller’s Theorem 考虑impedance Z1和Z2, X和Y之间增益为Av. Z1 Z/(…

C语言 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一.配置开发环境 二…

为什么选择海外服务器?

如何选择跨境电商服务器&#xff1a;详细指南 选择合适的服务器是跨境电商企业成功的基础。服务器的性能和稳定性直接影响着网站的访问速度、用户体验和安全性&#xff0c;进而影响着企业的销量和利润。那么&#xff0c;跨境电商企业该如何选择服务器呢&#xff1f; ​​​​​…

【微信小程序】事件传参的两种方式

文章目录 1.什么是事件传参2.data-*方式传参3.mark自定义数据 1.什么是事件传参 事件传参:在触发事件时&#xff0c;将一些数据作为参数传递给事件处理函数的过程&#xff0c;就是事件传参 在微信小程序中&#xff0c;我们经常会在组件上添加一些自定义数据&#xff0c;然后在…

0元白嫖阿里云4G内存云服务器——感谢伟大的CSDN和阿里云

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程-CSDN博客 目录 1、学生认证领取300元优惠券 ​2、购买云服务器 1、学生认证领取…

车载电子电气架构 - 智能座舱基础技术

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

STM32CubeIDE使用过程记录

最近在做一款机器人的开发&#xff0c;使用到了STM32CubeIDE&#xff0c;这里记录一些使用技巧方便后续查阅。 STM32CubeIDE使用过程记录 快捷键开启代码自动补全功能看门狗设置CRC设置IO口取反定时器设置 及 定时器中断外部中断GPIO配置STC15单片机GPIO模式配置片内闪存&#…

【Python教程】3-控制流、循环结构与简单字符串操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

frida hook微信防撤回(PC端)

PC端&#xff1a; 微信的主要功能都是在WeChat\[3.9.10.27]\WeChatWin.dll动态链接库中实现的 直接进IDA分析 都没有符号表 我们需要找一下实现撤回功能的函数&#xff0c;尝试在字符串里搜索revokeMsg 也是有非常多的字符串 我们需要用frida来hook这些字符串来找出撤回实际…

初识volatile

volatile&#xff1a;可见性、不能保证原子性(数据不安全)、禁止指令重排 可见性&#xff1a;多线程修改共享内存的变量的时候&#xff0c;修改后会通知其他线程修改后的值&#xff0c;此时其他线程可以读取到修改后变量的值。 指令重排&#xff1a;源代码的代码顺序与编译后字…

【学习】DCMM认证提升企业竞争优势的表现

DCMM认证是企业提升数据管理能力的重要途径。它不仅可以帮助企业评估自身的数据管理水平&#xff0c;还可以为企业提供改进的方向和目标。在数字化时代&#xff0c;拥有强大的数据管理能力是企业成功的关键。因此&#xff0c;通过DCMM认证&#xff0c;企业可以更好地适应数字化…

ARM交叉编译

目录 一、介绍 1、本地编译 2、交叉编译 二、交叉工具链 1、概念 2、工具 3、获取方法 三、交叉编译运行程序 1、pc机操作&#xff08;x86_64&#xff09; ​2、开发板操作&#xff08;ARM&#xff09; 一、介绍 1、本地编译 本地编译是在与目标运行环境相同的机器上…

大模型训练的艺术:从预训练到增强学习的四阶段之旅

文章目录 大模型训练的艺术&#xff1a;从预训练到增强学习的四阶段之旅1. 预训练阶段&#xff08;Pretraining&#xff09;2. 监督微调阶段&#xff08;Supervised Finetuning, SFT&#xff09;3. 奖励模型训练阶段&#xff08;Reward Modeling&#xff09;4. 增强学习微调阶段…

FreeRTOS消息队列

消息队列简介 队列是为了任务与任务、 任务与中断之间的通信而准备的&#xff0c; 可以在任务与任务、 任务与中断之间传递消息&#xff0c; 队列中可以存储有限的、 大小固定的数据项目。任务与任务、 任务与中断之间要交流的数据保存在队列中&#xff0c; 叫做队列项目。 队…