第一章 为什么使用单元测试

第一章 为什么使用单元测试

  1.1 程序员的工作——修改软件

  修改既有代码是程序员谋生的手段。但是为什么我们需要去修改软件呢?修改软件有以下4个主要起因:

  ● 修正bug

  ● 添加新特性(feature)

  ● 改善设计

  ● 优化资源使用

  这4项都与软件的“行为”密切相关,见下表。


软件的既有行为

软件的新行为

修正bug

改变软件的既有行为

增加新行为

添加新特性

保持软件的既有行为,完全不修改既有代码


改善设计

保持软件的既有行为,但软件的可维护性得到提升


优化资源使用

保持软件的既有行为,但软件的性能得到提升

  通过这张表格我们看出:只有在修正bug时,我们才需要改变软件的既有行为,而在其他情况下,我们都需要保持住软件的既有行为。如果我们在改善设计,优化,或添加新特性时改变了软件的既有行为,那我们实际上是给软件引入了bug。

  可是程序员的工作就是修改软件,所以我们有很多的“机会”给软件引入bug。有什么办法能让我们的生活轻松一点,而不用因为修改代码引入bug而担惊受怕吗?

  1.2 软件夹钳——测试

  我们已经看到:在大多数情况下,我们希望对软件所做的改动不会改变系统的既有行为。即使是对于修正bug这种情况,我们也希望一旦bug被修正,那么修正后的正确行为能够得到保持,而不会被再之后的代码修改所改变。怎样做到这一点呢?

   让我们这样想想:如果我们能在对代码进行改动之前,用一种“软件夹钳”(software vise)来固定住软件的既有行为,那么我们就可以放心大胆地去修改代码了。那么,又是什么可以来充当“软件夹钳”呢?答案是:测试。我们可以这样想一 下:当一段代码被一组良好的测试所覆盖时,我们就可以放手去修改这段代码,并在修改完成之后立即运行这组测试,来验证我们的修改并没有改变既有行为而引入 bug。如果确实改变了既有行为,那么测试就会明确无误地发出警报。由此可见,测试就是程序员所需要的“软件夹钳”。

  1.3 单元测试与集成测试之争

  我们已经知道了“测试”就是程序员所需要的“软件夹钳”。但是测试分为单元测试和集成测试,程序员需要哪种测试呢?让我们来分析一下程序员需要什么样的测试,这样或许我们就能知道程序员应该更偏向于哪种测试了。

  ● 程序员需要的测试应该是能帮助程序员定位错误的,这样程序员才会真正地从测试中得到“实惠”。

  ● 程序员需要的测试应该是很容易执行的,最好是只需点击一个按钮或键入一条命令,这些测试就能运行,而无需费时费力地去搭建测试环境及准备测试数据或仪器。

  ● 程序员需要的测试应该是运行速度很快的,最好能在几分钟内完成,这样程序员才能快速地得到反馈,采取下一步动作。

  ● 程序员需要的测试应该是易于写就的,而不愿意对代码基大动干戈,这样程序员才会愿意去写这些测试。

  ● 程序员需要的测试应该是自动化的,可重复的。这样程序员才会愿意重复多次地去运行这种测试。

  比对程序员的需求,我们可以发现集成测试往往不能满足程序员的这些需求:

  ● 集成测试由于涉及多个模块,因此往往不能提供准确的错误定位信息。

  ● 集成测试的执行时间一般较长(小时级),这不能给程序员带来快速反馈。

  ● 集成测试可以自动化执行,但前提是把测试环境和测试数据等事先准备好。

  ● 集成测试由于不太容易写就,通常不是由程序员写就,而由专门的测试人员写就。

  相反,单元测试,尤其是良好的单元测试,恰恰正是程序员所需要的那种测试:

  单元测试针对单个类或单个方法,能很有成效地帮助程序员准确定位问题所在。

  单元测试应该是执行时间很短的,全部执行也只需5到10分钟,程序员正好可以去喝喝咖啡。

  单元测试是一种“虚拟”测试,重在测试代码逻辑,因此一般不需要真实测试环境和测试数据的支持。

  单元测试是很容易写就的,尤其是有单元测试框架的帮助时。

  由此可见,对于程序员而言,需要的是单元测试。程序员使用单元测试来充当软件夹钳,并在修改代码时获得快速反馈,从而更有信心地投入到修改软件的工作中。

  1.4 进行单元测试的其他好处

  我们已经知道了单元测试带来的一个好处:它可以充当程序员的“软件夹钳”,在程序员修改软件的过程中给予程序员快速的反馈,帮助程序员定位问题,避免引入bug。单元测试就只有这一个好处吗?不是的。下面我们就来看看引入单元测试带来的其他好处。

  1.4.1 单元测试是代码的“活文档”

  让文档及时反映软件设计和代码的最新情况,这是一个颇有挑战性的问题。一种较好的思路是:使用“内部”文档,即把文档同代码“拴”在一起。这样当代码发生改变的时候,文档也能相应更新。注释就是一种内部文档,良好的注释应该反映代码的最新状况。

  类比来看,单元测试同样也是内部文档,因为单元测试本质上也是描述了被测类或被测方法的行为。对软件行为不了解的程序员,可以通过阅读单元测试 代码来理解软件的行为。同注释相比,单元测试还具有一个更好的特性:它是一种“可执行”文档。如果单元测试在被执行时无法通过,那么说明要么单元测试没有 反映当前代码的真实状况,要么说明代码中有bug。无论哪种情况,程序员都需要修改某一方,以保持两者的一致。

  1.4.2 具有可测试性的软件具有更高的质量

  近年来流行的极限编程方法论推崇“测试驱动开发”。我们认为,“测试驱动开发”并不一定要求必须先有测试后有代码,而关键在于要求在设计软件和 实现编码时,一定要预先把软件的可测试性考虑周全。这种可测试性的重要体现就是能够方便地将单个类或方法纳入单元测试之中。具有可测试性的软件的质量往往 高于不具有可测试性的软件,为什么这样说呢?

  ● 一个类能够被方便地纳入单元测试,往往说明这个类职责单一,也就是说它满足“单一职责原则”。

  ● 一个类能够被方便地纳入单元测试,往往说明它与其他类之间的耦合程度较低,相互依赖性较小,而且很可能满足“依赖抽象原则”和“开放-封闭原则”。

  因此, 具有可测试性的软件,也更有可能是满足良好设计原则的软件,所以往往质量更高。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-13 18:34:52

