java 单元测试Junit
所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的,用于对代码进行单元测试的工具(IDEA已经集成了junit框架)。相比于在main方法中测试有如下几个优点。
1.可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。
2.不需要程序员去分析测试的结果,会自动生成测试报告出来。

接下来,我们就按照上面的步骤,来使用一下.
先准备一个类,假设写了一个StringUtil工具类,代码如下
public class StringUtil{public static void printNumber(String name){//这里为了方便用了静态方法 不是静态的则需要在测试方法里new一个对象测试System.out.println("名字长度:"+name.length());}
}
接下来,写一个测试类,测试StringUtil工具类中的方法能否正常使用。
public class StringUtilTest{//名字这样写 就知道测试什么类@Test//必须添加Test注解 可以alt+回车导入Junit包 建议使用4.0版本 经典版本public void testPrintNumber(){//名字这样写 就知道测试什么方法StringUtil.printNumber("admin");StringUtil.printNumber(null);}
}
写完代码之后,我们会发现测试方法左边,会有一个绿色的三角形按钮。点击这个按钮,就可以运行测试方法。也可以右键在选项里运行,在不同的地方右键可以显示运行不同的测试方法或者运行整个测试类中的方法。甚至,当以后我们的项目里有几百个测试方法几百个测试类,可以右键模块的位置,一键运行模块里所有的测试类里的测试方法,非常强大。

运行,测试失败,因为有null出现空指针异常。

单元测试断言
所谓断言:意思是程序员可以预测程序的运行结果,检查程序的运行结果是否与预期一致。
能跑通的代码不一定就没有错误,比如看下面的例子。
我们在StringUtil类中新增一个测试方法
public static int getMaxIndex(String data){//要求返回字符串最大索引if(data == null){return -1;}return data.length();//错误的}
接下来,我们在StringUtilTest类中写一个测试方法
public class StringUtilTest{@Testpublic void testGetMaxIndex(){int index1 = StringUtil.getMaxIndex(null);System.out.println(index1);int index2 = StringUtil.getMaxIndex("admin");System.out.println(index2);//断言机制:预测index2的结果Assert.assertEquals("方法内部有Bug",4,index2);}
}
运行测试方法,结果如下图所示,表示我们预期值与实际值不一致

Junit框架的常用注解
刚才我们以及学习了@Test注解,可以用来标记一个方法为测试方法,测试才能启动执行。
除了@Test注解,还有一些其他的注解,我们要知道其他注解标记的方法什么时候执行,以及其他注解在什么场景下可以使用。

接下来,我们演示一下其他注解的使用。我们在StringUtilTest测试类中,再新增几个测试方法。代码如下
public class StringUtilTest{@Beforepublic void test1(){System.out.println("--> test1 Before 执行了");}@BeforeClasspublic static void test11(){System.out.println("--> test11 BeforeClass 执行了");}@Afterpublic void test2(){System.out.println("--> test2 After 执行了");}@AfterCalsspublic static void test22(){System.out.println("--> test22 AfterCalss 执行了");}
}
执行上面的测试类,结果如下图所示

观察执行结果,特点如下
1.被@BeforeClass标记的方法,执行在所有方法之前
2.被@AfterCalss标记的方法,执行在所有方法之后
3.被@Before标记的方法,执行在每一个@Test方法之前
4.被@After标记的方法,执行在每一个@Test方法之后
我们现在已经知道每一个注解的作用了,那他们有什么用呢?应用场景在哪里?
我们来看一个例子,假设我想在每个测试方法中使用Socket对象,并且用完之后,需要把Socket关闭,就可以在@Before和@After里申请和释放。,如果是公用管道,代码就可以按照下面的结构来设计
public class StringUtilTest{private static Socket socket;@Beforepublic void test1(){System.out.println("--> test1 Before 执行了");}@BeforeClasspublic static void test11(){System.out.println("--> test11 BeforeClass 执行了");//初始化Socket对象socket = new Socket();}@Afterpublic void test2(){System.out.println("--> test2 After 执行了");}@AfterCalsspublic static void test22(){System.out.println("--> test22 AfterCalss 执行了");//关闭Socketsocket.close();}
}
最后,我们再补充一点。前面的注解是基于Junit4版本的,再Junit5版本中对注解作了更新,但是作用是一样的。所以这里就不做演示了

相关文章:
java 单元测试Junit
所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的࿰…...
Java中Timer和TimerTask的使用
这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任务的类,它接受一个TimerTask做参数 Timer有两种执行任务的模式,最常用的是schedule,它可以以两种方式执行任务:1:在某个时间(Data),2:在某个固定的时间之后…...
计算机竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python
文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…...
DFS寻找从s到t的所有路径
问题描述: 输入一个有向图,输出从s到t的所有路径的结点 输入: 3 3 0 1 1 2 0 2输出: 0 1 2 0 2 代码: #include<bits/stdc.h> using namespace std;const int N 103; vector<int>e[N];//用行为N的…...
分享!JetBrains IDE中的GitLab支持
GitLab是流行的基于git的软件开发和部署平台之一,虽然很长一段时间以来,所有基本git操作都已经可以通过GitLab实现,但GitLab集成仍是JetBrains社区的一大最热门请求。为此,JetBrains团队今年与GitLab联手提供了这种类型的集成。 …...
jq弹窗拖动改变宽高
预览效果 <div classtishiMask><div class"tishiEm"><div id"coor"></div><div class"topNew ismove"><span class"ismove">提示</span><p onclick"closeTishi()"></p&…...
时间不确定度在分布式系统中的说明
On the one hand 时间不确定度问题和影响在分布式系统中 说明 时钟不确定度(Clock Uncertainty)是指在分布式系统中,由于网络延迟、时钟漂移等因素导致系统中各个节点时钟的不同步现象。这种不同步可能会影响到分布式系统的一致性和正确性…...
VMware vCenter 从6.7跨版本升级至7.0U3N
本文尝试使用 vCenter Server Appliance 管理界面 (VAMI) 进行对vCenter Server Appliance7应用进行小版本升级,从6.7.0.47000升级到7.0.3.01600(7.0U3N)。 一、升级前的准备工作 1、检查当前运行环境(当前为6.7.0.47000&#x…...
大麦订单生成器最新版 大麦订单一键生成截图
1.可以一键添加,生成的假订单没有水印,界面也很真实。 2.在软件中输入生成的信息,这是产品信息,选择生成的产品图像,最后生成它。 后台一键生成,独立后台管理 教程:解压源码,修改数…...
如何对Map集合的key进行大小写转换?
工具类: ToUpperCaseKeyMapUtil.java public class ToUpperCaseKeyMapUtil {//对单一的mappublic static <T> Map<String, T> toUpperCaseKeyMap(Map<String, T> map) {if (map ! null) {List<String> mapKeyList new ArrayList<>…...
将函数实现放到CPP报“无法解析的外部符号...”,系VS Bug
发现一个现象,就是项目中有一个类,如果将函数实现全部放到头文件中,编译不报错,如果将函数实现放到CPP中则始终提示“无法解析的外部符号...”,考虑到放到头文件中能正常编译运行,显然这里不符合“无法解析…...
异步FIFO设计的仿真与综合技术(3)
概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文,添加了笔者的个人理解与注释,文中蓝色部分为笔者注或意译。前文链接: 异步FIFO设计的仿真与综合技术…...
什么是区块链,解释区块链的原理和应用场景
1、什么是区块链,解释区块链的原理和应用场景。 区块链是一种分布式数据库,它由一系列按照时间顺序排列的数据块组成,并采用密码学方式保证不可篡改和不可伪造。区块链技术最初起源于比特币,作为比特币的底层技术,用于…...
使用bert进行文本二分类
构建BERT(Bidirectional Encoder Representations from Transformers)的训练网络可以使用PyTorch来实现。下面是一个简单的示例代码: import torch import torch.nn as nn from transformers import BertModel, BertTokenizer# Load BERT to…...
用Windows Installer CleanUp Utility 在windows server上面将软件卸载干净,比如SQLSERVER
这里写自定义目录标题 下载文件:Windows Installer CleanUp Utility。 通过以上工具可以将一个应用程序卸载干净。...
Java手写LinkedList和拓展
Java手写LinkedList和拓展 思维导图 #mermaid-svg-K0RTlFFvnikDRvqp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-K0RTlFFvnikDRvqp .error-icon{fill:#552222;}#mermaid-svg-K0RTlFFvnikDRvqp .error-text{fill…...
机器学习(14)---逻辑回归(含手写公式、推导过程和手写例题)
逻辑回归 一、逻辑回归概述二、模型、策略和优化(手写)三、w和b的梯度下降公式推导四、例题分析4.1 题目4.2 解答 一、逻辑回归概述 1. 逻辑回归也称作logistic回归分析,是一种广义的线性回归分析模型,属于机器学习中的监督学习。…...
LLFormer 论文阅读笔记
Ultra-High-Definition Low-Light Image Enhancement: A Benchmark and Transformer-Based Method 这是南京大学在AAAI 2023发表的一篇AAAI2023 超高清图像暗图增强的工作。提出了一个超高清暗图增强数据集,提供了4K和8K的图片,同时提出了一个可用于暗图…...
JSP语法基础习题
目录 简答题:jsp中静态include和动态include的区别是什么? 简答题:jsp有哪些内置对象,作用分别是什么? 简答题:Request对象的主要方法有哪些? 代码题: 简答题:jsp中静态…...
vue类与样式的绑定列表渲染
目录 1.类与样式的绑定 1.1绑定 HTML class 1.2绑定数组 1.3绑定内联样式 绑定数组 2.列表渲染 2.1v-for 2.2v-for 与对象 2.3在 v-for 里使用范围值 1.类与样式的绑定 1.1绑定 HTML class 我们可以给 :class (v-bind:class 的缩写) 传递一个对象来动态切换 class…...
Acode:重新定义Android移动代码编辑体验
Acode:重新定义Android移动代码编辑体验 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode 在移动开发日益普及的今天,拥有一款高效的移动代码编辑器成为开发者的迫切需…...
野火指南者开发板+LVGL实战:3.2寸电阻屏GUI移植全流程(附避坑指南)
野火指南者开发板LVGL实战:3.2寸电阻屏GUI移植全流程(附避坑指南) 在嵌入式开发中,为设备添加美观的用户界面往往能大幅提升产品体验。对于STM32开发者而言,野火指南者开发板搭配3.2寸电阻触摸屏是一个性价比极高的硬件…...
OpenClaw技能扩展:基于百川2-13B开发自定义文件处理器
OpenClaw技能扩展:基于百川2-13B开发自定义文件处理器 1. 为什么需要自定义文件处理技能 上周我在整理项目文档时,发现一个重复性痛点:每天需要手动将同事发来的各种格式文件(PDF、Word、Markdown)按内容分类存储。当…...
国科大研一CS选课避坑指南:从算法分析到模式识别,我的踩坑与真香体验
国科大研一CS选课避坑指南:从算法分析到模式识别,我的踩坑与真香体验 第一次踏入国科大雁栖湖校区的图书馆时,我被落地窗外绵延的燕山山脉震撼得说不出话——直到发现座位插座没电、WiFi信号时断时续,才意识到理想与现实的参差。这…...
如何用MAT修复老照片?3个实用技巧让破损图像重获新生
如何用MAT修复老照片?3个实用技巧让破损图像重获新生 【免费下载链接】MAT MAT: Mask-Aware Transformer for Large Hole Image Inpainting 项目地址: https://gitcode.com/gh_mirrors/ma/MAT 想象一下,你从祖辈那里继承了一张珍贵的黑白老照片&a…...
CVPR2025新星DehazeXL:开源8K去雾数据集与可解释归因图,高分辨率图像处理新范式
1. 高分辨率图像去雾的痛点与DehazeXL的突破 第一次处理8K航拍图像时,我盯着显存不足的报错信息愣了半天——当时用的某知名去雾模型,光是加载81928192的图片就吃掉了48GB显存。这其实是高分辨率图像处理领域的普遍困境:传统方法要么被迫降采…...
WebRtcStreamer避坑指南:解决RTSP视频流延迟高、卡顿的7个优化方案
WebRTCStreamer实战优化:7种方案彻底解决RTSP流媒体高延迟与卡顿问题 当我们在监控系统或视频会议中遇到画面卡成PPT、声音延迟到像看译制片时,那种抓狂感技术人员都懂。最近在部署某智慧园区项目时,我们通过WebRTCStreamer将200路RTSP监控流…...
从“机器会思考”的执念说起,聊聊神经网络到底是个啥(下篇)
一、神经网络的类型:别被名字搞晕,核心就几种 现在叫“神经网络”的东西五花八门,但绝大多数都是从下面这几类衍生出去的。 1. 前馈神经网络(FNN)—— 最朴素的直筒子 数据从输入层进,经过若干隐藏层&am…...
3步打造专属音乐库:开源工具解锁无损音质体验
3步打造专属音乐库:开源工具解锁无损音质体验 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 作为一款功能强大的开源音乐资源工具,洛雪音乐音源整合了全网海量音乐资源&am…...
SolidWorks装配体设计必备:如何用草图投影实现零件快速匹配(2023最新版)
SolidWorks装配体设计效率革命:草图投影的进阶应用与实战技巧 在三维机械设计领域,装配体设计往往是最考验工程师功底的环节。当数十甚至上百个零件需要在虚拟空间中精确配合时,传统逐个修改零件的方法不仅效率低下,还容易产生累积…...
