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

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

  • 前言介绍
  • 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,并编写出更加可靠和高效的测试代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第11章 GUI Page436 使用缓冲DC, wxBufferedPaintDC

所谓“缓冲DC”,是指将所有图元都先划到一个人眼看不到的“设备上下文”之上,最后再一次性复制到真正的屏幕DC之上,这样我们就看不到中间画的过程了,也就不会感到闪烁了。 注意,这时不能解除ScrolledWindow1的背景擦除…

千帆起航:探索百度智能云千帆AppBuilder在AI原生应用开发中的革新之路

千帆起航:探索百度千帆AppBuilder在AI原生应用开发中的革新之路 1.揭开帷幕,大模型第二次战役 自从 ChatGPT 横空出世后,一石激起千层浪,人工智能也正在从感知理解走向生成创造,这是一个关键里程碑。生成式大模型完成…

[x86汇编语言]从实模式到保护模式第二版

下载汇编器:https://www.nasm.us/pub/nasm/releasebuilds/2.16.02rc6/win64/ mov ax, 0x3f add bx,ax add cx,ax 编译: C:\Users\HP>cd D:\BaiduNetdiskDownload\01b站\lizhong\myasm C:\Users\HP>D: D:\BaiduNetdiskDownload\01b站\lizhong…

H.264宏块(Macroblock)概念(运动估计、变换编码、环路滤波)

参考文章:音视频高手课系列5-h264编码基础(宏块原理) 参考文章:切片slice与宏块,运动矢量 文章目录 使用videoEye分析视频宏块示例H.264宏块概念1. 宏块的定义2. 运动估计3. 变换编码4. 环路滤波5. 注意:宏块的概念既适用于帧内编…

智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.侏儒猫鼬算法4.实验参数设定5.算法结果6.…

虚拟机(centos)磁盘空间不够

磁盘空间不够 1.关机 2.打开设置-->硬盘 --> 扩展 3.搞定一半 4.开机进入终端 4.1 查看 lsblk 4.2 加起来 growpart /dev/sda 3 注1: 如果 growpart 提示没有的话需要安装一下 yum -y install cloud-utils-growpart 注2:3前面有个空格 4.3 再次…

java八股 redis

Redis篇-01-redis开篇_哔哩哔哩_bilibili 1.缓存穿透 2.缓存击穿 逻辑过期里的互斥锁是为了保证只有一个线程去缓存重建 3.缓存雪崩 4.双写一致性 4.1要求一致性(延迟双删/互斥锁) 延迟双删无法保证强一致性 那么前两步删缓和更新数据库哪个先呢&#xf…

实时数据获取:抖音API在电商中的应用与影响

在电商行业高速发展的今天,数据已经成为企业决策和创新的重要驱动力。抖音作为全球最大的短视频平台之一,其根据关键词取商品列表API为电商行业带来了前所未有的机遇和挑战。本文将深入探讨该API在电商行业中的关键作用,以及如何实现实时数据…

day48算法训练|动态规划part09

198.打家劫舍 1. dp数组(dp table)以及下标的含义 dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。 2.递推公式 决定dp[i]的因素就是第i房间偷还是不偷。 如果偷第i房间,那么…

微信小程序获取用户手机号码教程(前端+后端)

1.背景介绍 在开发一款微信小程序时,需要用户进行微信登录,获取用户的手机号码来作为用户的唯一标识(userId),于是探索获取用户手机号码的方式; (当然,通过wx.login来获取code&…

JavaOOP篇----第十七篇

系列文章目录 文章目录 系列文章目录前言一、怎么在JDBC内调用一个存储过程二、是否了解连接池,使用连接池有什么好处?三、你所了解的数据源技术有那些?使用数据源有什么好处?四、&和&&的区别五、静态内部类如何定义前言 前些天发现了一个巨牛的人工智能学习网…

❀My学习小记录之XML❀

目录 ❀My学习小记录之XML❀ 一、简介 二、发展历程 XML历史: 三、XML常见应用 四、语法格式及相关介绍 语法: 格式声明(指令): 元素: 标记(标签): 属性: 注…

【Docker容器精解篇 】深入探索Docker技术的概念与容器思想

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《docker容器精解篇》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、Docker 的介绍1.1 Docker 的由来1.1.1 环境不一致1.1.2 隔离性1.1.3 弹性伸缩1.1.4 学习成本 1.2 Doc…

Python遥感影像深度学习指南(3)-卫星图像语义分割之用PyTorch创建一个简单的U-Net 模型

在上一篇文章中,介绍了如何在不使用 torchvision 模块的情况下,创建卫星图像的多通道数据集。现在,我们将继续创建一个简单的深度学习模型,用于卫星图像的语义分割。 1、介绍 下图来自 "卷积神经网络实现了从高分辨率无人机图像中高效、准确、精细地分割植物物种和群…

Python 简易图形界面库easygui 对话框大全

easygui 安装 C:\> pip install easygui Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting easygui Using cached https://pypi.tuna.tsinghua.edu.cn/packages/8e/a7/b276ff776533b423710a285c8168b52551cb2ab0855443131fdc7fd8c16f/easygui-…

基于ssm服装店网站论文

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统服装销售信息管理难度大,容错率低&#xff0c…

执行 delete from t1 where id = 10;MySQL会加什么锁?

思考一个问题:下面一条简单的SQL,它加什么锁? delete from t1 where id 10; 带着你的答案,我们继续往下看。 如果要分析上述SQL的加锁情况,必须了解这个SQL的执行前提,MySQL的隔离级别是什么…

2024年元旦节放假通知

致尊敬的客户以及全体同仁: 旧岁已展千重锦,新年再进百尺竿。在这辞旧迎新之际,易天光通信提前祝您元旦快乐!生意兴隆,身体健康,万事如意!根据国家法定假期的规定,并结合公司实际情…

VGG网络分析与demo实例

参考自 up主的b站链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGG(Visual Geometry Group)提出,斩获该年 Imag…

【网安 | 网络协议】ARP协议(地址解析协议)

前言 在使用nmap时可以使用-PR指令,通过发送ARP请求包进行主机存活探测。 那么这一过程的原理是什么呢? 在了解什么是ARP协议后,问题就迎刃而解了。 概念 地址解析协议,即ARP(Address Resolution Protocol&#xf…