理解单元测试(Unit Testing)

关于全新单元测试框架Swift Testing的知识,以及与XCTest的比较 我想分享一些关于 Swift 测试的经验。 个人认为 Swift Testing 比XCTest更加容易使用,功能也更加完善。 阅读详情

本文的目的是以最精炼的语言,正解什么是单元测试,为什么要单元测试,和如何进行单元测试。 

什么是单元测试(Unit Testing)?

测试(Testing)这个词很容易理解,那么什么是单元(Unit)呢?一个单元指的是应用程序中可测试的最小的一组源代码。一组源代码可测试,一般要求其有明确的输入和输出。因此,一般来讲,源代码中包含明确的输入和输出的每一个方法被认为是一个可测试的单元。注意,这里指的输出,并不局限于方法的返回值或对输入参数的改变,而包括了方法的执行过程中,改变的任何数据。

为什么要做单元测试?

单元测试的目的,是将应用程序的所有源代码,隔离成最小的可测试的单元,保证每个单元的正确性。理想情况下,如果每个单元都能保证正确,就能保证应用程序整体相当程度的正确性。

另一方面,单元测试也是一种特殊类型的文档,相对于书面的文档,测试脚本本身往往就是对被测试代码的实际的使用代码,对于帮助开发人员理解被测试单元的使用是相当有帮助的。 

如何进行单元测试?

隔离

要进行单元测试,首先就是要将被测试的单元,与所有外部依赖进行隔离。一般来讲,进行隔离主要有两种可选的技术,一种叫Stub,一种叫Mock。对于两个的区别和取舍,Martin Fowler有一个很经典的文章:Mocks Aren't Stubs。简单来说,如果要Stub或Mock一个方法,Stub指的是,为了测试,手动写一个相同签名的方法,根据我的测试需要,对给定的输入参数,返回一定的输出;而Mock则借助一定的框架组件,自动生成一个方法的实现,对于给定的输入,返回一定的输出。当然,所谓的Stub或Mock,并不单指对方法,尤其是在面向对象编程中,也可以是对属性,对对象或者对接口,等等。


为了方便实现隔离,对软件设计和开发的一个潜在的激励是,软件模块的设计人员和开发人员,不得不时时思考,在当前语言支持的各种特性的条件下,如何使得所写的代码,能够被方便的被隔离。虽然这看起来很像是一种限制,但是和软件设计的SOLID原则,其实是不谋而合的,因此,也就未尝不是一个优点了。

测试

解决了隔离的问题,我们就可以关注对一个单元的测试本身了。首先要提的一点是,所谓测试一个单元,一般往往是写一段测试脚本,给定输入,验证输出。但是,其实并非所有的单元测试都可以完全由计算机方便地自动完成的。尤其是如图形UI这样的比较抽象元素的判断。因此,从相对广义的角度来说,凡是能够用于验证一个被测试的单元正确性的所有方法进行的测试,都可以被认为是有效的测试。 

自动化

解决了隔离和测试本身的问题,下一个需要讨论的就是测试的效率的问题。尽管上面提到了,所谓单元测试,不完全都可以由计算机方便地自动完成,但是,对于那些可以由计算机自动完成的单元测试,如何提高写测试代码和运行测试的效率呢?答案是,陆续出现了很多的测试框架和测试工具。这些测试框架或工具,一般都会提供提高创建测试脚本效率的工具,并且,提供自动化执行测试和查看执行结果的功能,往往还可以很方便的和代码的自动化编译和部署进行集成,使测试自动化。

Guidelines

这里整理了一些如何写好测试代码的Guidelines:

  • 有测试总比没测试好
  • 测试尽可能的小而快
  • 使测试自动化
  • 进行代码覆盖检测
  • 在写任何新的实现代码或测试代码之前,先修复所有运行失败的测试
  • 再简单的代码也需要测试
  • 特别注意输入参数的边界案例
  • 不要只测试正常流程,还要测试可选和例外流程
  • 对于每一个报告的Bug,写一个对应的测试用例,方便回归测试
  • 时刻注意,所有测试都通过,不代表程序就真的100%没问题,测试永远只是辅助

