test-01-java 单元测试框架 junit 入门介绍

JUnit

JUnit 是一个用于编写可重复测试的简单框架。

它是 xUnit 架构的一种实例,专门用于单元测试框架。

What to test?

NeedDesc
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 更深层次理解的一些要点:

  1. 测试生命周期: JUnit 测试生命周期由注解控制,例如 @Before@After 用于在测试方法执行前后进行一些初始化和清理操作。此外,@BeforeClass@AfterClass 用于在整个测试类的开始和结束时执行。

  2. 断言和匹配器: JUnit 提供了丰富的断言方法,例如 assertEqualsassertTrueassertNotNull 等,用于验证实际结果与预期值是否一致。JUnit 还支持 Hamcrest 匹配器,允许更灵活和表达性强的断言。

  3. 参数化测试: JUnit 4 引入了参数化测试,通过 @Parameterized@RunWith(Parameterized.class) 注解,可以让同一个测试方法多次运行,每次使用不同的参数。这对于测试多个输入情况非常有用。

  4. 异常测试: 使用 @Testexpected 属性或者更为灵活的 @RuleExpectedException 类,可以方便地测试代码是否抛出了预期的异常。

  5. 测试套件: JUnit 支持创建测试套件,可以将多个测试类组合在一起执行。这对于组织和执行一系列相关的测试非常有用。

  6. 规则(Rules): JUnit 规则是在测试运行期间执行的附加操作,可以通过自定义规则实现更灵活的测试控制。例如,TemporaryFolder 规则用于创建临时文件夹,Timeout 规则用于设置测试方法的最大执行时间。

  7. 扩展(Extensions): JUnit 5 引入了扩展模型,允许开发者编写自定义扩展,从而实现更多的测试控制和定制化。这对于与依赖注入框架集成、自定义测试运行器等场景非常有用。

  8. Mocking 和 Stubbing: JUnit 通过其他库(如 Mockito)的集成,支持对代码中的依赖进行模拟(Mocking)和存根(Stubbing),从而在测试中隔离被测单元。

  9. 测试运行器(Runners): JUnit 支持通过测试运行器扩展测试执行的行为。例如,@RunWith 注解允许指定一个自定义的测试运行器,用于修改测试执行的过程。

  10. 并发测试: JUnit 5 引入了对并发测试的支持,通过 @RepeatedTest@TestInstance 注解,可以更方便地编写和执行并发测试。

小结

单元测试作为入门级别的测试工具,却非常的经典。

可以为我们的代码质量保驾护航。

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

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

相关文章

什么是动态代理?

目录 一、为什么需要代理&#xff1f; 二、代理长什么样&#xff1f; 三、Java通过什么来保证代理的样子&#xff1f; 四、动态代理实现案例 五、动态代理在SpringBoot中的应用 导入依赖 数据库表设计 OperateLogEntity实体类 OperateLog枚举 RecordLog注解 上下文相…

SpringMVC基础知识(持续更新中~)

笔记&#xff1a; https://gitee.com/zhengguangqq/ssm-md/blob/master/ssm%20md%E6%A0%BC%E5%BC%8F%E7%AC%94%E8%AE%B0/%E4%B8%89%E3%80%81SpringMVC.md 细节补充&#xff1a;

原地建堆,LeetCode 1962. 移除石子使总数最小

一、题目 1、题目描述 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k &#xff0c;请你执行下述操作 恰好 k 次&#xff1a; 选出任一石子堆 piles[i] &#xff0c;并从中 移除 floor(pil…

深度学习 | 梯度下降算法及其变体

一、最优化与深度学习 1.1、训练误差与泛化误差 1.2、经验风险 1.3、优化中的挑战 1.3.1、局部最小值 1.3.2、 鞍点 经常是由于模型复杂度过高或者训练样本数据过少造成的 —— Overfitting 1.3.3、悬崖 1.3.4、长期依赖问题 二、损失函数 2.1、损失函数的起源 损失函数(loss…

笔记:一台电脑如何安装多个不同版本的Node并能自由切换(NVM)

前言&#xff1a;相信大家在做前端开发时公司有vue2和vue3的项目需要维护或自学&#xff0c;vue2大多只需要Node 14版本&#xff0c;而vue3则是16或18&#xff0c;但电脑只能装一个Node&#xff0c;可我全都要。比如一会切到Node14 vue2开发&#xff0c;一会切到Node 16或18 vu…

041_小驰私房菜_MTK平台添加支持通过原生Camera API接口调用UsbCamera

平台:MTK 问题:通过调用Android Camera API去调用UsbCamera,需要做哪些修改? Google官方文档,关于usbcamera的支持: 外接 USB 摄像头 | Android 开源项目 | Android Open Source Project 相关修改内容如下: 一、MTK平台支持通过标准接口打开USB Camera 1)device相…