第一章 为什么使用单元测试的相关文章

第一章 andriod studio 安装与环境搭建

原文 http://blog.csdn.net/zhanghefu/article/details/9286123 第一章   andriod studio 安装与环境搭建   一.Android Studio简介 Android Studio是Google新发布的Android应用程序开发环境,Android Studio是基于IntelliJ IDEA开发而成的.在Android Studio开发环境中,Android开发者可以非常方便地调试Android应用程序,Android Studi

经典中的品味:第一章 C++的Hello,World!

1.1 程序 何为程序?简单的说,就是为了使计算机能够做事,你需要在繁琐的细节中告诉它怎么做.对于怎么做的描述就是程序. 编程是书写和测试怎么做的过程.维基百科上说,一个程序就像一个用汉语(程序设计语言)写下的红烧肉菜谱(程序),用于指导懂汉语和烹饪手法的人(体系结 构)来做这个菜.做一个形象的比喻,在生活中某种意义上,你都见到程序.石器时代,"我们用石头打它".就是个程序. 图1.1 "我们用石头打它"  摘自 <数学之美> 其中,他用怪叫和动作告诉小

Frontpage2000中文教程:第一章 认识Frontpage2000

frontpage|教程|中文  你是否紧跟时代的潮流上了网?你在聊天室里是否听过别人聊起自己的个人主页,你会不会觉得自己没有个人主页就落伍了?有没有想过自己也要做一个主页?想过?那你还瞎呆在那里干什么?赶快阅读本教程,你就该学会制作自己的主页了. 本教程教你学会使用微软公司的Frontpage2000,学会干什么?当然是做你的个人主页啦.或许你认为制作主页是一门很深奥的工作,需要懂得大量的计算机知识.我现在要告诉你,你错了.在这个流行图形操作系统的今天,制作主页不再需要你去学习复杂,烦躁的HT

第一章 容错机制 &amp;gt;

容错 第一章 容错机制 以国内最流行ASP为例,我不知道有多少人会在写代码时想到"容错"这个概念,实际上当我遇到这种事时,也是不了了之.为什么呢,想想最初的意思是认为写如下代码就能容错了,见示例1-1. <%@ Language=VBScript %> <%option explicit%> <% '出错过滤 on error resume next -----(代码略) %> 示例1-1 常见代码一瞥 以上代码就经常出现在各位同仁的手中,不用说出个

第一章 CSS的基本认识

CSS是『Cascading Style Sheets』的简称,中文翻为「串接样式表」,也有人只翻为「样式表」.CSS用以作为网页的排版与风格设计,在所谓的「新式网页」里 ,CSS不容置疑是相当重要的一环.CSS是以既有的基础,用以弥补既存HTML 规格里的不足,也让网页的设计更为灵活. 这份教学文件就要来为您介绍CSS的应用罗!在这边并不介绍CSS的所有规格 ,仅就您在网页写作上较常用到,较可能用到的语法部份及应用的方法来为您作介绍.也 由於现在两浏览器的相容是渐行渐远,将贴心地为您注明支援该

网页排版CSS教学第一章 CSS的基本认识

css|网页 第一章 CSS的基本认识 关 於 C S S 的 概 论 CSS是『Cascading Style Sheets』的简称,中文翻为「串接样式表」,也有人只翻为「样式表」.CSS用以作为网页的排版与风格设计,在所谓的「新式网页」里 ,CSS不容置疑是相当重要的一环.CSS是以既有的基础,用以弥补既存HTML 规格里的不足,也让网页的设计更为灵活. 这份教学文件就要来为您介绍CSS的应用罗!在这边并不介绍CSS的所有规格 ,仅就您在网页写作上较常用到,较可能用到的语法部份及应用的方法来

第一章 C#简介(rainbow 翻译) (转自重粒子空间)

<展现 C#> 第一章 C#简介(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch01.shtml 正文: 展现   C#  第一章                      C#    简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言?必须回答

《.net编程先锋C#》第一章 C#简介(转)

编程 第一章 C# 简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言? 必须回答的一个问题:当您已经使用C++或VB从事企业开发时,为什么还要学习另一种语言? 市场式的回答就是:"在企业计算领域,C#将会变成为用于编写"下一代窗口服务"(Next Generation Windows Services,简写为NGWS

实战案例分析网站排名之第一章

这篇<实战案例分析网站排名之第一章>主要是为了和大家一起分析排在百度搜索结果第一位的网站情况,以实例的方式让大家的分析思路更清晰,现在大部分SEO培训教学中所灌输的潜意识都是以内容为皇.外链为王的理论知识,很多SEO导师都是建议网站应该发布原创内容,可有几个网站能够每天都坚持更新原创内容呢?而网站外部链接也是如此,导师都是建议发布高质量的外部链接,可高质量的外部链接怎么可能那么容易就获得呢?那究竟"内容垃圾"."外部链接质量低"的网站能不能获得良好的排名