《JUnit实战(第2版)》—第1章1.1节证实它能运行-阿里云开发者社区

开发者社区> 开发与运维> 正文

《JUnit实战(第2版)》—第1章1.1节证实它能运行

简介:

本节书摘来自异步社区《JUnit实战(第2版)》一书中的第1章1.1节证实它能运行,作者【美】Petar Tahchiev , Felipe Leme , Vincent Massol , Gary Gregory,更多章节内容可以访问云栖社区“异步社区”公众号查看。

第1部分 认识JUnit
JUnit实战(第2版)
欢迎阅读《JUnit实战(第2版)》!JUnit是一个由Kent Beck和Erich Gamma于1995年年底着手编写的框架。自此以后,JUnit框架日益普及,现在已经成为单元测试Java应用程序的事实上的标准。

本书是第2版。《JUnit实战》的第1版非常畅销,由Vincent Massol和Ted Husted于2003年编写,其内容是基于JUnit 3.x版本的。

我们涵盖了JUnit最新的版本4.6,讨论了许多第1版尚未介绍的功能。与此同时,我们关注其他一些有趣的测试代码的方法:mock objects、JUnit扩展、测试应用程序的不同层,等等。

这一部分从探索JUnit本身开始。在本书后面的章节中,我们将专注于另一些工具和方法。

第1章快速介绍了测试的概念。你需要从基础知识入手逐步深入。在本章的后半部分,我们会直接跳到代码内容,查看如何编写简单的测试、运行它并看到运行结果。

第2章介绍了JUnit最核心的内容。我们构建了一个稍大型的项目,并分析其代码。我们不仅解释了JUnit的概念、Widget和内部构成,也为你展示了编写测试用例的最佳做法,并利用构建的项目对它们进行了说明。

第3章重点介绍了测试。我们描述了各种各样的测试以及它们所适用的情况。我们还探讨了不同的平台(如开发、生产等),并展示了哪种测试和哪种情况能够在这些平台上最好地执行。

第1部分的最后一章致力于提升你的测试技巧。我们告诉你如何衡量测试覆盖面以及如何提高测试覆盖面。我们也解释了如何在编写测试之前生成可测试的代码,如何在动手编写代码之前编写测试。

第1章 Unit起步
JUnit实战(第2版)
Never in the field of software development was so much owed by so many to so few lines of code.

在软件开发领域中,从来没有这样的事情:少数几行代码对大量代码起着如此重要的作用。

——Martin Fowler

本章重点

探索JUnit
安装JUnit
编写第一个测试
运行测试
所有的代码都需要进行测试。

在开发期间,我们所做的第一件事是运行程序员自己的“验收测试”。我们编码、编译并运行。当我们运行时,我们就在进行测试。测试可能只是点击一个按钮,看它是否能弹出预期的菜单。然而,每天我们都要进行编码、编译、运行和测试。

当我们测试时,我们经常会发现各种问题——尤其是第一次运行时。于是,我们重新编码、编译、运行和测试。我们中的大多数人会迅速形成一种非正式的测试模式:添加一条记录、查看一条记录、编辑一条记录以及删除一条记录。手动运行诸如此类的小测试集是非常容易做到的,所以我们会不断重复这个操作。

有些程序员喜欢这类重复性的测试。在经历深入的思索和艰难的编码后,这类重复性的操作可以带来一段愉快的小憩。当我们小小的点击测试终于成功时,一股成就感便会油然升起:搞定了!我搞定了!

但有一些程序员却不喜欢重复性的工作。与其手动运行测试,他们宁愿创建一个小程序来自动运行测试。编写测试代码是一回事,而运行自动测试是另一回事。

如果你是一名编写测试代码的开发人员,那么这本书就是为你而准备的。我们将为你展示创建自动测试是多么简单、有效,甚至有趣。

如果你是一名深受测试影响的开发人员(test-infected1),那么这本书同样适合你。我们在第1部分介绍了基础知识,然后在第2、第3和第4部分继续探讨实际工作中的各种疑难杂症。

1test-infected是由Gamma和Beck创建的一个术语,参见《Test-Infected: Programmers Love Writing Tests》,Java Report, 3, 7, 37–50: 1998。

