测试|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
表示当前方法是一个测试用例。
测试用例跑过了:
测试用例跑不过:(只跑一个,跑全部的)
@Disabled
表示忽略当前测试用例,跳过当前测试用例
@BeforeAll和@AfterAll
含义:@BeforeAll:所有测试用例跑之前跑的,@AfterAll:所有测试用例跑完后跑的
说明:
- 这两个注解下的方法需要是静态的
- 一般初始化放在BeforeAll所在方法中,关闭资源放在AfterAll中
- 如果做UI自动化,通常情况下,创建驱动,打开网页,放到BeforeAll中;关闭浏览器放到AfterAll中
@BeforeEach和@AfterEach
@BeforeEach&@AfterEach 和 @BeforeAll和@AfterAll区别:
- @BeforeAll是在所有测试用例之前跑一次相应的方法
- @BeforeEach是在每个测试用例之前跑一次相应的方法
- @AfterEach 是在每个测试用例之后跑一次相应的方法
- @AfterAll是在所有测试用例之后跑一次相应的方法
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);
}
多参数(多种/多组)
其实我觉得这里如果是多个参数,对象包装一下会比较方便即对象单参数获取,如果是多个对象就是对象数组。
CSV获取参数(支持多种)
@CsvSource注释的值是一个字符串数组,每个字符串表示一组参数
每个参数对应一列
入参的个数大于形参的情况:
空字符串的传递:
不同类型的一组参数:(主要看第三种情况)
CSV文件获取参数(支持多种多组)
当存在多种参数的时候,使用ValueSource不再方便,使用csv文件更加方便。
1.类型的相同的多组
2.类型不相等的多组
方法获取参数(支持多种多组)
有时参数不能直接生成,我们就需要使用方法获取参数的方式
补充:
虽然不能完全理解,也不知道到底是哪些类实现了这些接口,但是从这些源码大概能知道单参数的时候起码是数组,一定程度上可以帮助理解。
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的测试用例");}
}
为什么执行顺序是固定的?
因为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的测试用例");}
}
随机执行顺序(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的测试用例");}
}
4.断言
测试用例需要有校验,需要把执行结果和预期结果进行对比。使用assert关键字。
断言相等和断言不相等
断言相等:
断言不相等:
当断言数组时,可以使用 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
方法将会比较两个数组 expected
和 actual
是否相等。如果数组内容相同,则断言通过,否则断言失败。
断言为空和断言不为空
期待是不为空和期待是空:
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");}
}
常见问题
No tests were found
原因1:这是@Test注解方法的权限问题,类中方法默认权限是default,
对于@Test注解的方法,我们可以选择写public,也可以选择不写。
如果写成private,当前方法就不能被识别出是一个测试用例了。
解决办法:改成public,或去掉private
原因2:
同样的标签需要导两次…
<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:方法不能有返回值
相关文章:

测试|Junit相关内容
测试|Junit相关内容 文章目录 测试|Junit相关内容0.Junit说明1.Junit注解TestDisabledBeforeAll和AfterAllBeforeEach和AfterEach 2.Junit参数化单参数多参数(多种/多组)CSV获取参数(支持多种)CSV文件获取参数(支持多种…...

19-2.vuex
目录 1 安装 2 挂载 2.1 vue2写法 2.2 vue3写法 3 state 3.1 声明数据 3.2 使用数据 3.3 处理数据 4 mutations 4.1 基本使用 4.2 传递参数 4.3 mutations中不能写异步的代码 5 actions 5.1 基本使用 5.2 传递参数 6 getters Vuex是做全局数据…...

微信小程序 选择年和月以及回显 使用picker-view组件
<!--选择年月--><view bindtap"pickCalendar">{{year}}年{{month}}月</view><picker-view wx:if"{{open}}" class"fixed-select" indicator-style"height: 50px;" style"width: 100%; height: 300px;"…...

助力工业物联网,工业大数据之ST层的设计【二十五】
文章目录 04:ST层的设计05:服务域:工单主题分析06:服务域:工单主题实现 04:ST层的设计 目标:掌握ST层的设计 路径 step1:功能step2:来源step3:需求 实施 功…...

MySQL实践——参数SQL_SLAVE_SKIP_COUNTER的奥秘
每次数据库复制冲突之后,经常使用的一个命令如下。 SET GLOBAL SQL_SLAVE_SKIP_COUNTER 1;一般会认为,现在出现冲突错误,那就将上面参数值设置为1,跳过出错的这个event就可以解决了。重新启动复制,发现问题果然解决&…...

小程序面试题
文章目录 简单谈谈微信小程序小程序的原生组件有哪些小程序的安卓版和ios版是怎么开发出来uni-app弹窗被覆盖怎么解决小程序生命周期小程序路由跳转小程序的兼容问题有哪些小程序框架都掌握哪一些,uniapp都会哪一些,平时开发遇到的困难上传图片uni-app h5 端的ios图片不能加载…...

微信小程序接入腾讯云天御验证码
腾讯云新一代行为验证码(Captcha),基于十道安全防护策略,为网页、APP、小程序开发者打造立体、全面的人机验证。在保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。 …...

Docker build 命令详解
build 命令用于使用 Dockerfile 创建镜像。 语法: $ docker build [OPTIONS] PATH | URL | -OPTIONS 说明 # 可通过帮助命令查看 $ docker build --help--build-arg[]: 设置镜像创建时的变量--cpu-shares: 设置 cpu 使用权重--cpu-period: 限制 CPU、CFS 周期--cpu…...

基于Translators的多语言翻译解决方案
当Translators库,一个用Python为个人和学生提供免费、多样、愉快翻译的库。 文章目录 Translators支持的翻译服务安装与入门参数和功能支持的语言调试和运行环境API服务Translators Translators库是一个强大的Python库,旨在为个人和学生提供免费、多样、愉快的翻译体验。它支…...

Unity 性能优化五:渲染模块压力
CPU压力 Batching 在GPU渲染前,CPU会把数据按batch发送给GPU,每发送一次,都是一个drawcall,GPU在渲染每个batch的时候,会切换渲染状态,这里的渲染状态指的是:影响对象在屏幕上的外观的渲染属性…...

Redis数据库 | 事务、持久化
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Redis事务操作 Redis事务是一组命令的集合,这些命令会作为一个整体被执行,要么全部执行成功,要么全部执行失败;Redis事…...

浅析大数据时代下的视频技术发展趋势以及AI加持下视频场景应用
视频技术的发展可以追溯到19世纪初期的早期实验。到20世纪初期,电视技术的发明和普及促进了视频技术的进一步发展。 1)数字化:数字化技术的发明和发展使得视频技术更加先进。数字电视信号具有更高的清晰度和更大的带宽,可以更快地…...

TensorRT学习笔记--基于YoloV8检测图片和视频
1--完整项目 完整项目地址:https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.gitcd TRT_YoloV8 2--模型转换 cd yolov8python gen_wts.py 3--编译项目 mkdir buildcd build cmake .. # 需要更改 CMakeLists.txt…...

【C++】开源:matplotlib-cpp静态图表库配置与使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍matplotlib-cpp图表库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…...

香港IT软件开发服务公司Alpha Technology 申请纳斯达克IPO上市
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于中国香港的IT软件开发服务公司Alpha Technology 近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为࿰…...

JavaScript:数组深拷贝
文章目录 1 数组深拷贝的意义2 数组深拷贝的常用方式2.1 使用 JSON 序列化和反序列化2.2 使用递归方法2.3 使用第三方库 1 数组深拷贝的意义 JavaScript中的数组深拷贝,指的是创建一个完全独立于原始数组的新数组,所有新数组的元素都是原始数组的副本。…...

干翻Dubbo系列第七篇:@EnableDubbo、@DubboService、@DubboReference注解的作用
文章目录 文章说明 一:EnableDubbo注解的作用 1:注解使用地点 2:注解作用 3:路径要求 4:指定路径 5:另外一种指定路径 二:DubboService注解的作用 1:注解作用 2࿱…...

clickhouse断电重启故障解决方案
业务场景 公司的一个日志系统用到了clickhouse。一线运维反映说有个生产环境因为异常断电造成服务器重启。在执行日志系统的启动脚本时,一直报clickhouse启动不起来,日志系统无法使用。 问题排查 通过阅读启动脚本代码,以及启动日志系统&a…...