英文资料

Microsoft Unit Testing Framework for C++ Author: kagulaDate: 2018-05-11Introduction       VC自带多个VC++单元测试工具,其中Microsoft Unit Testing Framework原生支持Test Explorer,  这里通过三个例子来学习Microsoft Unit Testing Framework,因为它原生支持Test Explorer.Environment [1]... 阅读详情

相关推荐

【The Art of Unit Testing 3_自学笔记01】第一章:单元测试基础

本文为《The Art of Unit Testing》全新第3版第一章自学笔记,针对单元测试中的基础核心概念做了深入探讨与辨析,最后通过层层递进,得到一个融合了工作单元、入口点、出口点等基础概念的全新单元测试的定义。观点非常新颖且极具参考价值,感兴趣的朋友建议收藏。望多多交流,欢迎批评指正。

PeacefulWinter的博客 1535

单元测试是否必要?

Is Unit Testing worth the effort? Unit testing is a lot like going to the gym. You know it is good for you, all the arguments make sense,

在路上... 3423

《Pragmatic Unit Testing》完整教程:构建健壮的软件

单元测试是软件开发中的一种测试方法,旨在验证代码中的最小单元(通常是一个函数或方法)的正确性。它通过对函数进行单独测试,确保每个独立模块按预期执行,是确保代码质量的重要手段。在.NET平台上,NUnit是一个广泛使用的单元测试框架,它提供了与JUnit和unittest类似的特性,并针对.NET平台做了优化。同样,NUnit支持通过注解来标注测试方法,使用断言来进行测试验证。在本章节中,我们介绍了几种主流的单元测试框架,它们为不同编程语言的开发者提供了一致的测试方法和工具。

weixin_29781865的博客 960

一文搞定unittest测试框架(TestCase、TestSuite、TextTestRunner、TestLoader、Fixture、参数化、断言、两种格式的测试报告)

unittest测试框架:主要包括:TestCase、TestSuite、TextTestRunner、TestLoader、Fixture、参数化、断言、两种格式的测试报告。

y_three的博客 3370

TSMaster二次开发实战:如何用Python搞定CAN/CANFD事件回调(附完整代码)

本文详细介绍了如何利用Python进行TSMaster二次开发,实现CAN/CANFD事件回调功能。通过实战代码演示,讲解了预发送与后处理回调的核心区别、注册流程、资源管理及性能优化技巧,帮助工程师高效构建自动化测试与数据监控应用。

star的博客 668

AI Agent Harness Engineering 创业PMF验证工具:用户满意度+留存率+业务指标监测表

在AI Agent创业的浪潮中,我们看到了无数产品如雨后春笋般涌现,但最终能够真正找到PMF并存活下来的却寥寥无几。根据CB Insights的数据,创业公司失败的首要原因(占42%)是"没有市场需求"——换句话说,就是没有找到PMF。AI Agent产品由于其特殊性(交互范式的变革、技术复杂度高、用户期望管理困难等),PMF验证变得更加具有挑战性。传统的SaaS产品PMF验证框架虽然有参考价值,但无法完全适用于AI Agent这种新型产品形态。

AI智能探索者的博客 331

全面了解Unittest单元测试框架