1.1 证实它能运行
JUnit实战(第2版)
一些开发人员认为自动测试是开发过程中非常重要的一部分。你无法证实一个组件能够运行,除非它通过了一系列全面的测试。有两名开发人员觉得这类单元测试如此重要,以至于值得为它编写一个框架。1997年,Erich Gamma和Kent Beck针对Java创建了一个简单但有效的单元测试框架,叫做JUnit。他们的工作遵循了SUnit的设计,而SUnit是Kent Beck早期为Smalltalk创建的一个框架。

NITION 框架*

个应用程序的半成品{![Ralph E. Johnson and Brian Foote, “Designing Reusable Classes,” Journal of Object-Oriented Programming __1.5 (June/July 1988): 22–35;框架提供了一个可复用的公共结构,可以在多个应用程序之间进行共享。开发人员将框架融入到他们自己的应用程序中,并且加以扩展以满足他们特定的需求。框架与工具包的不同之处在于,框架提供了一致的结构,而不只是一组简单的工具类。
如果你对这些名字似曾相识,那很正常。Erich Gamma就是为我们带来经典之作《模式设计》1的四大作者之一。同样,Kent Beck由于他在软件开发方面的开创性成就“极限编程”而广为人知。

JUnit是SourceForge网站上的一款开源软件,根据IBM通用公共许可证(Common Public License)1.0版本进行发布。通用公共许可证 对商业用户是友好的:人们可以随同商业产品分发JUnit,而没有很多繁琐的手续和限制。

JUnit迅速成为Java中开发单元测试的事实上的标准框架。被称为xUnit的相关测试框架,正在逐渐成为任何语言的标准框架。ASP、C++、C#、Eiffel、Delphi、Perl、PHP、Python、REBOL、Smalltalk和Visual Basic都有了对应的xUnit框架,这里只是列举了一些而已。

JUnit团队并没有发明软件测试,甚至也没有发明单元测试。起初,单元测试这个术语只是用来描述一项检查单个工作单元的行为的测试。

随着时间的推移,单元测试这一术语的运用领域扩展了。例如,IEEE已经将单元测试定义为“单个硬件、软件单元或一组相关单元的测试”2。

在本书中,单元测试只是指窄义上的一种测试:检查与其他单元隔离的单个单元。我们重点关注的是程序员应用在他们自己代码中的小型渐增测试。有时我们把这种测试称为Programmer Test,以区别于品质保证测试(QA)和客户测试。

以我们的角度来看,一个典型的单元测试通常可以描述为:“确保方法接受预期范围内的输入,并且为每一次测试输入返回预期的值”。

以上描述要求我们通过方法的接口来测试方法的行为。如果我们将x值传给方法,那么它会返回y值吗?如果我们改为将z值传给方法,那么它会正确地抛出异常吗?

DEFINITION

单元测试检查一个独立工作单元的行为。在Java应用程序中,独立工作单元经常是(但不总是)一个独立方法。相比之下,集成测试和验收测试检查的是各种组件如何交互。一个工作单元就是一项任务,不直接依赖于其他任何任务的完成。
单元测试通常关注的是一个方法是否遵循了它的API契约中的条款。就像人们在特定条件下同意交换某种商品或服务时所签署的书面合同,API契约是一份由方法签名而生成的正式协议,方法需要它的调用者提供特定的对象引用(Object Reference)或原始类型数值(Primitive Value),然后返回一个对象引用或原始类型数值。如果方法不能遵守契约,测试将抛出异常,于是我们就说方法已经破坏了它的契约。

在这一章里,我们从零开始介绍如何为一个简单的类创建单元测试。我们首先编写一个测试以及运行该测试的最小框架,以便你能够理解我们是如何处理的。然后我们再通过JUnit向你展示,正确的工具可以如何使生活变得更加简单。

DEFINITION

API契约是一种观点:把一个应用程序编程接口(API)当作是在调用者与被调用者之间的正式协议。通常,单元测试通过证明预期的行为来帮助定义API契约。API契约的概念源于因Eiffel编程语言而流行的“Design by Contract”的实践。
1Erich Gamma et al., Design Patterns(Reading, MA: Addison-Wesley, 1995).
2EEE Standard Computer Dictionary: A Compilation of IEEE Standard Computer Glossaries (New York, IEEE, 1990).
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章