Spring学习笔记之Bean的实例化方式
文章目录 通过构造方法实例化通过简单工厂模式实例化通过factory-bean实例化BeanFactory和FactoryBean的区别BeanFactoryFactoryBean 注入自定义Date Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了很多…...

JVM-类加载器
1.前置知识 1.1CPU与内存交互图: 2.类加载器ClassLoader 在装载(Load)阶段,其中第(1)步:通过类的全限定名获取其定义的二进制字节流,需要借助类装 载器完成,顾名思义,就是用来装载Class文件的。 2.1什么是类加载器&a…...

ChatGPT在法律行业的市场潜力
ChatGPT现在已经成为我们的文字生成辅助工具、搜索引擎助手,许多体验过它的朋友会发现对它越来越依赖,并将其逐渐融入到自己的日常工作、生活。但有一点值得注意:这种人工智能除了技术可行、经济价值可行还要与相关规范即人类普遍的价值观念…...

Python编程从入门到实践练习第三章:列表简介
目录 一、字符串1.1 在字符串中使用变量 二、列表2.1 遍历列表练习题代码 2.2 列表元素的插入和删除涉及方法练习题代码 2.3 组织列表涉及方法练习题代码 2.4 索引 参考书:Python从入门到实践(第二版) 一、字符串 1.1 在字符串中使用变量 f…...

【Spring Boot】请求参数传json数组,后端采用(pojo)新增案例(103)
请求参数传json数组,后端采用(pojo)接收的前提条件: 1.pom.xml文件加入坐标依赖:jackson-databind 2.Spring Boot 的启动类加注解:EnableWebMvc 3.Spring Boot 的Controller接受参数采用:Reque…...

Redis 持久化RDB和AOF
Redis 持久化之RDB和AOF Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File)。如果你想快速了解和使用RDB和AOF,可以直接跳到文章底部看总结。本章节通过配置文件,触发快照…...

【ThinkPHP】PHP实现分页功能
查询列表数据,需要用到分页功能,下面是分页功能的代码: /*** Summary of userList* return \think\response\Json*/public function userList(){$page input("page")?:1;//当前页数$size input("size")?:10;//每页大…...

chrome 插件开发
参考: https://www.cnblogs.com/amboke/p/16718855.html 设计和实现一个 Chrome 插件提升登录效率_若川的技术博客_51CTO博客 最新版 V3 chrome 插件开发~ demo 坑 - 掘金 官方文档:https://developer.chrome.com/docs/extensions/...

开源MinDoc wiki系统搭建
部署文档参考 https://cloud.tencent.com/developer/beta/article/2134667 https://mp.weixin.qq.com/s?__bizMzU0MzEyODAyNA&mid2247485475&idx1&snac5ac76beac0a1405ca7a0f045f44db3&chksmfb116894cc66e182b197601420b8b5409a91ac538ba67d01248659de913fe7…...

pytest.ini 文件说明
pytest.ini 文件是用于配置 pytest 测试用例运行规则的文件。pytest.ini 配置文件支持的参数有以下几类: 匹配测试文件和测试函数的过滤参数测试用例执行参数测试报告输出参数临时文件及路径参数插件参数 以下是一些常见的 pytest.ini 配置参数及其用法示例&#…...

遥感、GIS、GPS在土壤空间数据分析、适应性评价、制图、土壤普查中怎样应用?
摸清我国当前土壤质量与完善土壤类型,可以为守住耕地红线、保护生态环境、优化农业生产布局、推进农业高质量发展奠定坚实基础,为此,2022年初国务院印发了《关于开展第三次全国土壤普查的通知》,决定自2022年起开展第三次全国土壤…...

git | git使用心得记录
公司里项目最近使用Git进行协作开发,总结一下使用心得 一、第一次用git,完全同步最新代码checkout 按照以下步骤操作 1、git init 2、git remote add origin 远程仓库的地址https://gitlab.xxxx.com.cn/xx/xx/xxx/Android/baseline/x.x.x.git(远程仓库…...