基本信息
- 作者: (以)Roy Osherove
- 译者: 金迎
- 丛书名: 图灵程序设计丛书
- 出版社:人民邮电出版社
- ISBN:9787115360359
- 上架时间:2014-7-25
- 出版日期:2014 年8月
- 开本:16开
- 页码:228
- 版次:1-1
- 所属分类:计算机 > 软件工程及软件方法学 > 设计模式
计算机 > 软件与程序设计 > 综合
编辑推荐
基础概念+代码+具体分析,手把手教你学测试
解密神秘魔法:隔离框架
测试“不可测试”的代码
内容简介
计算机书籍
《单元测试的艺术(第2版)》是经典的单元测试学习指南,分四部分全面介绍了单元测试技术。第一部分阐述单元测试基本概念,包括如何使用测试框架。第二部分讨论破除依赖的高级技术:模拟对象、存根和隔离框架,包括重构代码以使用这些技术的模式。第三部分介绍测试代码的组织方式、运行测试和重构测试结构的模式,以及编写测试的最佳实践。第四部分介绍如何在组织内实施变革和修改现有代码。
《单元测试的艺术(第2版)》适合所有语言的测试和开发人员,特别是测试主管和项目经理。
所有程序员都知道应该做单元测试,但为什么你们没有做呢?是因为对单元测试不够了解,还是嫌单元测试麻烦,抑或认为单元测试的投入产出比太低?不管因为什么,你都应该看看这本书。
《单元测试的艺术(第2版)》在第1版基础上新增了很多内容,不过仍然会手把手地教你从第一个单元测试开始写起,通过简单的例子让你理解如何编写好维护、易明白和可靠的单元测试。在此基础上,本书自然过渡到一些较为高级的主题,比如模拟对象、存根和隔离框架(Moq、FakeItEasy和Typemock Isolator等),同时涉及测试模式,以及组织、重构代码的技巧,乃至怎么测试“不可测试”的代码。另外,其中还介绍了集成测试和关联数据库的测试技术。
《单元测试的艺术(第2版)》代码示例虽然是用C#写的,但有关单元测试的技术和思想适合所有使用静态类型语言(如VB.NET、Java、C++)的测试人员,以及测试驱动开发人员学习借鉴。
主要内容:
创建可读、可维护和可靠的测试
伪对象、存根、模拟对象和隔离(模拟)框架
简单的依赖注入技术
重构遗留代码
作译者
世界著名单元测试专家,常年为世界各地的开发团队提供咨询和培训服务,并在各种大会上发表演讲,内容包括单元测试及测试驱动开发的艺术、团队领导力和敏捷开发实践。其个人技术博客osherove.com平均月独立访问量约50 000,提供了各种技术视频及其他培训信息,另著有Notes to a Software Team Leader: Growing Self Organizing Teams。
金迎
1997年毕业于北京大学计算机系,从事软件开发工作数年;2004年毕业于中科院计算所计算机应用技术专业,之后进入软件测试行业,具有丰富的手工和自动化测试的项目经验。
目录
第一部分 入门
第1章 单元测试基础 2
1.1 逐步定义单元测试 2
1.1.1 编写优秀单元测试的重要性 4
1.1.2 我们都写过(某种)单元测试 4
1.2 优秀单元测试的特性 5
1.3 集成测试 5
1.4 什么是优秀的单元测试 9
1.5 一个简单的单元测试范例 9
1.6 测试驱动开发 12
1.7 成功进行TDD的三种核心技能 15
1.8 小结 15
第2章 第一个单元测试 17
2.1 单元测试框架 18
2.1.1 单元测试框架提供什么 18
2.1.2 xUnit框架 20
2.2 LogAn项目介绍 20
2.3 NUnit初步 20
2.3.1 安装NUnit 21
前言
项目前期的几个月非常好,所有的事情都很顺利,我们有测试可以证明代码工作正常。但是随着时间的推移,需求发生了变化。我们被迫修改代码以适应新的需求,但是这样一来,测试失败了,需要修复。产品代码还是可以正常工作的,但是我们编写的测试过于脆弱,代码中任何微小的改变都会导致测试失败,哪怕代码工作正常。修改类或方法中的代码成了一项令人生畏的任务,因为同时还需要修复所有相关的单元测试。
更糟糕的是,因为有些人离开了这个项目,没有人知道他们测试的是什么,也不知道如何维护他们的测试,这些测试就无法使用了。我们给单元测试方法起的名字不够清楚,还有的测试互相依赖。最后的结果是,项目才开始不到6个月,我们就扔掉了大部分的测试。
这个项目是个悲剧,我们让自己编写的测试造成的损失比带来的收益多。从长远来看,维护和理解这些测试花费的时间,超过了它们能为我们节省的时间,因此我们停止使用它们了。我此后又参加过别的项目,这些项目中的单元测试做得好一些,我们使用这些测试获得了很大的成功,节省了大量的调试和集成时间。从那第一个失败的项目之后,我一直在整理单元测试的最佳实践,并在之后的项目中应用。在每个工作过的项目中,我总能找到更多的最佳实践。
理解如何编写单元测试,以及如何使它们可维护、可读和可靠,是这本书的内容,不管你使用的是何种语言或集成开发环境(IDE)。这本书涵盖了编写单元测试的基本知识,然后讲解交互测试基础,介绍了在真实世界中编写、管理和维护单元测试的最佳实践。
序言
当Roy告诉我他在写一本关于单元测试的书时,我非常高兴。测试迷因(meme)在业界已经兴起多年,但是关于单元测试的资料却相对匮乏。我浏览自己的书架,看到了专门讲测试驱动开发的书,也看到了通用的测试理论书,但是迄今为止还没有一本单元测试的全面参考书——没有书介绍这个主题,并且引导读者从第一步开始直到接触被广泛接受的最佳实践。这个事实令人震惊。单元测试并不是什么新实践,我们怎么会落到现在这种地步呢?
说我们处在一个非常年轻的工业领域几乎是老生常谈了,但是确实是这样。数学家们在不到100年前给我们的工作奠定了基石,但是直到最近60年才有了足够快的硬件能够利用他们的认知。在计算机业,理论和实践间有着最初的差距,而我们才刚开始发现这种差距如何影响着我们的领域。
在早期,计算机时间非常昂贵。程序是分批运行的。程序员们有安排好的时间段,他们必须在卡纸上打洞编程,然后送到计算机房。如果程序不对,就浪费了分配给你的时间段。因此你用铅笔和纸对程序进行手工检查,用大脑检验所有的场景和所有的边界情况。我想那时候自动化单元测试几乎是无法想象的。机器本应用于解决应该解决的问题,为什么要用它来进行测试呢?资源的稀缺限制了我们的思维。
后来,机器速度变快了,我们开始醉心于交互式计算。我们可以随意输入和修改代码。桌面检查代码的做法慢慢消失了,我们不再遵循早年间的一些原则。我们知道编程很难,但是这对我们来说只是意味着要在计算机前花费更多的时间,修改代码行和符号,直到找到那个起作用的神奇咒语。
我们从计算能力的稀缺期直接进入了能力过剩时期,错失了中间地带,但是现在要再次获得它。我们开始重新审视计算机作为开发资源的价值,自动化单元测试则把对计算资源的珍惜和桌面检查的原则结合在了一起。我们可以用开发语言编写自动化测试检查工作——不仅一次,而是任意多次。我认为在软件开发中,几乎没有别的实践像自动化单元测试这么强大。
在2009年写下此文时,我高兴地看到Roy的书付印。这是一本实际指南,既帮助你入门,又是你在进行测试任务时的极佳参考。《单元测试的艺术》不是一本关于理想化场景的书,它讲解如何测试已经存在的代码,如何利用常用的框架,最重要的是,它还告诉你如何编写更容易测试的代码。
《单元测试的艺术》很重要,多年前就应该有这么一本书了,但我们那时还没有准备好。现在我们准备好了。请欣赏。
——Michael Feathers
第2版序
那应该是2009年,我当时正在奥斯陆举行的挪威开发者大会上发言。(啊,6月的奥斯陆!)会议地点是一个超大的运动场。会议组织人员把看台分了区,在各区前面搭台,然后用很厚的黑布围起来,形成8个不同的会话“房间”。记得我刚刚结束发言,好像是关于TDD还是SOLID的,要不就是天文学或者别的什么,突然从旁边的“房间”传来了沙哑响亮的歌声以及吉他演奏。
那个分隔“房间”的帘子让我正好可以从旁边偷看到隔壁搞出这些动静的家伙。那家伙就是Roy Osherove。
认识我的人都知道,像这种在软件技术发言中途放声高歌的事情,如果兴之所至我也是干得出来的。因此当我转头面对听众的时候,心里想的是:这个Roy跟我还真是志趣相投,我一定得多了解了解他。
我的确对他有了更多的了解。实际上,他对我的一本书《程序员的职业素养》(The Clean Coder)有很大的贡献,还和我一起教了3天的TDD课。我和Roy相处得非常愉快,并且希望还能有更多时间相处。
我相信你在读Roy的这本书时也会是愉快的,因为这本书非常特别。
你读过James Michener写的小说吗?我没读过,但是听说他的小说都以“原子”开篇。你拿在手里的这本书不是James Michener的小说,但也是以“原子”开篇的——单元测试的“原子”。
当你翻阅开头部分的时候,可不要被误导了,这本书可不仅仅介绍单元测试。这本书是从介绍单元测试开始的,如果你有这方面的经验,可以快速浏览开头几章。随着书中内容的展开,后面各章构建在前面内容基础之上,深度不断增加!的确,当我读到最后一章时(当时还不知道那是最后一章),心想下一章就该讨论世界和平了。我的意思是说,你都解决了在使用陈旧遗留系统的顽固组织中引入单元测试的难题,还有什么对付不了的呢?
这是一本技术书——非常技术,书里有很多代码。这是件好事。但是Roy并不局限于技术话题。他讲述职业生涯中的轶事,讨论设计内涵或集成定义的哲学思想,期间还时不时地抄出吉他放声高歌。他好像很乐意给我们讲述在那遥远的、黑暗的2006年发生的故事,那些他做过的很糟糕的事情。
对了,不要担心书里的代码都是C#的。谁又能分得出C#和Java呢,对吧?再说了,这些都无关紧要。他只是用C#作为一个载体表达他的意图,但是书里的道理同样适用于Java、C、Ruby、Python、PHP,或任何其他的编程语言(也许COBOL除外)。
媒体评论
——Robert C. Martin,世界级软件开发大师,设计模式和敏捷开发先驱,敏捷联盟首任主席,被后辈程序员尊称为“Bob大叔”
“它是这一领域的经典之作,是学习单元测试的必读之书!”
——Raphael Faria,LG公司
“本书集思想性与实用性于一体。”
——Pradeep Chellappan,微软公司
“每当团队成员问我如何正确编写单元测试,我都会这样回答:看这本书!”
——Alessandro Campeis,Vimar SpA
“学习单元测试的最佳图书,没有之一!”
——Kaleb Pederson,Next IT
“本书揭示了很多其他同类书没有讲到的重要主题。书中示例虽由C#写就,但其蕴含的优秀测试编写艺术适用于任何语言开发及测试。”
“这本书篇幅不长,简明易懂,我通过它一个周末就掌握了基本概念,而且学会了编写单元测试!”
——亚马逊读者评论
书摘
本章内容
定义一个单元测试
对比单元测试与集成测试
探索一个简单的单元测试示例
理解测试驱动的开发
凡事总有第一次:第一次编写程序,第一次项目失败,第一次通过努力获得成功。你不会忘记自己的第一次,我希望你也不忘记第一个测试。也许你已经写过一些测试,在你的记忆里那些测试也许是差劲的、笨拙的、缓慢的,或者无法维护的。(大部分人都是如此。)乐观一点的话,也许你有过很棒的单元测试经历,想看看这本书里有什么你可能错过的知识。
本章先分析“传统的”单元测试定义,并和集成测试的概念进行比较。很多人对这二者的区别并不清楚。接着我们会列举单元测试和集成测试相比的优缺点,给“优秀的”单元测试下个更好的定义。最后我们会了解一下测试驱动开发的概念,因为测试驱动开发经常会和单元测试联系在一起。在这一章中,我还会提到一些概念,这些概念会在本书其他的章节做更详尽的解释。
让我们以单元测试的定义作为开始吧。
1.1逐步定义单元测试
在软件开发领域,单元测试并不是一个新概念。从早期使用Smalltalk编程语言的20世纪70年代开始,单元测试就已经出现,并一次又一次被证明是开发人员提高代码质量,加深理解类或方法功能需求的最佳手段之一。
Kent Beck在Smalltalk中引入了单元测试的概念,这个概念又被带入许多其他编程语言,使单元测试成为软件编程中一项极为有用的实践。在深入讲解前,我需要更好地定义单元测试的概念。下面将给出维基百科中单元测试的传统定义。在本章中这个定义会慢慢演化,最后在1.4节给出最终的定义。
定义1.0一个单元测试是一段代码(通常是一个方法),这段代码调用另一段代
码,然后检验某些假设的正确性。如果这些假设是错误的,单元测试就失败了。一个单元可以是一个方法或函数。
你写代码测试的对象称为“被测试系统”(System Under Test,SUT)。
定义SUT代表System Under Test,有的人喜欢用CUT(Class Under Test或Code
Under Test)。在测试中,被测试的东西称为SUT。
我以前觉得(是的,觉得。本书中没有科学,只有艺术和感觉),单元测试的这个传统定义在技术上是正确的,但是在过去的几年中,我对于单元这个概念的想法改变了。我认为一个单元代表系统中的“功能单元”或者一个“用例”。
定义
从调用系统的一个公共方法到产生一个测试可见的最终结果,其间这个系统发生的行为总称为一个工作单元。我们通过系统的公共API和行为就可以观察到一个可见的最终结果,无需查看系统的内部状态。 一个最终结果可以是以下任何一种形式。