单元测试:开篇明义

1059 篇文章 286 订阅

一个单元测试是一段自动化的代码,这段代码调用被测试的工作单元,之后对这个单元的单个最终结果的某个假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能快速运行。单元测试可靠、可读,并且可维护。一个工作单元可以小到只包含一个方法,也可以大到包括实现某个功能的多个类和函数。

作为开发人员,或多或少,都在某种程度上进行过单元测试,比如,写完代码在提交之前自己先测试下。也许你是用一个控制台来调用一个函数进行测试,也是是特意创建界面程序来检查某个组件的功能,或是干脆在实际应用程序中进行各种手工操作。最终的结果都是让你能在一定程度上确信代码工作正常,可以移交给他人。

这样的单元测试方法,有以下几个缺点:

  • 单元测试代码难于维护,甚至当时测完就被删了,即使有保留,也会经常发现以前(或一个月前、或一年前)写的测试代码无法运行;
  • 一个人写的单元测试,无法共享给团队里其他人运行。
  • 无法一键运行写过的所有单元测试。
  • 无法在几分钟内跑完所有单元测试。
  • 无法在几分钟内快速新建一个基本单元测试。

要解决这些问题,可以:

  • 使用单元测试框架编写单元测试;
  • 视单元测试代码跟产品代码同样重要,也要纳入版本管理,跟随产品代码一起维护。
  • 好的单元测试规范,学习他人总结的最佳实践,能让事半功倍。

一个优秀单元测试应具有如下特质:

  • 它应该是自动化的,可重复执行;
  • 它应该用一个单元测试框架编写;
  • 它应该容易实现;
  • 它应该运行速度很快;
  • 团队任何人都可以一键运行它;
  • 它应该是完全隔离的(独立于其他测试的运行);
  • 如果失败了,应该很容易发现什么是期待的结果,进而定位问题所在。

单元测试框架

单元测试框架是一个专门用于编写、运行和查看单元测试及其结果的框架,单元测试框架向开发人员提供进行单元测试的代码库和模块。

基本上每一种常用的编程语言都有一个单元测试框架,通常单元测试框架都以它们支持的语言的开头字母加上Unit作为名字,它们统称为xUnit框架。C语言的单元测试框架是CUnit,C++的是CppUnit,Java的是JUnit,.NET的是NUnit,Python的是PyUnit。不是所有的单元测试框架都这么命名,但大部分如此。
在这里插入图片描述
某些编程语言直接支持单元测试,他们的语法允许直接进行单元测试的声明而不需要导入第三方库,比如C#、D语言。

更多的单元测试框架可参阅(需翻墙): List of unit testing frameworks

单元测试谁完成

除非有明确的分工,否则单元测试往往是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。

什么时候开始单元测试

千万不要等到项目后期再进行单元测试,那样就失去检查代码、预防缺陷的意义了。

很多人觉得为软件编写单元测试的最佳时机是软件编码完成以后,但是越来越多的人选择在产品代码编写之前写单元测试,这种方法称之为测试驱动开发(Test-Driven Development,TDD)。这是一种不同于传统软件开发流程的新型的开发方法,它要求在编写某个功能的代码之前先编写测试代码,然后编写功能代码使测试通过,通过测试来推动整个开发的进行。

说到TDD,就不得不提到极限编程(ExtremeProgramming,简称XP),TDD是极限编程中的一个重要组成部分。Kent Beck先生最早在其极限编程方法论中,向大家推荐“测试驱动”这一最佳实践,还专门撰写了《测试驱动开发》一书,详细说明如何实现。经过几年的迅猛发展,测试驱动开发已经成长为一门独立的软件开发技术,其名气甚至盖过了极限编程。

有人将TDD和盖房子进行类比,让我印象深刻:

盖房子的时候,工人师傅砌墙,会先用桩子拉上线,以使砖能够垒的笔直,因为垒砖的时候都是以这根线为基准的。TDD就像这样,先写测试代码,就像工人师傅先用桩子拉上线,然后编码的时候以此为基准,编写出符合这个测试的功能代码,通过测试来推动整个开发的进行。

对单元测试的质疑

目前,在国内众多中小型IT公司众,鲜有将单元测试作为一种文化融入研发组织,做的好更是寥寥。应该来说是从意识形态上对单元测试的重视度不够,也许未来会慢慢改变。

如果要在组织中引入单元测试,往往会遇到很多质疑。其中质疑最严重的声音是:单元测试会不会给项目增加时间!

公司老板、团队领导者、项目经理和客户通常是最关注时间的人,这帮人也是项目的关键人、决策人,不说服这些人,将很难再项目中引入单元测试。

没错,单元测试确实会增加开发功能所需的时间,但是单元测试提升了代码质量。项目中整体代码质量的提高,可以缩短后续项目维护时间(主要是通过可维护性和容易修护缺陷实现的),从而缩短产品的交付周期。

更多的质疑和回答,可以参考《单元测试的艺术(第2版)》中的9.5章节,里面描述的很详尽。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值