【测试】——JUnit

news2024/11/15 4:24:16

📖 前言:JUnit 是一个流行的 Java 测试框架,主要用于编写和运行单元测试,用来管理测试用例。本文采用JUnit 5

在这里插入图片描述


目录

  • 🕒 1. 添加依赖
  • 🕒 2. 注解
    • 🕘 2.1 @Test
    • 🕘 2.2 @BeforeAll @AfterAll
    • 🕘 2.3 @BeforeEach @AfterEach
    • 🕘 2.4 @Disabled
  • 🕒 3. 参数化
    • 🕘 3.1 单参数
    • 🕘 3.2 多参数
      • 🕤 3.2.1 CSV
      • 🕤 3.2.2 方法
  • 🕒 4. 测试用例的执行顺序
    • 🕘 4.1 默认顺序
    • 🕘 4.2 指定顺序
    • 🕘 4.3 随机顺序
  • 🕒 5. 断言
  • 🕒 6. 测试套件

🕒 1. 添加依赖

🔎 junit-jupiter-api依赖链接

在这里插入图片描述

🕒 2. 注解

🕘 2.1 @Test

这样就不需要main方法就能运行了

import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class JUnitTest {
    @Test
    // @Test 表明当前的方法是一个测试用例
    void test01(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
    }
}

🕘 2.2 @BeforeAll @AfterAll

@BeforeAll
// 当前所有的测试用例执行之前执行这个方法
static void setUp(){
    System.out.println("开始执行 @BeforeAll 修饰的方法");
}
@AfterAll
// 当前所有的测试用例执行之后执行这个方法
static void tearDown(){
    System.out.println("开始执行 @AfterAll 修饰的方法");
}

在UI自动化测试中,通常情况下,创建驱动,打开网页,放到BeforeAll里面;关闭浏览器放到AfterAlI

🕘 2.3 @BeforeEach @AfterEach

@BeforeEach
// 当前每个测试用例执行之前执行这个方法
void boforeTest(){
    System.out.println("开始执行 @BeforeEach 修饰的方法");
}
@AfterEach
// 当前每个测试用例执行之后执行这个方法
void afterTest(){
    System.out.println("开始执行 @AfterEach 修饰的方法");
}

🕘 2.4 @Disabled

忽略当前测试用例(当前这个测试用例不执行)

🕒 3. 参数化

参数化中有单参数、多参数、CSV、方法。

🔎 junit-jupiter-params依赖链接

🕘 3.1 单参数

@ParameterizedTest
    @ValueSource(strings = {"1","2","3"})
    void oneParameter(String str){
        System.out.println(str);
    }

在这里插入图片描述

注意,以下两个注解不能同时用来修饰一个方法。

@Test
@ParameterizedTest

🕘 3.2 多参数

🕤 3.2.1 CSV

@ParameterizedTest
@CsvSource({"1, 2, ''"})
void csvTest(String x,String y,String q){
    System.out.println(x);
    System.out.println(y);
    System.out.println(q);		// 空参数
    System.out.println("================");
}

在这里插入图片描述

@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void csvTest(int id,String name){
    System.out.println("id:" + id + ",name:" + name);
}

在这里插入图片描述

🕤 3.2.2 方法

public static Stream<Arguments> Generator() {
    return Stream.of(Arguments.arguments(1,"小张"),
            Arguments.arguments(2,"小李")
    );
}

// 注册参数
@ParameterizedTest
@MethodSource("Generator")
void methodTest(int num,String name){
    System.out.println(num + ":" + name);
}

在这里插入图片描述

🕒 4. 测试用例的执行顺序

🕘 4.1 默认顺序

public class JunitTest02 {
    @Disabled
    // 忽略当前测试用例(当前这个测试用例不执行)
    @Test
    void test01(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
    }
    @Test
    void test02(){
        System.out.println("这是第2个测试用例");
    }
    @Test
    void test03(){
        System.out.println("这是第3个测试用例");
    }
    @Test
    void test04(){
        System.out.println("这是第4个测试用例");
    }
}

在这里插入图片描述
可以看到是从上往下执行的,那么此时我们改变一下测试用例的顺序,将test04放到前面:

在这里插入图片描述

可以看到依旧是原先的顺序,是因为JUnit有自己的一套固定顺序。

那么,如何根据指定的顺序来执行测试用例呢?

