测试|Junit相关内容

测试|Junit相关内容

文章目录

  • 测试|Junit相关内容
    • 0.Junit说明
    • 1.Junit注解
      • @Test
      • @Disabled
      • @BeforeAll和@AfterAll
      • @BeforeEach和@AfterEach
    • 2.Junit参数化
      • 单参数
      • 多参数(多种/多组)
        • CSV获取参数(支持多种)
        • CSV文件获取参数(支持多种多组)
        • 方法获取参数(支持多种多组)
      • 补充:
    • 3.Junit测试用例执行顺序
      • 手动指定执行顺序(OrderAnnotation)
      • 随机执行顺序(Random)
    • 4.断言
      • 断言相等和断言不相等
      • 断言为空和断言不为空
    • 5.Junit测试套件
    • 常见问题
      • No tests were found

0.Junit说明

Junit是针对Java进行单元测试的一种框架。

注:这里使用的版本是Junit5,前边写的Selenium是Selenium5

1.Junit注解

@Test

表示当前方法是一个测试用例。

测试用例跑过了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN8T6FJ8-1690872547538)(F:\typora插图\image-20230801085852858.png)]

测试用例跑不过:(只跑一个,跑全部的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4aJA9SZn-1690872547539)(F:\typora插图\image-20230801090615074.png)]

@Disabled

表示忽略当前测试用例,跳过当前测试用例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrhll6DA-1690872547540)(F:\typora插图\image-20230801091522574.png)]

@BeforeAll和@AfterAll

含义:@BeforeAll:所有测试用例跑之前跑的,@AfterAll:所有测试用例跑完后跑的

说明:

  1. 这两个注解下的方法需要是静态的
  2. 一般初始化放在BeforeAll所在方法中,关闭资源放在AfterAll中
  3. 如果做UI自动化,通常情况下,创建驱动,打开网页,放到BeforeAll中;关闭浏览器放到AfterAll中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZhD92a7H-1690872547540)(F:\typora插图\image-20230801092207325.png)]

@BeforeEach和@AfterEach

@BeforeEach&@AfterEach 和 @BeforeAll和@AfterAll区别:

  1. @BeforeAll是在所有测试用例之前跑一次相应的方法
  2. @BeforeEach是在每个测试用例之前跑一次相应的方法
  3. @AfterEach 是在每个测试用例之后跑一次相应的方法
  4. @AfterAll是在所有测试用例之后跑一次相应的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsjcYNCc-1690872547541)(F:\typora插图\image-20230801092856948.png)]

2.Junit参数化

不进行参数注册,就往注解下的方法中传参,会报错,这个时候就需要引入相关依赖,进行参数注册

<!-- 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>

注意:这里的scope还是需要注释掉

其中@ParameterizedTest表明当前方法为参数化测试方法

单参数

这里的单不是单个,而是单种,只不过这一种参数下可以有一个参数也可以有多个参数

使用方法:在方法上加上两个注解:@ParameterizedTest,@ValueSource(类型名s={xxxxxx})

传参与入参

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4NCLEmK-1690872547542)(F:\typora插图\image-20230801094303684.png)]

多参数(多种/多组)

其实我觉得这里如果是多个参数,对象包装一下会比较方便即对象单参数获取,如果是多个对象就是对象数组。

CSV获取参数(支持多种)

@CsvSource注释的值是一个字符串数组,每个字符串表示一组参数

每个参数对应一列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5sX2G93I-1690872547542)(F:\typora插图\image-20230801103650424.png)]

入参的个数大于形参的情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YWF0x5oT-1690872547543)(F:\typora插图\image-20230801103908859.png)]

空字符串的传递:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWukbtyN-1690872547543)(F:\typora插图\image-20230801104056120.png)]

不同类型的一组参数:(主要看第三种情况)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIn0Jq3d-1690872547544)(F:\typora插图\image-20230801111457162.png)]

CSV文件获取参数(支持多种多组)

当存在多种参数的时候,使用ValueSource不再方便,使用csv文件更加方便。

1.类型的相同的多组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8OIS4ROt-1690872547544)(F:\typora插图\image-20230801100723844.png)]

