【JUnit技术专题】「入门到精通系列」手把手+零基础带你玩转单元测试,让你的代码更加“强壮”(夯实功底篇)

news2024/11/25 10:08:30

手把手+零基础带你玩转单元测试,让你的代码更加“强壮”

  • 前言介绍
  • JUnit是什么?
    • JUnit和xUnit之间的关系
  • JUnit的基本概念
  • JUnit的特点
    • 什么是一个单元测试用例
  • JUnit的用法
  • JUnit的最佳实践
    • 案例分析
      • 创建一个类
      • 创建 Test Case 类
      • 创建 Test Runner 类
  • JUnit总体总结

前言介绍

本教程将教你用 Java 编程语言做单元测试时,如何使用 JUnit。本教程是为初学者准备的,来帮助他们了解 JUnit 工具的基本功能。阅读完本教程后,你会发现自己在使用 JUnit 测试框架专业知识方面处在一个中等水平,之后你可以把自己提升到一个更高的水平。

如果您已经熟悉Java编程和软件测试过程,那么使用JUnit来处理所有Java项目的开发将会非常顺利。

JUnit是什么?

JUnit 是一个 Java 编程语言的单元测试框架,它可以帮助Java开发人员编写高质量的单元测试代码。在本系列文章中,我们将介绍JUnit的基本概念、用法和最佳实践。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。

JUnit和xUnit之间的关系

JUnit是xUnit单元测试框架中的一员,而xUnit是起源于JUnit的统称。JUnit在测试驱动的开发方面发挥了重要作用。它强调在编写代码之前先建立测试数据,以便进行测试。这种方法类似于“测试一点,编码一点,再测试一点,再编码一点……”,可以提高程序员的产量和程序的稳定性,减少排错所需的时间和精力,从而减轻程序员的压力。

  • 官方网站

JUnit的基本概念

JUnit的核心概念包括测试用例(Test Case)、测试套件(Test Suite)、测试运行器(Test Runner)和断言(Assertion)。
在这里插入图片描述

  • 测试用例:针对具体Java类或方法进行测试的代码片段,通常包括输入数据、预期输出和断言。

  • 测试套件:相关测试用例的集合,可对较大的代码库进行全面测试。

  • 测试运行器:执行测试用例和测试套件的程序,可自动化运行测试代码并输出测试结果。

  • 测试断言:在测试代码中使用的一种判断机制,可判断测试结果是否符合预期。

JUnit的特点

JUnit测试框架提供了以下几个优点:
在这里插入图片描述

  • 提供注释来识别测试方法,使得测试方法易于理解和识别。

  • 提供断言来测试预期结果,可以检查代码的正确性和健壮性。

  • 提供测试运行来运行测试,可以快速地执行测试并得到结果。

  • JUnit测试允许你编写代码更快,并能提高质量。它是一种高效的测试方法,可以减少代码错误和排错时间。

  • JUnit优雅简洁,使用起来非常简单,花费时间较少。

  • JUnit测试可以自动运行并且检查自身结果并提供即时反馈,因此无需手动梳理测试结果的报告。

  • JUnit测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件,方便测试管理和执行。

  • JUnit在一个条中显示进度,如果运行良好则是绿色;如果运行失败,则变成红色,使得测试结果一目了然。

什么是一个单元测试用例

单元测试用例是代码的一部分,可以确保方法按照预期工作。为了快速达到预期结果,需要使用测试框架,JUnit是Java编程语言中最理想的单元测试框架。

一个正式编写的单元测试用例应该具有以下特点:已知输入和预期输出,在测试执行前就已知。已知输入需要满足测试的先决条件,预期输出需要满足测试的后置条件。
在这里插入图片描述
每个需求至少需要两个单元测试用例:一个正向测试和一个反向测试。如果一个需求有子需求,每个子需求都必须至少有一个正向测试和一个反向测试用例。这样可以确保测试用例的全面性和准确性。
在这里插入图片描述

JUnit的用法

在使用JUnit进行测试时,我们通常需要按照以下步骤进行:
在这里插入图片描述

  • 创建测试用例:编写一个JUnit的TestCase,并在其中编写测试方法。
  • 编写测试方法:在测试方法中,我们需要编写测试代码,包括输入数据、预期输出和断言。
  • 运行测试:使用JUnit提供的测试运行器来运行测试代码,并输出测试结果。

下面是一个简单的示例:

在这个示例中,我们创建了一个名为MyTest的测试用例,并在其中编写了一个名为testAdd的测试方法。在测试方法中,我们对两个整数进行相加,并使用assertEquals方法来判断结果是否等于预期值。

import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
     String str= "Junit is working fine";
     assertEquals("Junit is working fine",str);
} }

创建一个 java 类文件,名称为TestRunner,来执行测试用例。

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
   Result result = JUnitCore.runClasses(TestJunit.class);
   for (Failure failure : result.getFailures()) {
      System.out.println(failure.toString());
   }
    System.out.println(result.wasSuccessful());
  } 
}

