test-01-java 单元测试框架 junit 入门介绍
JUnit
JUnit 是一个用于编写可重复测试的简单框架。
它是 xUnit 架构的一种实例,专门用于单元测试框架。
What to test?
Need | Desc |
---|---|
Right | 结果是否正确 |
B | 边界条件是否满足 |
I | 能反向关联吗 |
C | 有其他手段交叉检查吗 |
E | 是否可以强制异常发生 |
P | 性能问题 |
maven 入门例子
maven 引入
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>
方法
public class Calculator {public int add(int a, int b) {return a + b;}
}
测试方法
import org.junit.Test;
import static org.junit.Assert.*;public class CalculatorTest {@Testpublic void testAdd() {// ArrangeCalculator calculator = new Calculator();// Actint result = calculator.add(3, 7);// AssertassertEquals(10, result);}
}
CalculatorTest 类包含了一个测试方法 testAdd,用于测试 Calculator 类的 add 方法。
@Test 注解表示这是一个测试方法。
在测试方法中,我们首先创建了一个 Calculator 对象,然后调用 add 方法进行加法操作。
最后,使用 assertEquals 断言来验证计算的结果是否符合预期值。
运行测试类
在 IDE 中,通常有一个 “Run” 或 “Debug” 按钮,可以直接运行测试类。
也可以通过
mvn test
统一执行测试用例
验证结果
测试运行后,IDE 会显示测试结果。
如果测试通过,你将看到一个绿色的标志;如果测试失败,将会显示红色的标志,并且会提供详细的失败信息。
我们自己的测试例子
- 我们创建一个用于学生的测试类;
public class StudentTest extends TestCase {public void testCreate() {Student student = new Student("Mike");}
}
- Student class
public class Student {private String name;public Student(String name) {this.name = name;}public String getName() {return "ryo";}public void setName(String name) {this.name = name;}
}
当我们运行 StudentTest
时,
接着,我们修改测试代码。
public class StudentTest extends TestCase {public void testCreate() {Student student = new Student("Mike");String name = student.getName();assertEquals("Mike", name);}
}
Usage
- Add jars in IDEA
File --> Project Structure [crtl+alt+shift+s] --> Libraries --> "+"---> "Attach Files or Directories"
- setUp()
Now we add a new class Course.
public class Course {private String name;private int num;public Course(String name, int num) {this.name = name;this.num = num;}public String getName() {return name;}public int getNum() {return num;}
}
test class like this…
public class CourseTest extends TestCase {public void testCreateNum() {Course course = new Course("Math", 1);assertEquals(1, course.getNum());}public void testCreateName() {Course course = new Course("Math", 1);assertEquals("Helo", course.getName());}
}
Course course = new Course("Math", 1);
我们已经写了两次,有没有更简单的方法?
现在,我们可以使用 setUp()
来帮助我们更轻松地进行测试;setUp()
中的内容将在每个测试方法执行之前调用。
public class CourseTest extends TestCase {private Course course;public void setUp() {course = new Course("Math", 1);}public void testCreateNum() {assertEquals(1, course.getNum());}public void testCreateName() {assertEquals("Helo", course.getName());}
}
-
tearDown()
此外,
tearDown()
将在每个测试方法执行之后调用。 -
@Before
用
@Before
注解的方法在每次测试之前执行;同样,@After
在每次测试之后执行。 -
@BeforeClass
只运行一次,并且是唯一的。
更深层的理解
JUnit 是一个广泛用于 Java 单元测试的框架,它在测试驱动开发(TDD)和行为驱动开发(BDD)等软件开发方法中起着关键的作用。
以下是对 JUnit 更深层次理解的一些要点:
-
测试生命周期: JUnit 测试生命周期由注解控制,例如
@Before
和@After
用于在测试方法执行前后进行一些初始化和清理操作。此外,@BeforeClass
和@AfterClass
用于在整个测试类的开始和结束时执行。 -
断言和匹配器: JUnit 提供了丰富的断言方法,例如
assertEquals
、assertTrue
、assertNotNull
等,用于验证实际结果与预期值是否一致。JUnit 还支持 Hamcrest 匹配器,允许更灵活和表达性强的断言。 -
参数化测试: JUnit 4 引入了参数化测试,通过
@Parameterized
和@RunWith(Parameterized.class)
注解,可以让同一个测试方法多次运行,每次使用不同的参数。这对于测试多个输入情况非常有用。 -
异常测试: 使用
@Test
的expected
属性或者更为灵活的@Rule
和ExpectedException
类,可以方便地测试代码是否抛出了预期的异常。 -
测试套件: JUnit 支持创建测试套件,可以将多个测试类组合在一起执行。这对于组织和执行一系列相关的测试非常有用。
-
规则(Rules): JUnit 规则是在测试运行期间执行的附加操作,可以通过自定义规则实现更灵活的测试控制。例如,
TemporaryFolder
规则用于创建临时文件夹,Timeout
规则用于设置测试方法的最大执行时间。 -
扩展(Extensions): JUnit 5 引入了扩展模型,允许开发者编写自定义扩展,从而实现更多的测试控制和定制化。这对于与依赖注入框架集成、自定义测试运行器等场景非常有用。
-
Mocking 和 Stubbing: JUnit 通过其他库(如 Mockito)的集成,支持对代码中的依赖进行模拟(Mocking)和存根(Stubbing),从而在测试中隔离被测单元。
-
测试运行器(Runners): JUnit 支持通过测试运行器扩展测试执行的行为。例如,
@RunWith
注解允许指定一个自定义的测试运行器,用于修改测试执行的过程。 -
并发测试: JUnit 5 引入了对并发测试的支持,通过
@RepeatedTest
和@TestInstance
注解,可以更方便地编写和执行并发测试。
小结
单元测试作为入门级别的测试工具,却非常的经典。
可以为我们的代码质量保驾护航。
相关文章:
test-01-java 单元测试框架 junit 入门介绍
JUnit JUnit 是一个用于编写可重复测试的简单框架。 它是 xUnit 架构的一种实例,专门用于单元测试框架。 What to test? NeedDescRight结果是否正确B边界条件是否满足I能反向关联吗C有其他手段交叉检查吗E是否可以强制异常发生P性能问题 maven 入门例子 maven …...
Linux系统中跟TCP相关的系统配置项
TCP连接保活 参考 《Nginx(三) 配置文件详解 - 基础模块》3.18章节 net.ipv4.tcp_keepalive_intvl:设置TCP两次相邻探活检测的间隔时间。默认75秒,单位是秒,对应配置文件/proc/sys/net/ipv4/tcp_keepalive_intvl;net.ipv4.tcp_kee…...
python图片批量下载多线程+超时重试
背景 上篇python入门实战:爬取图片到本地介绍过如何将图片下载到本地,但是实际处理过程中会遇到性能问题:分页数过多下载时间过程、部分页面连接超时无法访问下载失败。本文从实战的角度解释一下如何处理这两个问题。 下载时间过长问题,处理方式是使用多线程,首先回顾…...

冒泡排序之C++实现
描述 冒泡排序算法是一种简单的排序算法,它通过将相邻的元素进行比较并交换位置来实现排序。冒泡排序的基本思想是,每一轮将未排序部分的最大元素逐个向右移动到已排序部分的最右边,直到所有元素都按照从小到大的顺序排列。 冒泡排序的算法…...

【Spring实战】04 Lombok集成及常用注解
文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor,AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具,它通过注解的方式简化了 Java 代码的编写&…...
ubuntu-22.04.3 配置
1.防火墙 a、查看防火墙状态:inactive是关闭,active是开启。 sudo ufw statusb、开启防火墙。 sudo ufw enablec、关闭防火墙。 sudo ufw disable2.设置Ip ifconfigsudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.y…...

[工具]java_sublime的快速使用
目录 使用 : 怎么运行: 调整字体: 使用 : 新建--->写好代码后-->另存为尾缀是.java的文件 怎么运行: 在你另存为的目录下cmd调用控制台输入dos指令--->执行javac 文件名.java(有.java尾缀)(编译为.class文件)--->java 文件名(没有.class尾缀设计者认为执行的是…...

【银行测试】银行金融测试+金融项目测试点汇总...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、银行金融测试是…...

将PPT的图保持高分辨率导入到Word / WPS中
1、将PPT中画好的图组合在一起,选择组合后的图复制(Ctrlc) 2、在Word中,选中左上角的粘贴选项--->选择性粘贴 WPS选择元文件 / Word选择增强型图元文件 这样放大也不模糊了...
如何在Spring Boot中优雅地进行参数校验
1. 前言 在平时的开发工作中,我们通常需要对接口进行参数格式验证。当参数个数较少(个数小于3)时,可以使用if ... else ...手动进行参数验证。当参数个数大于3个时,使用if ... else ...进行参数验证就会让代码显得臃肿…...
图还能有数据库?一文带你了解图数据库是个什么东西!
图数据库 基础 简介 %% 图数据库是图数据库管理系统的简称,是近年来新兴的一种NoSQL数据库使用图形化的模型进行查询的数据库,通过节点、边和属性等方式来表示和存储数据,支持增删改查::CRUD::等操作。图数据库一般用于OLTP系统中…...

力扣思维题——寻找重复数
题目链接:https://leetcode.cn/problems/find-the-duplicate-number/description/?envTypestudy-plan-v2&envIdtop-100-liked 这题的思维难度较大。一种是利用双指针法进行计算环的起点,这种方法在面试里很难说清楚,也很难想到。大致做…...

基于Kubernetes的jenkins上线
1、基于helm 部署jenkins 要求:当前集群配置了storageClass,并已指定默认的storageClass,一般情况下,创建的storageClass即为默认类 指定默认storageClass的方式 # 如果是新创建默认类: apiVersion: storage.k8s.io/v1…...

每日一题——轮转数组
1. 题目描述 给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。 示例1: 输入:nums [1,2,3,4,5,6,7],k 3 输出:[5,6,7,1,2,3,4] 解释: 向右轮转 1步:[7,1,2,3,4,5,6] 向右…...

Unity手机移动设备重力感应
Unity手机移动设备重力感应 一、引入二、介绍三、测试成果X Y轴Z轴横屏的手机,如下图竖屏的手机,如下图 一、引入 大家对重力感应应该都不陌生,之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念,根据手机的晃动来给实体…...

nodejs微信小程序+python+PHP基于推荐算法的电影推荐系统-计算机毕业设计推荐django
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
Linux 配置 swap 区
Linux 配置 swap 区 很多时候我们需要配置 swap 主要的原因是物理内存太贵了, 服务器也是一样, 当内存不够用时, 系统会卡死, 因此我们宁愿牺牲一点性能也要让系统正常运行。 当然, 在系统物理内存足够的条件下&#x…...

AG16KDDF256 User Manual
AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片,具有 AG16K FPGA的可编程功能,提供更多可编程 IO,同时内部连接大容量 DDR-SDRAM。 FPGA 外部管脚 FBGA256 封装,管脚说明请见下表 Table-1: Tab…...

w15初识php基础
一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…...
powerbuilder Primary! Delete! Filter! 三个缓冲区的作用
Primary! 主缓存区,放正在使用的数据。 Delete! 删除缓存区,放将要删除但还没有提交到数据库的数据。 Filter! 筛选缓存区,放不符合筛选条件的数据。 最后在update的时候根据你的update设置生成相应的SQL语句。行的状态和所在的缓存区决定生…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%
本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...