单元测试介绍

news2024/10/4 18:28:36
  1. 除非系统非常小,否则很难频繁地进行手工测试。要避免此类操作,唯一的办法是使用自动化测试;要缩短和降低构建、部署和维护应用程序的时间和成本,唯一有效的方法是使用自动化测试。通常是通过将系统分成细小的单元实现的。在Java中,单元就是方法。作为最小的编程单位,单元提供的反馈环路是最快的
  2. 什么是单元测试
    1. 单元测试(UT)是一种实践,要求我们对每个隔离的小型代码单元进行测试。单元通常是方法,但有些情况下,整个类乃至整个应用程序都可视为单元。要编写UT,需要将受测代码同应用程序的其他部分隔离。最理想的情况是,要么系统已实现这样的隔离,要么可通过使用模拟对象实现隔离。如果特定方法的单元测试跨越了该单元的边界,它将变成集成测试。这种情况下,测试的是哪些代码将变得不那么清晰。如果测试失败,问题的范围将急剧增大,找出原因的工作将更为繁琐。
  3. 为什么要进行单元测试
    1. 一个常见的问题是:为何使用单元测试而不是功能和集成测试。单元测试并非要取代其他类型的测试,而只是缩小其他测试的范围。从本质上说,单元测试的编写比其他任何类型的测试都更容易、更快捷,从而能够降低成本、缩短上市时间。由于编写并运行单元测试所需的时间更少,它们通常能够更快发现问题。而问题发现得越早,修复的成本就越低。Bug出现后,如果能够在几分钟内发现,则与几天、几周乃至几个月后才发现相比,修复将容易得多。
  4. 代码重构
    1. 代码重构指的是对既有代码的结构进行修改,同时不改变其外部行为。重构旨在改进既有代码,这样做的原因很多:提高可读性、降低复杂度、使其更易于维护或更容易扩展等。不管重构的原因是什么,其终极目标都是改进代码的某个方面,从而降低技术债务:减少因设计、架构或编码不佳而需要做的额外工作。
    2. 通常,我们在不改变行为的情况下做一系列细微的修改以实现重构。通过缩小修改范围,我们可始终确认所做的修改没有破坏既有功能。而要获得这样的确认,唯一有效的办法是使用自动化测试
    3. 单元测试的一大优点是,为重构提供最有力的支持。如果没有自动化测试确认应用程序依然像期望的那样工作,重构将风险重重。虽然任何类型的测试都可用于提供重构所需的代码覆盖率,但大多数情况下,只有单元测试能够达到要求的细致程度。
  5. 单元测试和其他类型的测试差别
    1. 单元测试旨在对小型功能单元进行检查。在Java中,这些单元就是方法。对于所有外部依赖,诸如对其他类、方法或数据库的调用等,都应在内存中完成,这是通过使用模拟对象、存根、间谍、伪造对象和哑元对象实现的。测试替身它涵盖了前述各种对象。单元测试很简单、易于编写且运行速度很快,通常在所有测试中占据的分量最大。
    2. 功能测试和验收测试的职责是核实整个应用程序像预期的那样工作。这两种测试的用途不同,但目标相似。单元测试旨在检查代码的内部质量,而功能测试和验收测试用于确保整个系统在客户或用户看来能够正常工作。为编写和运行这些测试,需要付出更多成本和劳动,因此其数量通常比单元测试少。
    3. 集成测试旨在核实各个单元、模块、应用程序乃至系统被妥善地集成在一起。你可能有一个前端应用程序,它使用后端API,而后端API又与一个数据库通信。这种情况下,集成测试的职责是核实这三个不同的组件被紧密地集成在一起,能够彼此通信。执行集成测试前,已确认所有单元都能正常工作、所有功能测试和验收测试都已通过,因此集成测试唯一的职责是确认所有组件能够很好地协同工作,所以其数量是最少的。
  6. TDD的单元测试
    1. 传统做法是在实现代码完成后编写单元测试,而TDD中的顺序相反——先编写测试。未使用TDD的情况下,单元测试用于验证既有代码;而在TDD中,应将单元测试作为驱动开发和设计的动力,它们定义最小可能单元的行为,指定有待实现的微型需求。测试指出了你接下来该做什么以及该做到什么程度为止,至于要完成的工作量,则随测试类型(单元测试、功能测试、集成测试等)而异。
    2. TDD中,单元测试指定接下来应完成尽可能小的任务,即一个方法乃至其一部分。另外,TDD还要求我们遵守一些设计原则,如KISSkeep it simple stupid,保持简单)。通过编写范围很小的简单测试,可确保这些测试的实现也同样简单。通过要求测试不使用外部依赖,可确保实现代码严格遵守关注点分离原则。
    3. 未使用TDD的情况下,单元测试将只用于测试既有代码,对设计毫无影响。总之,未使用TDD的情况下,单元测试的主要目标是验证既有代码;而在TDD中,单元测试是预先编写的,其主要目标是定义需求和设计,而验证只是副产品。与实现后再编写测试相比,这样做的一个结果是产品质量更高。这样编写的单元测试的代码覆盖率极高,每当对代码进行修改后,都可使用它们进行回归测试。未使用TDD的情况下,单元测试只是测试,其质量也是不确定的。

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

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

