Part 3 第十二章 单元测试 Unit Testing

概述

第十二章围绕单元测试展开,阐述了单元测试的实践与重要性,通过对比其他测试类型,突出其特点,还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容,为编写高质量单元测试提供指导。
在这里插入图片描述

章节概要

1. 单元测试的重要性

单元测试是测试中范围较窄的类型,通常针对单个类或方法。
单元测试通过快速、确定性的测试帮助工程师提高生产力。
单元测试应覆盖代码的核心逻辑,确保代码变更不会引入缺陷。

2. 测试的可维护性

测试代码应尽量减少维护成本,只在必要时更新。
测试的脆弱性(如因无关变更而失败)会显著增加维护负担。
测试应通过公共API进行,避免依赖实现细节。

3. 防止脆弱测试

不变的测试:测试代码应尽量减少变更,除非系统行为发生变化。
通过公共API测试:测试应模拟系统的真实使用方式。
测试状态而非交互:关注系统的最终状态,而不是内部交互过程。

4. 编写清晰的测试

测试的完整性和简洁性:测试代码应包含所有必要信息,同时避免无关细节。
基于行为的测试:测试应关注系统的具体行为,而不是方法的实现。
清晰的测试结构:测试应明确包含“给定”、“当”、“则”三个部分。
有意义的测试名称:测试名称应清晰描述被测试的行为。
避免测试中的逻辑:测试代码应尽量避免复杂的逻辑,保持简单直接。
清晰的失败信息:测试失败时,应提供明确的错误信息。

5. 测试代码的共享:DAMP优于DRY

测试代码应优先追求描述性和有意义,而不是完全避免重复。
测试代码的共享应通过辅助方法实现,而不是依赖全局变量或复杂的初始化逻辑。

6. 测试基础设施

测试基础设施(如测试框架或工具)应标准化,以提高测试的可维护性。
测试基础设施本身也需要测试,以确保其正确性和稳定性。

总结

单元测试是软件工程师确保系统在面对未预见变更时仍能正常工作的强大工具。通过遵循本章介绍的最佳实践,测试可以显著提高代码质量,减少维护成本。Google的单元测试实践表明,清晰、稳定且易于维护的测试是提高开发效率的关键。

精彩语录

1.“测试的主要目的是防止缺陷,其次是提高工程师的生产力。”
“After preventing bugs, the most important purpose of a test is to improve engineers’ productivity.”
解释:单元测试通过快速反馈帮助工程师快速定位问题,从而提高开发效率。
2.“测试的可维护性是关键:好的测试应该‘一劳永逸’。”
“Maintainable tests are ones that ‘just work’: after writing them, engineers don’t need to think about them again until they fail.”
解释:测试代码应尽量减少维护成本,只在必要时更新。
3.“测试应该通过公共API进行,而不是依赖于实现细节。”
“Test via Public APIs.”
解释:通过公共API测试可以减少测试的脆弱性,确保测试与系统的实际使用方式一致。
4.“测试状态,而不是交互。”
“Test state, not interactions.”
解释:关注系统的最终状态比关注内部交互更能反映系统的实际行为。
5.“测试的清晰性至关重要:测试失败时,工程师应能迅速定位问题。”
“A clear test is one whose purpose for existing and reason for failing is immediately clear to the engineer diagnosing a failure.”
解释:清晰的测试能够快速帮助工程师理解测试的意图和失败的原因。
6.“测试应关注行为,而不是方法。”
“Test behaviors, not methods.”
解释:基于行为的测试比基于方法的测试更清晰、更稳定。
7.“测试代码应遵循DAMP原则,而不是DRY原则。”
“Tests and Code Sharing: DAMP, Not DRY.”
解释:测试代码应优先追求“描述性和有意义”,而不是完全避免重复。

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

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

相关文章

【Vite SVG 图标方案:vite-plugin-svg-icons 指南】

🌟 Vite SVG 图标方案:vite-plugin-svg-icons 指南 📜 背景与痛点 🌍 前端图标演进史 1.0 🖼️ 图片图标 → 2.0 🎭 字体图标 → 3.0 🎨 SVG 图标传统方案存在三大痛点: 字体图标…

go flag参数 类似Java main 的args