这里卖一个关子, 读者可以执行一下,看一下结果是,看一下结果是什么,下面会针对于上面的这个开发方式和测试方式进行相关的介绍。

JUnit的最佳实践

在使用JUnit进行测试时,我们应该遵循以下最佳实践:

  • 编写可重复的测试代码:测试代码应该能够重复运行,并且每次运行的结果应该是一致的。
  • 编写独立的测试代码:测试代码应该与其他代码相互独立,不应该依赖于其他代码的状态。
  • 编写可读性强的测试代码:测试代码应该易于阅读和理解,以便其他开发人员可以快速地理解测试代码的目的和实现。
  • 编写完整的测试套件:测试套件应该包括所有需要测试的代码,并且应该对代码库进行全面的测试。
  • 使用断言来判断测试结果:断言是JUnit测试的核心机制,我们应该尽可能地使用它来判断测试结果是否符合预期。

案例分析

现在我们将应用简单的例子来一步一步教你如何使用 Junit。

创建一个类

MessageModel.java 的类用来测试。

/*
* This class prints the given message on console.
*/
public class MessageModel {
   private String message;
  //Constructor
  //@param message to be printed
  public MessageModel(String message){
   this.message = message;
  }
  // prints the message
 public String printMessage(){
   System.out.println(message);
   return message;
 } 
}

创建 Test Case 类

  • 创建一个名为 TestJunit.java 的测试类。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
  String message = "Hello World";
  MessageModel messageUtil = new MessageModel(message);
  @Test
  public void testPrintMessage() {
    assertEquals(message,messageUtil.printMessage());
  } 
}
  • 向测试类中添加名为 testPrintMessage() 的方法。
  • 向方法中添加 Annotaion @Test。
  • 执行测试条件并且应用 Junit 的 assertEquals API 来检查。

创建 Test Runner 类

创建一个 TestRunner 类

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
   Result result = JUnitCore.runClasses(TestJunit.class);
   for (Failure failure : result.getFailures()) {
     System.out.println(failure.toString());
   }
    System.out.println(result.wasSuccessful());
  } 
}
  • 运用 JUnit 的 JUnitCore 类的 runClasses 方法来运行上述测试类的测试案例
  • 获取在 Result Object 中运行的测试案例的结果
  • 获取 Result Object 的 getFailures() 方法中的失败结果
  • 获取 Result object 的 wasSuccessful() 方法中的成功结果
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
  String message = "Hello World";
  MessageModel messageUtil = new MessageModel(message);
  @Test
  public void testPrintMessage() {
   message = "New Word";
   assertEquals(message,messageUtil.printMessage());
  } 
}

让我们保持其他类不变,再次尝试运行相同的 Test Runner。

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
    Result result = JUnitCore.runClasses(TestJunit.class);
   for (Failure failure : result.getFailures()) {
     System.out.println(failure.toString());
   }
   System.out.println(result.wasSuccessful());
  } 
}

现在运行在 Test Case 类中提供的即将运行测试案例的 Test Runner。

JUnit总体总结

总之,JUnit是一个非常有用的Java测试框架,它可以帮助我们编写高质量的测试代码,并确保我们的Java应用程序能够正确地运行。通过遵循最佳实践,我们可以更好地利用JUnit,并编写出更加可靠和高效的测试代码。

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

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

相关文章

Web实验二 CSS基本样式实验

实验原理 通过创建CSS样式文件,理解CSS样式基本属性作用及意义。 实验目的 理解CSS基本概念及功能 理解CSS样式的设计原则 理解并掌握CSS样式的基本声明方法 理解并掌握多种CSS选择器的使用方法 理解并掌握字文本、表格、超链接等元素常用属性的使用方法 理解并掌握…

机器人学:DH参数总结(传统DH方法和改进DH方法)