🕘 4.2 指定顺序

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest02 {
    @Disabled
    // 忽略当前测试用例(当前这个测试用例不执行)
    @Test
    void test01(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
    }
    @Order(1)
    @Test
    void test02(){
        System.out.println("这是第2个测试用例");
    }
    @Test
    void test03(){
        System.out.println("这是第3个测试用例");
    }
    @Order(2)
    @Test
    void test04(){
        System.out.println("这是第4个测试用例");
    }
}

在这里插入图片描述
可以看到,我们是通过注解 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 设定为根据指定的顺序来执行测试用例,通过 @Order 来指定具体的测试用例执行的顺序,没有被 @Order修饰的测试用例默认最后执行。

🕘 4.3 随机顺序

@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest02 {
    @Disabled
    // 忽略当前测试用例(当前这个测试用例不执行)
    @Test
    void test01(){
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
    }
    @Order(1)
    @Test
    void test02(){
        System.out.println("这是第2个测试用例");
    }
    @Test
    void test03(){
        System.out.println("这是第3个测试用例");
    }
    @Order(2)
    @Test
    void test04(){
        System.out.println("这是第4个测试用例");
    }
}

在这里插入图片描述

可以看到每次执行的测试用例顺序不同,而且原先的 @Order 不生效。

🕒 5. 断言

@ParameterizedTest
@ValueSource(ints = {10})
void assertTest(int num){
    // 断言相等
    Assertions.assertEquals(num,10);
    // 断言不相等
    Assertions.assertNotEquals(num,11);
    // 断言为空
    Assertions.assertNull(num);
    // 断言不为空
    Assertions.assertNotNull(num);
}

在这里插入图片描述

🕒 6. 测试套件

测试套件:通过一段代码直接将所有的测试用例跑起来。

🔎 junit-platform-suite依赖链接

<scope>test</scope>删去

🔎 jupiter-engine依赖链接

@Suite
@SelectClasses({JUnitTest.class,JunitTest02.class})
public class RunSuite {
}

通过添加以上两个注解就可以将所有需要测试的类运行起来。

在这里插入图片描述
执行指定的包:

@Suite
@SelectPackages({"Junitlearn","Junitlearn02"})
public class RunSuite {
}

OK,以上就是本期知识点“Junit”的知识啦~~ ,感谢友友们的阅读。后续还会继续更新,欢迎持续关注哟📌~
💫如果有错误❌,欢迎批评指正呀👀~让我们一起相互进步🚀
🎉如果觉得收获满满,可以点点赞👍支持一下哟~

❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页

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

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

相关文章

【Docker】基于docker compose部署artifactory-cpp-ce服务

基于docker compose部署artifactory-cpp-ce服务 1 环境准备2 必要文件创建与编写3 拉取镜像-创建容器并后台运行4 访问JFog Artifactory 服务 1 环境准备 docker 以及其插件docker compose &#xff0c;我使用的版本如下图所示&#xff1a; postgresql 的jdbc驱动, 我使用的是…

【图像检索】基于纹理(LBP)和形状特征的图像检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于纹理(LBP)和形状特征&#xff08;hu特征&#xff09;的图像检索&#xff0c;用m…

力扣206.反转链表

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

【二等奖论文】2024年华为杯研究生数学建模E题成品论文获取入口

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/Wgk64ntZCihttps://qm.qq.com/q/Wgk64ntZCi 详细建模思路&#xff1a; 要解…

C++--模板(template)详解—— 函数模板与类模板

目录 1.泛型编程 2.函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3.类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1.泛型编程 在C中如果让你写一个交换函数&#xff0c;应该怎么做呢&#xff1f…

二叉树进阶【c++实现】【二叉搜索树的实现】

目录 二叉树进阶1.二叉搜索树1.1二叉搜索树的实现1.1.1二叉搜索树的查找1.1.2二叉搜索树的插入1.1.3中序遍历(排序)1.1.4二叉搜索树的删除(重点) 1.2二叉搜索树的应用1.2.1K模型1.2.2KV模型 1.3二叉搜索树的性能分析 二叉树进阶 前言&#xff1a; map和set特性需要先铺垫二叉搜…

Python3网络爬虫开发实战(16)分布式爬虫(第一版)

