认识Junit
1. 前言
2. Junit注解
2.1. 常用的注解
2.1.1. @Test
表示当前方法是一个测试方法(不需要main来执行)
@Test
void Test01() throws InterruptedException {System.out.println("测试用例1");WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com");Thread.sleep(500);webDriver.quit();
}@Test
void Test02(){System.out.println("测试用例2");
}
2.1.2. @BeforeAll
在所有测试用例开始之前运行的方法, 要用static修饰
@BeforeAll
static void SetUp(){System.out.println("开始执行@BeforeAll代码");
}
2.1.3. @AfterAll
在所有测试用例开始之后运行的方法, 要用static修饰
@AfterAll
static void TearDown(){System.out.println("开始执行@AfterAll代码");
}
2.1.4. @BeforeEach
在每个测试用例开始之前运行的方法
@BeforeEach
void beforeEach(){System.out.println("开始执行@BeforeEach代码");
}
2.1.5. @AfterEach
在每个测试用例开始之后运行的方法
@AfterEach
void AfterEach(){System.out.println("开始执行@AfterEach代码");
}
2.1.6. @Disabled
忽略当前的测试用例
@Disabled
@Test
void Test01() throws InterruptedException {System.out.println("测试用例1");WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com");Thread.sleep(500);webDriver.quit();
}
2.2. 执行顺序
2.2.1. 不同注解的执行顺序
@BeforeAll代码@BeforeEach代码测试用例1@AfterEach代码@BeforeEach代码测试用例2@AfterEach代码@BeforeEach代码...@AfterEach代码@AfterAll代码
2.2.2. 各个@Test的执行顺序
没有特定的顺序, 是Junit自己决定, 不过可以自己指定顺序
2.2.2.1. 按指定顺序执行
加上类注解@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
然后给每个方法加上@Order(序号)
来决定顺序
- 按照数字从小到大执行, 数字可以不相邻, 可以为负数
- 没有加
@Order
注解的, 在所有有注解执行完毕再按默认顺序执行
import org.junit.jupiter.api.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;//按指定顺序执行
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {//忽略当前的测试用例@Disabled//@Test 表示当前方法是一个测试用例@Testvoid Test01() throws InterruptedException {System.out.println("测试用例1");WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com");Thread.sleep(500);webDriver.quit();}@Order(-1)@Testvoid Test02(){System.out.println("测试用例2");}@Order(40)@Testvoid Test03(){System.out.println("测试用例3");}@Order(30)@Testvoid Test04(){System.out.println("测试用例4");}@BeforeEachvoid beforeEach(){System.out.println("开始执行@BeforeEach代码");}@AfterEachvoid AfterEach(){System.out.println("开始执行@AfterEach代码");}@BeforeAllstatic void SetUp(){System.out.println("开始执行@BeforeAll代码");}@AfterAllstatic void TearDown(){System.out.println("开始执行@AfterAll代码");}
}
2.2.2.2. 随机顺序执行
加上类注解@TestMethodOrder(MethodOrderer.Random.class)
会按随机顺序执行
此时@Order(序号)
就失效了
3. Junit参数化
3.1. 单参数 @ValueSource
使用@ParameterizedTest
来修饰方法, 表示这个方法有参数. 此时不能再用@Test
了
使用@ValueSource
来传入单参数, 可以设置参数类型, 例如下面的string
strings = {"1","2","3"}
代表本方法执行三次, 传入参数分别为1,2,3
@ParameterizedTest
@ValueSource(strings = {"1","2","3"})
void Test03(String str){System.out.println(str);
}
3.2. 多参数: CSV
3.2.1. @CsvSource
使用@ParameterizedTest
修饰方法
使用@CsvSource
传入多个参数, 可以参照下面的代码(本方法将会执行三次)
@ParameterizedTest
@CsvSource({"1, 2", "3, 4", "5, 6"})
void Test06(String str, int num){System.out.println("str="+str+", num="+num);
}
3.2.2. @CsvFileSource
当我们需要特别多组的测试数据时, 全部写在注解里不友好,可以传入参数文件(.csv)来进行测试
使用@ParameterizedTest
修饰方法
使用@CsvFileSource(resources = "csv文件路径")
传入参数
右键可以让idea自动创建文件, 可以选择放在resource/Junit/xxx.csv
(其中""
表示空字符串)
@ParameterizedTest
@CsvFileSource(resources = "test01.csv")
void Test07(int id, String name){System.out.println("id="+id);System.out.println("name="+name);
}
3.3. 多参数: 传入方法
使用@ParameterizedTest
修饰方法
使用MethodSource("方法名")
表示参数来源于哪个方法
多组数据可以用多个Arguments.arguments(参数1,参数2,...)
来传递
public static Stream<Arguments> myMethod() {return Stream.of(Arguments.arguments(1,"张三"),Arguments.arguments(2, "李四"),Arguments.arguments(3, "王五"));
}
@ParameterizedTest
@MethodSource("myMethod")
void Test08(int num, String name){System.out.println("id="+num);System.out.println("name="+name);
}
4. Junit断言
断言分为: 断言相等, 断言不相等, 断言为空, 断言不为空
对于每个断言, 符合条件就没有任何提示, 不符合会报错并且之后的代码不运行
@ParameterizedTest
@ValueSource(strings = {"10"})
void Test09(String num){//断言相等:符合条件就没有任何提示, 不符合会报错并且之后的代码不运行Assertions.assertEquals(num,"10");//断言不相等Assertions.assertNotEquals(num,"11");//断言为空//Assertions.assertNull(num);//断言不为空Assertions.assertNotNull(num);
}
5. Junit测试套件
5.1. 自动启动测试
5.1.1. @SelectClasses
在@SelectClasses()
里面写上类名.class即可自动运行这些类
例如, 一个类时@SelectClasses(类名1Test.class)
多个类时, @SelectClasses({类名1Test.class, 类名2Test.class})
import Junit.Junit02Test;
import Junit.JunitTest;
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;@Suite
@SelectClasses({JunitTest.class, Junit02Test.class})
public class RunSuite {}
5.1.2. @SelectPackages
在@SelectPackages()
里写上包的完整路径名
就可以自动运行包下的所有Test类
例如, 一个包时, @SelectPackages("包完整名称")
多个包时, @SelectPackages({"包1","包2"})
测试类的名称必须以Test
结尾, 不然不会识别为测试类, 从而不执行
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;@Suite
@SelectPackages("Junit")
public class RunSuite {}
相关文章:
认识Junit
1. 前言 2. Junit注解 2.1. 常用的注解 2.1.1. Test 表示当前方法是一个测试方法(不需要main来执行) Test void Test01() throws InterruptedException {System.out.println("测试用例1");WebDriver webDriver new ChromeDriver();webDriver.get("https:/…...
Unity C# 引用池 ReferencePool
Unity C# 引用池 ReferencePool 1.目的 对于多次创建的数据使用new 关键字是十分消耗性能的,使用完成后由GC去自动释放,当一个类型的数据频繁创建可以使用引用池进行管理。 2.实现 项目目录 IReference 接口 要放入引用池的数据只需要继承这个接口…...
opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()
人脸识别是指程序对输入的人脸图像进行判断,并识别出其对应的人的过程。人脸识别程 序像我们人类一样,“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然,要实现人脸识别,首先要判断当前图像内是否出现了人脸&…...
〔013〕Stable Diffusion 之 图片自动评分和不健康内容过滤器 篇
✨ 目录 🎈 下载咖啡美学评价插件🎈 咖啡美学评价使用🎈 不健康内容过滤器插件🎈 下载咖啡美学评价插件 想让系统帮你的图片作品打分评价,可以下载咖啡美学自动评价插件插件地址:https://github.com/p1atdev/stable-diffusion-webui-cafe-aesthetic也可以通过扩展列表…...
6.RocketMQ之消费索引文件ConsumeQueue
功能:作为CommitLog文件的索引文件。 本文着重分析为consumequeue/topic/queueId目录下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface…...
Appium-移动端自动测试框架,如何入门?
Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 1、为什么要使用Appium? 2、如何搭建Appium工具环境?(超详细) 3、通过demo演示Appium的使用 4、Appium如何…...
复数混频器、零中频架构和高级算法开发
文章里讲解了关于射频IQ调制器、零中频架构相关的原理及技术,全都是干货!其实好多同行对软件无线电的原理、IQ调制、镜像抑制都是一知半解,知其然不知其所以然。好好研读这篇文章,相信会让你有种恍然大悟的感觉。 RF工程常被视为…...
Web 拦截器-interceptor
拦截器是一种动态拦截方法调用的机制,类似于过滤器,是Spring框架提出的,用来动态拦截控制器方法的执行。 其作用是拦截请求,在指定方法调用前后,根据业务执行预设代码。 实现步骤 1.定义拦截器,实现Handl…...
Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化
目录 引出类什么时候被加载JVM中创建对象几种方式1.new 看到new : new Book()2.反射 Class.forName(“包名.类名”)如何获取Class对象【反射的基础】案例:连接数据库方法 3.克隆(拷贝)clone浅拷贝深拷贝案例 序列化和反序列化对象流-把对象存…...
扩散模型实战(四):从零构建扩散模型
推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 本文以MNIST数据集为例,从…...
YOLOv5、YOLOv8改进:S2注意力机制
目录 1.简介 2.YOLOv5改进 2.1增加以下S2-MLPv2.yaml文件 2.2common.py配置 2.3yolo.py配置 1.简介 S2-MLPv2注意力机制 最近,出现了基于 MLP 的视觉主干。与 CNN 和视觉Transformer相比,基于 MLP 的视觉架构具有较少的归纳偏差,在图像识…...
LeetCode 542. 01 Matrix【多源BFS】中等
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...
使用open cv进行角度测量
使用open cv进行角度测量 用了一点初中数学的知识,准确度,跟鼠标点的准不准有关系,话不多说直接上代码 import cv2 import mathpath "test.jpg" img cv2.imread(path) pointsList []def mousePoint(event, x, y, flags, param…...
java 线程池实现多线程处理list数据
newFixedThreadPool线程池实现多线程 List<PackageAgreementEntity> entityList new CopyOnWriteArrayList<>();//多线程 10个线程//int threadNum 10;int listSize 300;List<List<PackageAgreementDto>> splitData Lists.partition(packageAgre…...
Centos安装Docker
Centos安装 Docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。 Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。 本文介绍 Docker CE 的安装使用。 移除旧的版本&#x…...
Unity启动项目无反应的解决
文章首发见博客:https://mwhls.top/4803.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议,私信不回。 摘要:通过退还并重新载入许可证以解决Unity项目启动无反应问题。 场景 Unity Hub启动项目…...
2.3 opensbi: riscv: opensbi源码解析
文章目录 3. sbi_init()函数4. init_coldboot()函数4.1 sbi_scratch_init()函数4.2 sbi_domain_init()函数4.3 sbi_scratch_alloc_offset()函数4.4 sbi_hsm_init()函数4.5 sbi_platform_early_init()函数3. sbi_init()函数 函数位置:lib/sbi/sbi_init.c函数参数:scratch为每个…...
点破ResNet残差网络的精髓
卷积神经网络在实际训练过程中,不可避免会遇到一个问题:随着网络层数的增加,模型会发生退化。 换句话说,并不是网络层数越多越好,为什么会这样? 不是说网络越深,提取的特征越多ÿ…...
Ubuntu服务器service版本初始化
下载 下载路径 官网:https://cn.ubuntu.com/ 下载路径:https://cn.ubuntu.com/download 服务器:https://cn.ubuntu.com/download/server/step1 点击下载(22.04.3):https://cn.ubuntu.com/download/server…...
re学习(33)攻防世界-secret-galaxy-300(脑洞题)
下载压缩包: 下载链接:https://adworld.xctf.org.cn/challenges/list 参考文章:攻防世界逆向高手题之secret-galaxy-300_沐一 林的博客-CSDN博客 发现这只是三个同一类型文件的三个不同版本而已,一个windows32位exe࿰…...
Mybatis Plus中使用LambdaQueryWrapper进行分页以及模糊查询对比传统XML方式进行分页
传统的XML分页以及模糊查询操作 传统的XML方式只能使用limit以及offset进行分页,通过判断name和bindState是否为空,不为空则拼接条件。 List<SanitationCompanyStaff> getSanitationStaffInfo(Param("name") String name,Param("bi…...
vue中push和resolve的区别
import { useRouter } from vue-router;const routeuseRouter()route.push({path:/test,query:{name:1}})import { useRouter } from vue-router;const routeuseRouter()const urlroute.resolve({path:/test,query:{name:1}})window.open(url.href)比较上述代码会发现,resolve能…...
详解RFC 3550文档-1
1. 介绍 rfc 3550描述了实时传输协议RTP。RTP提供端到端的网络传输功能,适用于通过组播或单播网络服务传输实时数据(如音频、视频或仿真数据)的应用。 TP本身不提供任何机制来确保及时交付或提供其他服务质量保证,而是依赖于较低层的服务来完成这些工作。它不保证传输或防止…...
Go 与 Rust
目录 1. Go 与 Rust 1. Go 与 Rust 一位挺 Rust 的网友说道: “我也为这个选择烦恼了很久。最终 Rust 胜出了。首先, 我感觉 Rust 更接近于以前 Pascal 时代的东西, 你可以控制一切; 其次, 如果 wasm 和相关技术大爆发, Rust 将是一个更安全的选择; 然后, 我们已经有了 Python…...
Android Studio实现读取本地相册文件并展示
目录 原文链接效果 代码activity_main.xmlMainActivity 原文链接 效果 代码 activity_main.xml 需要有一个按钮和image来展示图片 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk…...
python的全局解释锁(GIL)
一、介绍 全局解释锁(Global Interpreter Lock,GIL)是在某些编程语言的解释器中使用的一种机制。在Python中,GIL是为了保证解释器线程安全而引入的。 GIL的作用是在解释器的执行过程中,确保同一时间只有一个线程可以…...
小程序swiper一个轮播显示一个半内容且实现无缝滚动
效果图: wxml(无缝滚动:circular"true"): <!--components/tool_version/tool_version.wxml--> <view class"tool-version"><swiper class"tool-version-swiper" circul…...
【自然语言处理】关系抽取 —— SimpleRE 讲解
SimpleRE 论文信息 标题:An Embarrassingly Simple Model for Dialogue Relation Extraction 作者:Fuzhao Xue 期刊:ICASSP 2022 发布时间与更新时间:2020.12.27 2022.01.25 主题:自然语言处理、关系抽取、对话场景、BERT arXiv:[2012.13873] An Embarrassingly Simple M…...
【O2O领域】Axure外卖订餐骑手端APP原型图,外卖众包配送原型设计图
作品概况 页面数量:共 110 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:外卖配送、生鲜配送 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本品为外卖订餐骑手端APP原型设计图&#x…...
DataGridView keydown事件无法在C#中工作
原因:单元格内编辑文本时,DataGridView keydown事件不起作用。每当单元格处于编辑模式时,其托管控件就会接收KeyDown事件而不是DataGridView包含它的父级.这就是为什么当单元格未处于编辑模式时(即使它被选中),键盘快捷键正常工作,因为DataGridView控件本身会收到Ke…...
镇江网站seo公司/线上培训
1 同时导出表和对应的索引(记下所用的时间)2 同时导入表和对应的索引(记下所用的时间)3 单独导出表(记录时间)4 单独导入表(记录时间)5 重建索引(记录时间)实验表和索引的信息如下:USER01aaron> select count(*) from test01;COUNT(*)----------4643904USER01aar…...
电力建设监理招聘网站/青岛seo网络推广
实现思路:1、 v-model 一个收集所有input(除全选框外)数组checkModel ,vue会动态将其checked为true的input的value值存入数组checkModel里2 、watch函数来监听checkModel 属性,当其长度input元素时 全选按钮选中 否则取消3 、全选按钮v-model…...
网站建设php文件html文件/全专业优化公司
无法可依,有法不依,执法不严,使药品、食品安全问题成了人们恐惧的心病!一些学者、专家把问题揭发出来了,可是又有一些学者和专家出来解释,说什么少吃点儿没有危害,希望市民不必大惊小怪等等。然…...
程序员前端和后端的区别/青岛seo优化公司
《[C#] int与System.Int32有什么区别》 最近园里的TeamOne写了一篇《[C#] int与System.Int32有什么区别》,发现里面有不少精彩的评论,所以忍不住想这篇文章总结一下:> 本文的主要参考资料: 1.《理解C#中的System.Int32和int:…...
做海报用什么网站/seo排名赚下载
介绍Expression template,本文是一个学习笔记,主要参考 mashadow项目关于表达式模板的教程 https://github.com/dmlc/mshadow/tree/master/guide/exp-template 类似matlab形式的向量操作如 VEC0 VEC1 VEC2 VEC3存在效率问题 class Vec { public: Vec(…...
腾龙时时彩做号官方网站/最近的国内新闻
方法一:调用windows自带的shutdown.exe (缺点:会出现倒计时窗口) System.Diagnostics.Process.Start("shutdown.exe", "-r -f -t 15"); shutdown参数含义:-r关闭并重启动此计算机;-f 强制运行的应用程序关闭而…...