1. 传统DH参数方法 1.1 确定坐标系的方法 定义:杆 i i i的近端是关节 i i i,远端是关节 i 1 i1 i1. 【下面的规则参考上面的图看得更清楚】 对于 n n n自由度机器人,可用以下步骤建立与各杆件 i ( i 0 , 1 , … , n ) i(i0,1,…,n) i(i0,…

【iOS底层探索- Block原理分析-循环引用】

文章目录 前言准备工作1. Block的分类2. Block的内存分析捕获外部变量引用计数的变化堆栈释放的差异总结 3. Block的循环引用3.1 什么是循环引用?案例引入 循环引用解决方法1. 强弱共舞2. 手动中断循环引用3. 参数形式解决循环引用(block传参&#xff09…

汇编指令执行过程及CS与IP和DS寄存器关系与变化

内存指令及寄存器初始值: CS:2000H IP:0 DS:1000H AX:0 BX:0 上面在内存中的汇编指令是如何执行的? 验证: 在debug下用a指令先向内存写入下面指令,然后用u指令查看 mov ax,2000 mov ds,ax mov ax,[0008] mov ax,[0002] 在debug下用a指令先向内存写入下面指令,然后用u指…

Computer之Compilation:Cmake的简介、安装、案例应用之详细攻略

Computer之Compilation:Cmake的简介、安装、案例应用之详细攻略 目录 Cmake的简介 Cmake的安装 1、官方下载 2、执行安装程序,并按照提示进行安装 3、验证测试 Cmake的案例应用 Cmake的简介 CMake(Cross-platform Make)是一…

【嵌入式烧录/刷写文件】-1.7-将一个文本文件转换为Motorola S-record(S19/SREC/mot/SX)文件

案例背景(共5页精讲): 有如下两个文本文件(*.txt,*.ini,*.asc…)转换成Motorola S-record(S19/SREC/mot/SX)文件。常用于Key密钥,signature签名…的导入,或对一段数据计算出hex记录的最后一个字…

服务器性能优化方法

文章目录 服务器性能优化方法什么是服务器并发处理能力?什么方法衡量服务器的并发能力?怎么提高服务器的并发处理能力?**1,提高CPU并发计算能力**(1)多进程&多线程(2)减少进程切…

spring cloud搭建(eureka)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习新东西是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习…

力扣高频SQL50题(基础版)——第二天

力扣高频SQL50题(基础版)——第二天 1 文章浏览Ⅰ 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT distinct author_id id FROM Views WHERE author_idviewer_id ORDER BY id asc1.3 运行截图 2 无…

基于MSP430送药小车 ----- 基础篇【2021年全国电赛(F题)】

文章目录 一、赛题1. 任务2. 要求3. 说明 二、构思 分析1. 引脚利用2. PID算法3. 灰度循迹及标志位4. 视觉模块5. 直角转弯、原地转向 三、硬件清单四、逻辑设计1. 近端送药2. 中端送药3. 远端送药 五、程序设计1. OpenMV2. 灰度循迹3. 装药卸药 总结 一、赛题 1. 任务 设计并…

Linux Socket 分包 和 粘包 问题 - 解决方案

分包和粘包在TCP网络编程中是非常常见的,分包会造成 接收端 接收的数据不全的问题,粘包会造成接收多余的数据的文件。 这里做一个举例,例如客户端A要发送字符串“helloworld”给服务器B,A是一次性发送,但TCP有可能会将…

A Unified Conditional Framework for Diffusion-based Image Restoration

A Unified Conditional Framework for Diffusion-based Image Restoration (Paper reading) Yi Zhang, CUHK, CN, arXiv2023, Cited:0, Code, Paper 1. 前言 最近,扩散概率模型(Diffusion Probabilistic Models,DPMs)在图像生成…

Android 自定义View 之 饼状进度条

饼状进度条 前言正文一、XML样式二、构造方法三、测量四、绘制① 绘制描边① 绘制进度 五、API方法六、使用七、源码 前言 前面写了圆环进度条,这次我们来写一个饼状进度条,首先看一下效果图: 正文 效果图感觉怎么样呢?下面我们…

GLTF/GLB模型轻量化简明教程

GLB 文件格式很方便,因为它包含渲染所需的所有文件,包括纹理。 但是,根据用途,你可能希望简化文件,因为它有时非常详细。 在本文中,我将使用 gltf-transform 来执行简化,并且假设你使用的是 Wi…

0x23 Read Version Information Service

0x23 Read Version Information Service ReadMemoryByAddress服务允许客户端通过提供的起始地址和要读取的内存大小向服务器请求内存数据。 ReadMemoryByAddress请求消息用于请求由参数memoryAddress和memorySize标识的服务器的内存数据。 用于memoryAddress和memorySize参数的…

SAP-MM-原始接受订单

业务场景: 供应商是强势供应商,产品紧缺,订购货物需要自提,运损也归我们公司,而且立刻付款,那么就不能按以往操作,等供应商送货,再开票 我们在付款,那么SAP如何快速实现…

JS 排序算法

在前端工作中算法不常用,但是排序可能会经常会用,下面学习几种常用算法。 引用借鉴:js的五种排序方法_js排序_木可生森的博客-CSDN博客 JS 常见的排序算法_js排序算法_东风过境F的博客-CSDN博客 1.冒泡排序: 思路:逐次…

儿童节快乐,基于CSS3绘制一个游乐场动效界面

0️⃣写在前面 让代码创造童话,共建快乐世界。六一儿童节——这是属于孩子们的节日,也是属于我们大人的节日。让我们一起「致童真」,用代码(HTMLCSSJS)创造出一个游乐场,让这个世界多一份快乐和惊喜&#x…

如何把vue项目部署服务器(宝塔面板)上

一,vue项目打包 首先我们把准备好的vue项目进行打包: 输入命令:npm run build 生成dist文件 二、进入宝塔管理界面,点击网站,然后点击添加站点 三。按下面输入 点设置 四。 输入好点添加,注意&#x…

【Python开发】FastAPI 04:响应模型

响应模型是指在接口调用之后,服务器返回给客户端的数据模型。这个数据模型可以是一个简单的字符串,也可以是一个复杂的数据结构,如 JSON 或 XML 格式的数据。本篇文章将详细介绍 FastAPI 中的响应模型。 目录 1 响应模型 1.1 response_mode…