相关文章

jmeter学习(5)定时

Jmeter之定时器_jmeter定时器-CSDN博客 Jmeter(十三) - 从入门到精通 - JMeter定时器 - 上篇(详解教程)-腾讯云开发者社区-腾讯云 (tencent.com) 定时器是在每个sampler之前执行的,无论定时器位置在sampler之前还是子节点下面当执行一个sam…

TypeScript 算法手册 【基数排序】

文章目录 1. 基数排序简介1.1 基数排序定义1.2 基数排序特点 2. 基数排序步骤过程拆解2.1 找出数组中的最大值2.2 从最低位开始,对每一位进行计数排序2.3 对某一位数进行计数排序2.4 将排序结果复制回原数组 3. 基数排序的优化3.1 处理负数3.2 字符串排序案例代码和…

Go语言实现随机森林 (Random Forest)算法

在 Go 语言中实现随机森林(Random Forest)算法通常涉及以下几个步骤: 数据准备:将数据集分为训练集和测试集,确保数据格式适合算法使用。 决策树的构建:随机森林是由多个决策树构成的,首先需要…

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置 目录 MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密码 一…

使用前端三剑客实现一个备忘录

一,界面介绍 这个备忘录的界面效果如下: 可以实现任务的增删,并且在任务被勾选后会被放到已完成的下面。 示例: (1),增加一个任务 (2),勾选任务 &#xff…

【知乎直答】批量多线程生成原创文章软件-AI智能搜索聚合

【知乎直答】批量多线程生成原创文章软件介绍: 1、知乎发布的全新AI产品“知乎直答”是其AI搜索功能的产品化成果,旨在提升用户的提问、搜索体验以及结果生成和归纳的质量。 2、数据基础:该产品基于知乎平台上的真实问答数据及全网高质量问答…

Chromium 中前端js XMLHttpRequest接口c++代码实现

在JavaScript中发出HTTP请求的主要方式包括&#xff1a;XMLHttpRequest对象、Fetch API、Axios库和各种其他的HTTP客户端库。 本人主要分析下XMLHttpRequest接口在c中对应实现 一、上前端代码 <!DOCTYPE html> <html lang"en"> <head> <meta…

Go基础学习11-测试工具gomock和monkey的使用

文章目录 基础回顾MockMock是什么安装gomockMock使用1. 创建user.go源文件2. 使用mockgen生成对应的Mock文件3. 使用mockgen命令生成后在对应包mock下可以查看生成的mock文件4. 编写测试代码5. 运行代码并查看输出 GomonkeyGomonkey优势安装使用对函数进行monkey对结构体中方法…

Marp精华总结(二)进阶篇

概述 这是Marp精华总结的第二篇&#xff0c;主要补充第一篇未提到的一些内容。 系列目录 Marp精华总结&#xff08;一&#xff09;基础篇Marp精华总结&#xff08;二&#xff09;进阶篇Marp精华总结&#xff08;三&#xff09;高级篇 自适应标题 通过在标题行中插入<!-…