文章目录 一、分布式爬虫原理1.1 分布式爬虫架构1.2 维护爬取队列1.3 怎样来去重1.4 防止中断1.5 架构实现 二、Scrapy-Redis 源码解析2.1 获取源码2.2 爬取队列2.3 去重过滤2.4 调度器 三、Scrapy 分布式实现3.1 准备工作3.2 搭建 Redis 服务器3.3 部署代理池和 Cookies 池3.4…

超越sora,最新文生视频CogVideoX-5b模型分享

CogVideoX-5B是由智谱 AI 开源的一款先进的文本到视频生成模型&#xff0c;它是 CogVideoX 系列中的更大尺寸版本&#xff0c;旨在提供更高质量的视频生成效果。 CogVideoX-5B 采用了 3D 因果变分自编码器&#xff08;3D causal VAE&#xff09;技术&#xff0c;通过在空间和时…

【OpenAI o1背后技术】Sef-play RL:LLM通过博弈实现进化

【OpenAI o1背后技术】Sef-play RL&#xff1a;LLM通过博弈实现进化 OpenAI o1是经过强化学习训练来执行复杂推理任务的新型语言模型。特点就是&#xff0c;o1在回答之前会思考——它可以在响应用户之前产生一个很长的内部思维链。也就是该模型在作出反应之前&#xff0c;需要…

简单题104. 二叉树的最大深度 (python)20240922

问题描述&#xff1a; python&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution(object…

Python 入门(一、使用 VSCode 开发 Python 环境搭建)

Python 入门第一课 &#xff0c;环境搭建...... by 矜辰所致前言 现在不会 Python &#xff0c;好像不那么合适&#xff0c;咱先不求精通&#xff0c;但也不能不会&#xff0c;话不多说&#xff0c;开干&#xff01; 这是 Python 入门第一课&#xff0c;当然是做好准备工作&a…

论前端框架的对比和选择 依据 前端框架的误区

前端框架的对比和选择依据 在前端开发中&#xff0c;有多种框架可供选择&#xff0c;以下是一些常见前端框架的对比和选择依据&#xff1a; 一、Vue.js 特点&#xff1a; 渐进式框架&#xff0c;灵活度高&#xff0c;可以逐步引入到项目中。学习曲线相对较平缓&#xff0c;容…

Java项目实战II基于Java+Spring Boot+MySQL的民宿在线预定平台(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在旅游市场…

强大的重命名工具 | Bulk Rename Utility v4.0 便携版

软件简介 Bulk Rename Utility是一款功能强大且易于使用的文件批量重命名工具。它不仅体积小巧&#xff0c;而且完全免费&#xff0c;提供了友好的用户界面。该软件允许用户对文件或文件夹进行批量重命名&#xff0c;支持递归操作&#xff0c;即包含子文件夹的重命名。 软件特…

Apache Iceberg 概述

Apache Iceberg概述 一、what is Apache Iceberg&#xff1f; 为了解决数据存储和计算引擎之间的适配的问题&#xff0c;Netflix开发了Iceberg&#xff0c;2018年11月16日进入Apache孵化器&#xff0c;2020 年5月19日从孵化器毕业&#xff0c;成为Apache的顶级项目。 Apache…

SpringBoot实战(三十)发送HTTP/HTTPS请求的五种实现方式【下篇】(Okhttp3、RestTemplate、Hutool)

目录 一、五种实现方式对比结果二、Demo接口地址实现方式三、Okhttp3 库实现3.1 简介3.2 Maven依赖3.3 配置文件3.4 配置类3.5 工具类3.6 示例代码3.7 执行结果实现方式四、Spring 的 RestTemplate 实现4.1 简介4.2 Maven依赖4.3 配置文件4.4 配置类4.5 HttpClient 和 RestTemp…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发&#xff0c;可在终端设备的通知中心、锁屏、横幅等展示&#xff0c;用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容&#xff0c;将通知消息分类为服务与通讯、资讯营销两大类别&…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…

Spring AI Alibaba,阿里的AI Java 开发框架

源码地址 https://github.com/alibaba/spring-ai-alibaba

资源创建方式-Job

Job: 容器按照持续运行的时间可分为两类&#xff0c;服务类容器&#xff0c;和工作类容器 服务类容器通常持续提供服务&#xff0c;需要一直运行&#xff0c;比如HTTP,Server&#xff0c;Daemon等&#xff0c; 工作类容器则是一次性任务&#xff0c;比如批处理程序&#xff0…