一,前言 1,单元测试 软件测试一般按阶段划分为:单元测试,集成测试,系统测试。单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证。 单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。 2,单元测试框架 单元测试其实就是构造数据使用一段代码去测试另一段代码,理论上来说,不使用单元测试框架也能进行单元测试。但如果用于单元测试的代码(即测试

Asaasa1的博客 3058

基于IC555的PWM信号发生器设计:从原理到电机调速与LED调光应用

脉冲宽度调制(PWM)是一种通过调节数字脉冲宽度来控制模拟信号电平的核心技术,其原理在于固定频率下改变高电平占空比,从而等效调节平均电压或功率。这项技术因其高效率、低损耗的特点,在电机调速、LED调光、开关电源等工程领域具有重要价值。本文聚焦于利用经典IC555定时器芯片构建PWM信号发生器,通过分析其无稳态工作模式及改进型电路设计,实现了占空比独立可调且频率稳定的信号输出。文中结合电机驱动与LED调光等具体应用场景,详细阐述了电路参数计算、元件选型、PCB设计及常见问题排查等实践要点,为电子爱好者与工程师

weixin_30342363的博客 396

UnitTesting 单元测试

UnitTesting 单元测试

Hanyang Li的专栏 1202

从零开始:用RFSOC XCZU47DR搭建软件无线电开发环境(2023最新版)

本文详细介绍了如何使用Xilinx RFSoC XCZU47DR搭建高性能软件无线电(SDR)开发环境,涵盖硬件选型、开发环境配置、射频子系统校准及实战应用开发。特别针对2023年最新技术需求,提供从基础配置到高级优化的完整指南,助力科研人员和工程师快速掌握RFSoC开发技术。

weixin_42525005的博客 511

emwin与Modbus通信结合:项目实例

通过实际项目讲解emwin界面设计与Modbus通信协议的融合应用,深入剖析数据交互流程。掌握emwin在工业控制场景中的实用技巧,提升系统人机交互与稳定通信能力。

weixin_34618526的博客 483

软件测试——Unittest单元测试框架详解

软件测试一般按阶段划分为:单元测试,集成测试,系统测试。单元测试(unit testing)是指对软件中的最小可测试单元进行检查和验证。 单元测试中单元的含义,单元就是人为规定的最小的被测功能模块,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。在实际项目中,单元测试往往由开发人员完成。

qaqqqqqaq_的博客 3929

安卓手机部署酒馆 SillyTavern 全攻略(Termux 本地安装教程)

本文详细介绍了如何在安卓手机上通过 Termux 环境本地部署 SillyTavern,一个功能丰富的角色扮演对话 AI。步骤包括安装 Termux、Git,克隆 SillyTavern 仓库,安装 Node.js 和依赖,启动 SillyTavern,以及可选的高阶玩法——安装 TAI-Extras 扩展模块。文章还提供了常见问题的解决方案和优化技巧,如更新 SillyTavern、处理报错、文件访问、添加快捷命令和禁用安卓后台进程杀死。通过本教程,用户可以在安卓手机上体验本地部署的 AI 对话,享受更高

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

Flask框架(六)--蓝图,请求钩子,上下文,单元测试(Flask,Django)

一、蓝图–blueprint 类似于django中的app子应用。 flask中,要将项目模块化,就应该使用blueprint,它是flask自带的一种开发模式,目的是方便开发大型的项目。 使用 from flask import Flask,Blueprint # 实例化一个蓝图对象 # 参数:第一个 bp = Blueprint('goods',__name__) @bp.route('/...

一个非常正经的人的博客 545

出现 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the 解决方法

Access to XMLHttpRequest at 'http://127.0.0.1:5000/api/data' from origin 'http://10.197.0.79:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

码农研究僧的博客 1万+

linux v3h平台开发系列详解(GMSL摄像头篇):1.12 解串器MAX96712输出4 lane 变 2 lane的配置

本文详细介绍了在Linux v3h平台上,针对Max96712解串器进行MIPI 4lane到2lane配置。内容包括串行器解串器介绍、链路框架、硬件连接、以及软件寄存器如何配值和一些问题的解决方法。

xian18809311584的博客 1092

更有效率的使用Visual Studio(二)

VS 允许你创建自己的代码片段。比如你经常写日志,每次都敲。

Vl09i070E的博客 175

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

体验VS2017的Live Unit Testing

相对于传统的Unit Test,VS2017 带来了一个新的功能,叫Live Unit Testing,从字面意思理解就是实时单元测试,在实际的使用中,这个功能就是可以在编写代码的时候进行实时的background的单元测试. 在体验之前,有几点注意事项是需要了解的: 1.目前 live unit tesing仅仅支持 C#和VB的传统.net版本,不支持.net core,当然,我觉得也不支

dotNET跨平台 1564

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

深入理解单元测试

如果有人问你,“什么是单元测试?”,你可能会想到测试金字塔:测试金字塔从下往上分别是单元测试、集成测试和端到端测试,单元测试通常是面向类或方法级别的测试方法;集成测试则面向服务或模块级别;端到端测试是从最终用户的角度进行测试,测试对象为整个系统。在一个设计良好的系统中,这三类测试的占比就像它们在金字塔中的面积,越往下越高;测试执行速度越往下越快。测试金字塔所表达的意思是,单元测试的执行效率更高,因此我们应依靠大量的单元测试、辅助以少量的集成测试和端到端测试,来保证系统的功能正确。

ruanrunxue的博客 3897

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringBoot单元测试(unit testing)

单元测试

m0_58157267的博客 3754

Unit Testing 详细介绍

Unit Testing 详细介绍

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1295

单元测试(unit testing)到底是什么?

单元测试(unit testing)是软件开发中的一种最低级别的测试方式,对软件中的最小可测单元进行检查和验证,看功能是否符合预期。单元测试是在软件开发过程中进行的,测试代码由开发人员进行编写。单元测试是自动化测试的一种常见形式,可以确保软件的独立单元在与其他部分相隔离的情况下正常运行。因单元测试这个术语是软件工程学发展过程中逐渐浓缩出来的,所以对于单元测试中单元的具体含义要根据实际情况而定,单元可以是一个函数、一个类或者一个模块等。

路多辛的所思所想 2563

单元测试(Unit testing)

  有些东西尝到甜头才觉得它的好,单元测试(后续就简称ut)对我来说就是这样。不管你在做的项目是松还是紧,良好的ut都会让你事半功倍。   UT的定义可以打开https://en.wikipedia.org/wiki/Unit_testing进行一下了解,文中提到的写UT的几个好处确实深有体会。 写UT能给你带来什么? Finds problems early 更早的发现bug,而不是...

weixin_33725272的博客 199

Awesome Unit Testing in Swift 使用指南

#Awesome Unit Testing in Swift 使用指南 1. 项目介绍 Awesome Unit Testing in Swift 是一个开源项目,由 Oleh Zayats 创建和维护。该项目旨在收集和整理关于 Swift 语言单元测试的精彩文章、书籍、演讲、播客、工具/框架以及示例。无论你是初学者还是有经验的开发者,这个项目都能为你提供丰富的资源和最佳实践,帮助你提高 Swif...

gitblog_00118的博客 398

《Unit Testing》1.1 -1.2 单元测试的目的

本系列是《Unit Testing》 一书的读书笔记 + 精华提取。书中的例子 C# 语言编写,但概念是通用的,只要懂得面向对象编程就可以。 单元测试当前的状态目前,在(美国的)大部分...

dotNET跨平台 769

Unit Testing All-in-One

单元测试 (Unit Testing) 是dev testing的核心,它的优点有很多很多,但真正能够享受到其众多优点的项目确不多。我想这主要是因为,在我们开发实践中人们还是对单元测试有一些误解的,其中最大两个误解就是 :        “只要有单元测试就不需要功能测试和集成测试,开发人员可以完全取代测试人员。”        “单元测试不能发现新Bug, 成本太高,看不到回报。”

Jeffrey Zhou 的专栏 2434
上一篇: 正解TDD
下一篇: 理解O/R Mapping
teddyma
博客等级 码龄25年 5粉丝 187原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值