2.类型不相等的多组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cw7FaqjQ-1690872547544)(F:\typora插图\image-20230801110745603.png)]

方法获取参数(支持多种多组)

有时参数不能直接生成,我们就需要使用方法获取参数的方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rnM9EIqE-1690872547545)(F:\typora插图\image-20230801101608162.png)]

补充:

在这里插入图片描述

虽然不能完全理解,也不知道到底是哪些类实现了这些接口,但是从这些源码大概能知道单参数的时候起码是数组,一定程度上可以帮助理解。

3.Junit测试用例执行顺序

public class JunitTest01 {@Testvoid testB(){System.out.println("testB的测试用例");}@Testvoid test01(){System.out.println("test01的测试用例");}@Testvoid test02(){System.out.println("test02的测试用例");}@Testvoid testA(){System.out.println("testA的测试用例");}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pFPffRq-1690872547545)(F:\typora插图\image-20230801112340280.png)]

为什么执行顺序是固定的?

因为Junit有自己执行顺序的算法,如果想要指定执行顺序需要特殊处理

手动指定执行顺序(OrderAnnotation)

@TestMethodOrder(MethodOrderer .OrderAnnotation.class)
public class JunitTest01 {@Order(1)@Testvoid testB(){System.out.println("testB的测试用例");}@Order(2)@Testvoid test01(){System.out.println("test01的测试用例");}@Order(3)@Testvoid test02(){System.out.println("test02的测试用例");}@Order(4)@Testvoid testA(){System.out.println("testA的测试用例");}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ektrtvMx-1690872547546)(F:\typora插图\image-20230801112819652.png)]

随机执行顺序(Random)

@TestMethodOrder(MethodOrderer.Random.class)
//@TestMethodOrder(MethodOrderer .OrderAnnotation.class)
public class JunitTest01 {
//    @Order(1)@Testvoid testB(){System.out.println("testB的测试用例");}
//    @Order(2)@Testvoid test01(){System.out.println("test01的测试用例");}
//    @Order(3)@Testvoid test02(){System.out.println("test02的测试用例");}
//    @Order(4)@Testvoid testA(){System.out.println("testA的测试用例");}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j9r3ZhcM-1690872547546)(F:\typora插图\image-20230801113328137.png)]

4.断言

测试用例需要有校验,需要把执行结果和预期结果进行对比。使用assert关键字。

断言相等和断言不相等

断言相等:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6WXYibkj-1690872547547)(F:\typora插图\image-20230801114756634.png)]

断言不相等:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1NnlIvcc-1690872547548)(F:\typora插图\image-20230801114510217.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMHFDp2p-1690872547548)(F:\typora插图\image-20230801114722836.png)]

当断言数组时,可以使用 assertArrayEquals 方法来比较两个数组是否相等。以下是一个示例:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;public class ArrayAssertionTest {@Testpublic void testArrayEquals() {int[] expected = {1, 2, 3, 4};int[] actual = {1, 2, 3, 4};assertArrayEquals(expected, actual);}
}

在上述示例中,assertArrayEquals 方法将会比较两个数组 expectedactual 是否相等。如果数组内容相同,则断言通过,否则断言失败。

断言为空和断言不为空

期待是不为空和期待是空:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZiq0Xmo-1690872547549)(F:\typora插图\image-20230801115111257.png)]

5.Junit测试套件

测试套件的相关操作需要引入相关依赖,注意,因为这里是在main文件夹下而不是在test文件夹下,所以记得把scope这个标签注释掉

<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite-api</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>

使用方法有两种,一种是通过class,另外一种是通过包。

对应的注解分别是@SelectClasses,@SelectPackage

@Suite
//通过class测试用例运行
@SelectClasses({JunitTest.class,JunitTest01.class})//通过包
//@SelectPackages(value = {"package01","package02"})
public class RunSuite {}
public class Test01 {@Testpublic void test01(){System.out.println("package01-->test01");}
}
public class Test01 {@Testpublic void test01(){System.out.println("package02-->test01");}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2mj1eiv-1690872547549)(F:\typora插图\image-20230801143349213.png)]