每日一题——轮转数组

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

Unity自带的NavMesh寻路组件

最近看了一下Unity自带的NavMesh寻路组件&#xff0c;先说一下基本的使用&#xff1a; 首先先把AI Navgation的package包给安装上。 给场景地图添加上NavMeshSurface组件&#xff0c;然后进行烘焙&#xff0c;烘焙出对应的场景地图文件。 给移动物体添加对应的Nav MeshAgent组…

Nodejs+Express搭建HTTPS服务

最近开发需要搭建一个https的服务&#xff0c;正好最近在用nodejs和express&#xff0c;于是乎想到就近就使用这两东西来搭建一个https的服务吧。这里搭建过程总共需要两步&#xff0c;第一步生成证书&#xff0c;第二步使用https模块启动服务。 生成自签名证书 这里因为是自…

【XML】TinyXML 详解(二):接口详解

【C】郭老二博文之&#xff1a;C目录 1、XML测试文件&#xff08;laoer.xml&#xff09; <?xml version"1.0" standalone"no" ?> <!-- Hello World !--> <root><child name"childName" id"1"><c_child…

【蓝桥杯备考】第十一届蓝桥杯省赛Java B组真题编程题

第十二届蓝桥杯省赛Java B组真题 编程题 1. 杨辉三角问题描述 2. 时间显示问题描述 3. 双向排序问题描述 4. 括号序列问题描述分析 5.砝码称重分析 1. 杨辉三角 问题描述 著名的杨辉三角形&#xff0c;按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数…

可视化开发

可视化开发 数据可视化 交互式可视化 文章目录 可视化开发前言一、可视化开发二、Python数据可视化大屏GIS图像智能识别处理软件开发三、可视化开发必备总结前言 可视化开发可以帮助开发者通过图形化界面和拖放操作来创建、编辑和测试应用程序。使用这些工具,开发者可以提高开…

解决用Fiddler抓包,网页显示你的连接不是专用/私密连接

关键&#xff1a;重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler&#xff0c;重新打开 3、手机删掉证书&#xff0c;重新下载安装。 &#xff08;如果还不行&#xff0c;重新试一遍&#xff0c;先把浏览器…

1223西站坐标更新

1223 西站坐标更新 1.Update for the station’s location def initial_out_map_indoor_points(self):Load the indoor data and update both the wall_matrix and the ditch_matrix.# Initialize the wall_matrix# List of coordinatescoordinates [(417, 287, 417, 290),(4…

CSS3新增特性

CSS3 CSS3私有前缀 W3C 标准所提出的某个CSS 特性&#xff0c;在被浏览器正式支持之前&#xff0c;浏览器厂商会根据浏览器的内核&#xff0c;使用私有前缀来测试该 CSS 特性&#xff0c;在浏览器正式支持该 CSS 特性后&#xff0c;就不需要私有前缀了。 查询 CSS3 兼容性的网…

非静压模型NHWAVE学习(14)—— 算例制作:开闸式异重流(lock-exchange flow)

NHWAVE学习—— 算例制作&#xff1a;开闸式异重流&#xff08;lock-exchange flow&#xff09; 算例简介模型配置代码修改及输入文件制作代码修改参数文件制作&#xff08;input.txt&#xff09;水深和初始密度场文件制作&#xff08;depth.txt & sali0.txt&#xff09; 模…

【tcmalloc】优化方法

一.脱离new使用定长内存池 此项目本意是脱离malloc的使用&#xff0c;但若使用new的话仍然会使用到malloc。因为centralcache和pagecache本身是单例&#xff0c;不考虑创建对象的问题&#xff0c;但是每个线程自身拥有个线程缓冲区和span结构是要考虑new的问题的&#xff0c;引…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

docker构建镜像及项目部署

文章目录 练习资料下载一、docker基础1. 基本概念2. docker常见命令3. 命令别名4. 数据卷 二、docker自定义镜像1. 了解镜像结构2. 了解Dockerfile3. 构建Dockerfile文件&#xff0c;完成自定义镜像 三、网络1. docker常见网络命令2. docker自带虚拟网络3. 自定义网络 四、dock…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0&#xff08;Application …