历经十年/头发都快掉光/秘钥生成器终极版/机器码/到期功能限制/运行时间限制/日期防篡改/跨平台

一、项目介绍 1.0 前言说明 标题一点都不夸张&#xff0c;从第一版的秘钥生成器到今天这个版本&#xff0c;确实经历了十年的时间&#xff0c;最初的版本做的非常简陋&#xff0c;就是搞了个异或加密&#xff0c;控制运行时间&#xff0c;后面又增加设备数量的控制&#xff0…

JavaFX加载fxml文件几种方法

环境&#xff1a;idea&#xff0c;maven创建JavaFX工程 工程目录如下&#xff1a; MusicPlayer.java package cn.com;import java.io.IOException;import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.geo…

目标检测 Deformable DETR(2021)详细解读

文章目录 前言整体网络架构可变形注意力模块backbone生成多尺度特征多尺度位置编码prediction heads两个变体 前言 为解决DETR attention的计算量大导致收敛速度慢、小目标检测效果差的问题&#xff1a;提出了Deformable Attention&#xff0c;其注意力模块只关注一个query周围…

ML 系列: (10)— ML 中的不同类型的学习

一、说明 我们之前将机器学习方法分为三类&#xff1a;监督学习、无监督学习和强化学习。机器学习方法可以分为不同的类型&#xff0c;我们将在下面讨论最重要的类型。 二、懒惰学习与急切学习 预先学习的工作原理是使用训练数据构建模型&#xff0c;然后使用此模型评估测试数据…

STM32F103C8----3-3 蜂鸣器(跟着江科大学STM32)

一&#xff0c;电路图 &#xff08;接线图&#xff09; 面包板的的使用请参考&#xff1a;《面包板的使用_面包板的详细使用方法-CSDN博客》 二&#xff0c;目的/效果 3-3 蜂鸣器 三&#xff0c;创建Keil项目 详细参考&#xff1a;《STM32F103C8----2-1 Keil5搭建STM32项目模…

MySQL 中的 EXPLAIN 命令详解

在 MySQL 数据库中&#xff0c;EXPLAIN命令是一个非常强大的工具&#xff0c;它可以提供关于 SQL 查询执行计划的关键信息。理解这些信息对于优化查询性能至关重要。本文将详细介绍 MySQL 中的EXPLAIN命令提供的关键信息。 一、什么是 EXPLAIN 命令 EXPLAIN命令用于获取 MySQ…

Java多态(向上转型、动态绑定)+结合题目理解原理

第一次尝试使用markdowm写博客哈 文章目录 1.多态的引入2.重写和重载3.避免在构造方法里面去调用重写4.向上转型和向下转型5.让你真正明白什么是多态6.通过一些习题进行理解 1.多态的引入 首先说一下&#xff0c;这个想要使用多态需要我们满足的条件&#xff0c;然后具体的进行…

进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解

目录 一、冯诺依曼体系结构1、概念2、硬件层面的数据流3、关于冯诺依曼的知识点强调4、CPU 工作原理5、补充&#xff08;CPU 和寄存器、高速缓存以及主存之间的关系&#xff09; 二、操作系统&#xff08;Operating System&#xff09;1、概念2、定位3、设计 OS 的目的4、如何理…

Linux高级编程_28_进程

文章目录 进程并行与并发单道与多道程序进程控制块(PCB)了解PCB存储位置进程号&#xff1a;进程号&#xff1a;&#xff08;PID&#xff09;进程组号&#xff1a;&#xff08;PGID&#xff09;父进程号&#xff1a;&#xff08;PPID&#xff09; fork函数 多进程创建进程状态进…

基于vue框架的大学生勤工俭学咨询服务系统的设计与实现60uw9(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;大学生,企业,招聘信息,在线咨询,咨询回复,职位应聘 开题报告内容 基于Vue框架的大学生勤工俭学咨询服务系统的设计与实现 开题报告 一、研究背景 随着高等教育的普及与就业市场的竞争加剧&#xff0c;大学生勤工俭学已成为一种普遍现…