常见问题

No tests were found

原因1:这是@Test注解方法的权限问题,类中方法默认权限是default,

对于@Test注解的方法,我们可以选择写public,也可以选择不写。

如果写成private,当前方法就不能被识别出是一个测试用例了。

解决办法:改成public,或去掉private


原因2:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTPtCo8o-1690872547549)(F:\typora插图\image-20230801121136525.png)]

同样的标签需要导两次…

<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><!-- 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></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.1</version></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></dependency><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.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></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><version>1.9.1</version></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>

原因3:方法不能有返回值

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

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

相关文章

概率论与数理统计复习总结2

概率论与数理统计复习总结&#xff0c;仅供笔者复习使用&#xff0c;参考教材&#xff1a; 《概率论与数理统计》/ 荣腾中主编. — 第 2 版. 高等教育出版社《2024高途考研数学——概率基础精讲》王喆 概率论与数理统计实际上是两个互补的分支&#xff1a;概率论 在 已知随机…

linux(一)-----osi七层模型

1.七层模型的定义 1&#xff09;物理层 &#xff08;指的是网卡&#xff0c;网线等物理层面的硬件&#xff09; 2&#xff09;数据链路层 前两层可以概括为物理链路层&#xff0c;以二进制的数据形式在物理媒介上进行传输数据&#xff08;传输协议ISO2100协议&#xff09; …

LeetCode[1302]层数最深叶子节点的和

难度&#xff1a;Medium 题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;请你返回 层数最深的叶子节点的和 。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,null,6,7,null,null,null,null,8] 输出&#xff1a;15示例 2&#xff1a; 输入&#xff1a;r…

python爬虫 获取简单的get请求

打印结果&#xff1a; 原博主写的很厉害额&#xff0c;写的比较全面&#xff0c;大家可以去学习看看 参考原文&#xff1a; Python调用get或post请求外部接口_python调用post接口_纯洁的小魔鬼的博客-CSDN博客

【TypeScript】TS入门及基础学习(一)

【TypeScript】TS入门及基础学习&#xff08;一&#xff09; 【TypeScript】TS入门及基础学习&#xff08;一&#xff09;一、前言二、基本概念1.强类型语言和弱类型语言2.动态语言和静态语言 三、TypeScript与JavaScript的区别四、环境搭建及演练准备4.1 安装到本地4.2 在线运…

计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

如今&#xff0c;自动驾驶汽车可以在普通情况下平稳行驶&#xff0c;人们普遍认识到&#xff0c;真实的传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用。为此&#xff0c;我们提出了一种基于神经辐射场&#xff08;NeRF&#xff09;的自动驾驶模拟器。与现有作品相…

【爬虫实践】使用Python从网站抓取数据

一、说明 本周我不得不为客户抓取一个网站。我意识到我做得如此自然和迅速&#xff0c;分享它会很有用&#xff0c;这样你也可以掌握这门艺术。【免责声明&#xff1a;本文展示了我的抓取做法&#xff0c;如果您有更多相关做法请在评论中分享】 二、计划策略 2.1 策划 确定您…

软件测试(功能、接口、性能、自动化)详解

一、软件测试功能测试 测试用例编写是软件测试的基本技能&#xff1b;也有很多人认为测试用例是软件测试的核心&#xff1b;软件测试中最重要的是设计和生成有效的测试用例&#xff1b;测试用例是测试工作的指导&#xff0c;是软件测试的必须遵守的准则。 黑盒测试常见测试用…

idea运行web老项目

idea打开老项目 首先你要用idea打开老项目&#xff0c;这里看我之前发的文章就可以啦 运行web项目 1. 编辑配置 2. 添加tomcat项目 3. 设置tomcat参数 选择本地tomcat&#xff0c;注意有的tomcat版本&#xff0c;不然运行不了设置-Dfile.encodingUTF-8 启动&#xff0c;这样…

vue3实现拖拽排序

