本章包含:
- 定义进入和退出的点
- 定义一个工作单元和单元测试
- 比较单元测试和集成测试
- 探索一个简单的单元测试案例
- 理解TDD
- List item
1.1单测概念
本章首先分析单元测试的经典定义,并在概念上与集成测试比较。这种区别让人感到困惑,但它非常重要,因为我们在后面将要学到,在测试失败或通过时,将单元测试和其他类型的测试分离开,这对于树立信心是很重要的。我们还会讨论单元测试的优缺点,并对什么是好的单侧给出一个更好的定义。最后我们会看一下测试驱动开发TDD,因为它通常与单测联系在一起。
单测并不是软件开发中的新概念。早在十九世纪70年代,Smalltalk编程语言中就出现了单测,单测是提高开发质量的最好的方式。
Kent Beck在Smalltalk中引入了单测的概念,同时被引入到其他的很多编程语言中,使得单测变成了软件编程中非常有用的实践。
要了解我们不想使用什么作为单元测试的定义,我们先看看Wikipedia。
DEFINITION1.O(WIKIPEDIA)
单元测试通常是由软件开发人员编写和运行的自动化测试,以确保应用程序的一部分(称为单元)符合其设计,并且按照预期运行。在过程式编程中,一个单元可以是一个完整的模块,但是它通常是一个函数或过程。在面向对象的编程中,一个单元经常是一个完整的接口,比如一个类,也可以是一个单独的方法。
写代码的对象叫SUT
SUT代表被测试的主题、系统或套件,有些人喜欢叫CUT(被测试的组件、模块或类或者代码)。当你测试某样东西时,你把你正在测试的东西称为SUT。
先讨论下单元测试中的单元,单元代表系统中的一个工作单元或者一个用例。一个工作单元有对应的开始和结束。称它为entry points和exit points。一个简单的工作单元,就像我们马上将看到的那样,是一个函数,它将计算一些东西并返回一个值。但是这个函数可以引用其他的函数,其他的模型和其他的组件在计算过程中,即工作单元(从开始端点到结束端点)。现在的范围不仅仅是一个函数。
工作单元的定义:
一个工作单元是一系列行为的总和,即从entry point被调用到有一个明显的结果来结束通过一个或多个exit points这个过程中发生的所有行为。
给定一个公开可见的函数,例如:
函数体是一个工作单元,或一个工作单元的一部分。
函数的声明和签名是进入函数体的entry point。
函数的结果输出或行为就是它的exit point。
1.2 Entry Points & Exit Points
一个工作单元经常是有一个entry point 和 一个或多个的 exit points.
图1.1展示了一个关于工作单元的图
工作单元可以是单个函数,多个函数,多个函数甚至多个模块和多个组件。但是它总是有一个entry point,我们可以从外部触发(可以通过测试或者产品代码触发),它总是做一些有用的事情才结束。如果它不做任何有用的事情,我们会从代码库中删除它。
什么是有用的事情?返回一个值,或者改变状态,或者调用外部服务。这些明显的行为就是exit points。
为什么叫exit point而不是 behavior。行为可以是纯粹内在的,我们正在寻找来自调用者的外部可见的行为。这个区别在现实编码中很难区分。此外,exit point 有一个好的内涵,它表明我们正在离开工作单元的上下文,并回到测试上下文。行为可能更灵活一些。
下面的代码展示了一个简单的工作单元:
在这里插入代码片