两部分内容 go run test1.go aa -name 123 1. 解析:aa -name 123 2. 解析:name 123 代码 package mainimport ("log""os" )func main() {log.Println("main ...")if len(os.Args) > 0 {for index, arg : ra…

酒店旅游API:数据交互的隐形桥梁——以携程API为例

一、API:酒店 和第三方服务无缝连接。 核心价值: 实时数据互通:房态、价格、库存秒级同步。业务流程自动化:预订、支付、确认全程无需人工干预。生态扩展:开发者可基于API构建定制化工具(如比价插件、智能…

深入理解 JSP 与 Servlet:原理、交互及实战应用

一、引言 在 Java Web 开发领域,JSP(JavaServer Pages)和 Servlet 是两个至关重要的技术,它们共同构成了动态网页开发的基础。Servlet 作为服务器端的 Java 程序,负责处理客户端请求并生成响应;而 JSP 则是一种简化的 Servlet 开发方式,允许开发者在 HTML 页面中嵌入 J…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter20-JavaScript API

二十、JavaScript API JavaScript API 随着 Web 浏览器能力的增加,其复杂性也在迅速增加。从很多方面看,现代 Web 浏览器已经成为构建于诸多规范之上、集不同 API 于一身的“瑞士军刀”。浏览器规范的生态在某种程度上是混乱而无序的。一些规范如 HTML5&…

AI芯片的关键特征

AI芯片是专门为人工智能应用设计的芯片,以下是其应具备的关键特征: 强大的并行计算能力:AI任务如深度学习中的神经网络训练和推理,涉及大量矩阵运算和并行数据处理。AI芯片需有众多计算单元(如GPU的大量流处理器、ASIC…

go 模块管理

go version 查看版本 go version go1.21.12 windows/amd64 需要保证:go的版本升级为1.11以上,go mod依赖的最底版本 go env 查看go的环境变量 go env 开启go mod # 标识开启go的模块管理 set GO111MODULE=on GO111MODULE有三个值:off, on和auto(默认值)。 GO111M…

Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)

文章目录 功能包括如何使用 功能包括 红点数据本地持久化 如果子节点有红点,父节点也要显示红点,父节点红点数为子节点红点数的和; 当子节点红点更新时,对应的父节点也要更新; 当所有子节点都没有红点时&#xff0c…

使用API有效率地管理Dynadot域名,为域名部署DNS安全拓展(DNSSEC)

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

Web - JS基础语法与表达式

概述 这篇文章主要介绍了 JavaScript 的基础语法,包括代码书写位置、ERPL 环境、变量(命名规则、默认值、初始化)、数据类型(基本和复杂,及各类型特点、转换)、表达式和运算符(算数、特殊算数、…

一台服务器将docker image打包去另一天服务器安装这个镜像

一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…

一周学会Flask3 Python Web开发-response响应格式

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中,数据可以通过多种格式传输。大多数情况下,我们会使用HTML格式,这也是Flask中…

TCP和Http协议

TCP 三次握手: 第一次握手 : 初始状态:开始时,客户端处于 CLOSED(关闭)状态,服务端处于 LISTEN(监听)状态,等待客户端的连接请求。客户端发送请求&#xff…

图论 之 最小生成树

文章目录 题目1584.连接所有点的最小费用 最小生成树MST,有两种算法进行求解,分别是Kruskal算法和Prim算法Kruskal算法从边出发,适合用于稀疏图Prim算法从顶点出发,适合用于稠密图:基本思想是从一个起始顶点开始&#…

前端面试之Box盒子布局:核心知识与实战解析

目录 引言:布局能力决定前端高度 一、盒模型基础:看得见的像素战争 1. 标准盒模型 vs IE盒模型 2. 核心组成公式 3. 视觉格式化模型 二、传统布局三剑客 1. 浮动布局(Float Layout) 2. 定位布局(Position Layou…

OnlyOffice:前端编辑器与后端API实现高效办公

OnlyOffice:前端编辑器与后端API实现高效办公 一、OnlyOffice概述二、前端编辑器:高效、灵活且易用1. 完善的编辑功能2. 实时协作支持3. 自动保存与版本管理4. 高度自定义的界面 三、后端API:管理文档、用户与权限1. 轻松集成与定制2. 实时协…

Python多线程编程理解面试题解析

一、多线程介绍 Python 的多线程是一种实现并发编程的方式,允许程序同时执行多个任务。然而,由于 Python 的全局解释器锁(GIL)的存在,多线程在某些场景下可能无法充分利用多核 CPU 的性能。以下是对 Python 多线程的理…

如何通过 Python 实现一个消息队列,为在线客服系统与海外运营的APP对接

对方有两个核心需求: 访客上线的时候,要通知对方的业务系统,业务系统根据访客的身份信息,推送个性化的欢迎词。访客完成下单的时候,要能推送一个下单成功的通知,并且包含订单信息和链接。根据这两个需求,那就需要实现由客服系统到业务系统的消息队列推送,以及通过 Open…

中文Build a Large Language Model (From Scratch) 免费获取全文

中文pdf下载地址:https://pan.baidu.com/s/1aq2aBcWt9vYagT2-HuxdWA?pwdlshj 提取码:lshj 原文、代码、视频项目地址:https://github.com/rasbt/LLMs-from-scratch 翻译工具:沉浸式翻译(https://app.immersivetrans…

项目设置内网 IP 访问实现方案

在我们平常的开发工作中,项目开发、测试完成后进行部署上线。比如电商网站、新闻网站、社交网站等,通常对访问不会进行限制。但是像企业内部网站、内部管理系统等,这种系统一般都需要限制访问,比如内网才能访问等。那么一个网站应…