效果&#xff1a; 实现 <template><div class"box"><divv-for"(item, index) in items":key"item.id"class"item":style"{ order: item.order }":draggable"true"dragstart"onDragStart(in…

【测试联调】如何在前后端测试联调时优雅的构造异常场景

目录 背景 使用iptables实现 利用iptables丢弃某ip数据包 使用 -L 列出所有规则 IP 连通性 通信 测试 插入一条规则&#xff0c;丢弃此ip 的所有协议请求 列出所有规则 测试 丢弃规则内的IP 连通性 清除 规则列表的 限制 模拟ip进行丢包50%的处理。 mysql proxy 代理…

脑电信号处理与特征提取——6.运用机器学习技术和脑电进行大脑解码(涂毅恒)

目录 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分析 6.4 代码解读 六、运用机器学习技术和脑电进行大脑解码 6.1 前言 6.2 基于脑电数据的机器学习基础分析 6.3 基于脑电数据的机器学习进阶分…

快速增加Shopee,lazada店铺销量的秘籍大揭秘

在竞争激烈的电商市场中&#xff0c;如何快速提高Shopee。lazada店铺的销量一直是卖家们关注的焦点。 优化产品信息&#xff1a;在Shopee平台上&#xff0c;完整填写产品标题、描述和关键词等信息非常重要。确保您的产品信息准确、清晰&#xff0c;并包含与目标买家搜索相关的…

C语言笔试题训练【第一天】

目录 第一题 第二题 第三题 第四题 第五题 大家好&#xff0c;我是纪宁。 从今天开始博主会日更一些经典的C语言笔试题&#xff0c;持续20天左右。题目类型为5道选择题加2道编程题&#xff0c;希望能和大家一起进步。 第一题 1.读程序&#xff0c;下面程序正确的输出是&…

如何在Visual Studio Code中用Mocha对TypeScript进行测试

目录 使用TypeScript编写测试用例 在Visual Studio Code中使用调试器在线调试代码 首先&#xff0c;本文不是一篇介绍有关TypeScript、JavaScript或其它编程语言数据结构和算法的文章。如果你正在准备一场面试&#xff0c;或者学习某一个课程&#xff0c;互联网上可以找到许多…

微信小程序wx.getlocation接口权限申请总结

先附上申请通过截图 插播内容&#xff1a;可代开通&#xff0c;保证通过。wx.getLocation接口&#xff08;获取当前的地址位置&#xff09; qq&#xff1a; 308205428 如何申请 当申请微信小程序的wx.getLocation接口权限时&#xff0c;你可以…

Go语言进阶语法八万字详解,通俗易懂

文章目录 File文件操作FileInfo接口权限打开模式File操作文件读取 I/O操作io包 文件复制io包下的Read()和Write()io包下的Copy()ioutil包总结 断点续传Seeker接口断点续传 bufio包bufio包原理Reader对象Writer对象 bufio包bufio.Readerbufio.Writer ioutil包ioutil包的方法示例…

gitlab CI/CD 安装 gitlab runner

一、为什么需要安装gitlab runner &#xff1f; 极狐GitLab Runner 极狐GitLab Runner 是在流水线中运行作业的应用&#xff0c;与极狐GitLab CI/CD 配合运作。 说白了就是你部署的一个agent。 二、如何安装&#xff1f; 1.介绍通过helm部署github runner 2.helm添加仓库 h…

【Java可执行命令】(十四)脚本执行工具jrunscript :在命令行环境下交互式执行一些简单的脚本或测试代码片段~

Java可执行命令之jrunscript 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 启动 jrunscript 直接执行脚本3.3 可选参数&#xff1a;-l < language>3.4 可选参数&#xff1a;-e < script>3.5 可选参数&#xff1a;-f < script file>3.6 注意事项 4️…

大模型开发(十五):从0到1构建一个高度自动化的AI项目开发流程(上)

全文共5600余字&#xff0c;预计阅读时间约13~20分钟 | 满满干货(附全部代码)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;提出一种利用大语言模型(LLMs)加快项目的开发效率的解决思路&#xff0c;本文作为第一部分&#xff0c;主要集中在如何完整的执行引导Chat模…