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.”
解释:测试代码应优先追求“描述性和有意义”,而不是完全避免重复。
相关文章:
Part 3 第十二章 单元测试 Unit Testing
概述 第十二章围绕单元测试展开,阐述了单元测试的实践与重要性,通过对比其他测试类型,突出其特点,还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容,为编写高质量单元测试提供指导。 章节概要 1…...
C++与Python:两种编程语言的区别
C和Python都是当今编程领域广泛使用的语言,它们各有特色,适用于不同的开发场景。本文将从语言特性、性能、学习难度、应用领域等多个方面探讨C与Python之间的区别。 一、语言特性 类型系统: C:是一种静态类型语言…...
Springboot 高频面试题
以下是Spring Boot的高频面试题及答案和底层原理解释: 基础概念 什么是Spring Boot,其主要特点是什么? 答案: Spring Boot本质上是一个建立在Spring框架之上的快速应用开发框架。其主要特点包括: 启动器:一…...
常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper
常用电脑?平均每天用 5 个小时?你就要考虑用一个护眼软件了,对皮肤也好。因为电脑屏幕有辐射,比如蓝光。 f.lux 作为一款专业护眼软件,值得使用。之前用了三年的 Iris Pro,现在 f.lux 做的更好了。 使用…...
MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用
目录 1 大白话说一下文章内容2 作者的电脑配置3 DeepSeek的本地部署3.1 Ollamal的下载和安装3.2 选择合适的deepseek模型3.3 安转deepseek 4 DifyDeepSeek构建Al应用4.1 Dify的安装4.1.1 前置条件4.1.2 拉取代码4.1.3 启动Dify 4.2 Dify控制页面4.3 使用Dify实现个“文章标题生…...
如何有效利用MYSQL的连接数
连接数配置2500~3000 依然发现连接不够用? -- 查看当前最大连接数 SHOW VARIABLES LIKE MAX_CONNECTIONS; -- 查看当前总链接数 SHOW STATUS LIKE Threads_connected; -- 查看当前进程明细 SHOW PROCESSLIST; 合理设置以下参数: 1. MySQL 的参数设置 …...
调用click.getchar()时Windows PyCharm无法模拟键盘输入
文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时,Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...
使用Hardhat实现ERC20 代币合约详解
ERC20 代币合约详解 💰 1. 合约概览 // SPDX-License-Identifier: MIT pragma solidity ^0.8.20;import "openzeppelin/contracts/token/ERC20/ERC20.sol";contract MyToken is ERC20 {constructor() ERC20("MyToken", "MTK") {_min…...
清华大学《DeepSeek与AI幻觉》(无套路免费分享)
随着人工智能技术的飞速发展,以DeepSeek为代表的国产大模型正逐渐成为各行各业的重要工具。然而,AI在生成内容时常常会出现“幻觉”——即生成与事实不符、逻辑断裂或脱离上下文的内容。 清华大学新闻与传播学院与人工智能学院联合推出的这篇教程《Deep…...
代码随想录算法【Day52】
Day51 101. 孤岛的总面积 思路 从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地 代码 #include <iostream> #include <vector> using namespace std; int dir[4][2] {-1, 0, …...
Spark 和 Flink
Spark 和 Flink 都是目前流行的大数据处理引擎,但它们在架构设计、应用场景、性能和生态方面有较大区别。以下是详细对比: 1. 架构与核心概念 方面Apache SparkApache Flink计算模型微批(Micro-Batch)为主,但支持结构…...
Unity结合Vuforia虚拟按键实现AR机械仿真动画效果
零、最终效果 待上传 一、资源准备 1、Vuforia Vuforia版本不能高于10.17.4(往上的版本虚拟按键功能被删除) 2、Unity Unity版本必须要高于2022.3.x,不然使用Vuforia插件时会出现bug 二、主要内容 1、添加虚拟按钮 2、为虚拟按钮设置…...
PL/SQL 异常处理
目录 一、命名的系统异常 1.常见命名的系统异常 2.预定义的系统异常数量以及描述 3.处理命名的系统异常的一般步骤 二、程序员定义的异常 1.概念 2.自定义异常的定义与抛出 3.自定义异常的处理 三、未命名的系统异常 1.概述 2.处理未命名的系统异常的方法 3.使用场景 …...
【自学笔记】Spring Boot框架技术基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Spring Boot框架技术基础知识点总览一、Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的主要特性 二、Spring Boot快速入门2.1 搭建Spring Boo…...
Redis 缓存穿透、击穿、雪崩:问题与解决方案
在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决…...
第一个CMAKE项目hello cmake
#注意! 这篇文章是为WINDWOS用户写的 #请检查你的电脑上已经安装了MINGW和CMAKE 快速检查方法如下 C:\Users\Basicoperation>g --version g (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 14.2.0 Copyright (C) 2024 Free Software Foundation, Inc. …...
骶骨神经
骶骨肿瘤手术后遗症是什么_39健康网_癌症 [健康之路]匠心仁术(七) 勇闯禁区 骶骨肿瘤切除术...
基于Django的购物商城平台的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法,但这种管理方法存…...
使用快捷键高效管理 VSCode:提升工作效率,告别鼠标操作
如果你想提高工作效率,减少鼠标操作,掌握键盘快捷键是一个非常有效的方式。在编程过程中,熟练使用快捷键能够快速管理文件、标签页,节省时间并提升效率。比如,Ctrl P 和 Ctrl W 可以快速打开和关闭文件,而…...
【找工作】C++和算法复习(自用)
文章目录 C头文件自定义排序函数stl 算法数据结构树状数组 数学 自用随便记录 C 排序 stl 头文件 全能头文件: #include<bits/stdc.h>自定义排序函数 bool compare(const int &odd1,const int &odd2) {return odd1>odd2; }stl 枚举map map&…...
如何解决AeroSpace窗口管理器下Kap屏幕录制工具的窗口异常问题
如何解决AeroSpace窗口管理器下Kap屏幕录制工具的窗口异常问题 【免费下载链接】AeroSpace AeroSpace is an i3-like tiling window manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ae/AeroSpace AeroSpace是一款为macOS设计的i3风格平铺窗口管理器&…...
苹果芯片未来五年的发展路线图
苹果芯片(Apple Silicon)正迎来一段重要的发展历程。据报道,台积电(TSMC)正致力于在2029年之前研发出1纳米以下的芯片,而苹果作为台积电最重要的客户,很可能成为全球首家在自家设备中搭载1.4纳米…...
3PEAK思瑞浦 TPS05S60A-DF8R-S DFN3X3-10 功率电子开关
特性 工作电压范围:2.5伏至5.5伏 集成高边MOSFET -13毫欧开启电阻 6A最大连续电流 -1.2-A至6-A可调输出电流限制 -4.7A时电流限制精度为土5% 2-A低待机电流 内置软启动和浪涌控制 集成保护功能:-过流保护 -硬短路至地保护-反向电流阻断保护 -过温保护 温度范围:-40C至125C 封装…...
5分钟极速上手:League Akari 智能工具包让您的英雄联盟体验焕然一新
5分钟极速上手:League Akari 智能工具包让您的英雄联盟体验焕然一新 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 您是否曾因错过…...
LoongArch五级流水线实战:手把手教你用阻塞技术搞定寄存器写后读冲突(附Verilog代码)
LoongArch五级流水线实战:手把手教你用阻塞技术搞定寄存器写后读冲突(附Verilog代码) 在CPU设计领域,流水线技术是提升处理器性能的关键手段,但随之而来的数据冲突问题也成为了工程师必须面对的挑战。本文将聚焦LoongA…...
【Linux】UnixBench深度解析:从分数调优到2D/3D图形测试实战
1. UnixBench基础:从原理到实战价值 UnixBench作为Unix/Linux系统性能评估的瑞士军刀,已经存在超过30年。我第一次接触这个工具是在2014年优化一批老旧服务器时,当时发现同样配置的机器跑分差异能达到40%,这才意识到系统调优的重要…...
用Python实战电商物流预测:从MathorCup赛题到真实业务场景的迁移指南
从数学建模到工业实践:Python驱动的电商物流预测与优化实战 当电商大促的订单如潮水般涌来时,物流网络就像一台精密运转的机器,任何一个齿轮的卡顿都可能导致整个系统崩溃。2023年MathorCup竞赛的C题恰好捕捉到了这个行业痛点——如何通过预测…...
免费Office界面自定义神器:三步打造你的专属办公环境
免费Office界面自定义神器:三步打造你的专属办公环境 【免费下载链接】office-custom-ui-editor Standalone tool to edit custom UI part of Office open document file format 项目地址: https://gitcode.com/gh_mirrors/of/office-custom-ui-editor 你是否…...
如何10分钟内搭建BepInEx游戏插件框架:完整入门指南
如何10分钟内搭建BepInEx游戏插件框架:完整入门指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一款功能强大的游戏插件框架,专为Unity Mono、…...
终极指南:如何在Windows 11上免费运行Android应用并深度开发
终极指南:如何在Windows 11上免费运行Android应用并深度开发 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA Windows Subsystem for Android&…...
