前言
软件测试阶段,也称为软件测试级别。不同的软件开发测试模型,采用的软件测试阶段各有不同。比如,软件测试V模型的测试阶段分类包括:单元测试、集成测试、系统测试、验收测试。在单元测试这个阶段的测试基本上都是由开发人员执行的!被发现缺陷经常是马上就进行修改,也没有任何形式化的纪录。1 软件测试阶段之单元测试
软件测试阶段,也称为软件测试级别。不同的软件开发测试模型,采用的软件测试阶段各有不同。比如,软件测试V模型的测试阶段分类包括:单元测试、集成测试、系统测试、验收测试。
1.1 什么是单元
单元也称为组件。
(1)单元是软件里最小的、可以单独执行编码的单位,通常由一人完成编程。
(2)对于采用流程语言(如C、VisualBasic等)设计的软件,单元可以由一个或若干个最接近的函数(function)或过程(procedure)所组成。
(3)对于采用面向对象语言(如Java、C++等)设计的软件,单元可以是一个类或类的实例,或者由方法(method)来实现的功能。
(4)对于网页或用户窗口界面,单元可以是一个文字输入窗口或一个按钮等。
1.2 什么是单元测试
单元测试也称组件测试(Component Testing)。
(1)针对一个(单个的)软件单元的测试。
(2)在这个阶段的测试基本上都是由开发人员执行的!被发现缺陷经常是马上就进行修改,也没有任何形式化的纪录。
(3)相关术语:模块测试(module testing)、单元测试(unit testing)类测试(class testing)、程序测试(program testing)。
1.3 单元测试知识和技术
1.3.1 单元测试重点
测试重点:功能性测试、健壮性(逆向测试;无效值)、性能;
所需知识/Know-how:开发知识和技能(编写桩(stub)、测试驱动器(test driver)、模拟器(simulator),基本的测试技术;
前提条件:完成编译的测试对象、测试环境(驱动器、桩)、开发工具、测试对象的规范说明书;
1.3.2 单元测试技术
典型的单元测试技术:
白盒测试技术(语句,分支覆盖等);
黑盒测试技术(等价类划分,边界值分析;
1.3.3 单元测试缺陷
发现的缺陷:在组件内的功能性缺陷、运行时的缺陷、(本机)性能问题、健壮性问题;
可能遗留的缺陷:、接口问题、“大环境”中的问题、许多非功能性的缺陷;
1.4 单元测试需要编码
驱动器调用被测模块,被测模块调用桩模块。驱动模块用于模拟提供输入数据给被测模块的模块,桩模块用于模拟被测模块所依赖的其他模块。
1.4.1 驱动器(Driver)
驱动器是通过接口与测试对象通讯的辅助工具。驱动器用于调用被测模块,相当于被测模块的上级模块。
驱动程序负责生成测试数据,并将其传递给被测模块以进行测试。通常,这些数据是硬编码的或者根据测试需求生成的数据。
当被测模块需要接收来自其他模块的数据作为输入时,这些其他模块可能还没有实现或测试完成。在这种情况下,你可以创建一个驱动模块,来模拟产生这些输入数据的模块的行为。
1.4.2 桩模块(Stub)
桩用于替代或模拟被测模块所调用的模块,相当于被测模块的下级模块。
桩模块通常会返回硬编码的、预定义的数据,而不是执行复杂的逻辑。它们的目的是确保被测模块在依赖模块完成之前能够正常运行,并且正确处理依赖模块返回的数据。
当被测模块依赖于其他模块的输出时,这些其他模块可能尚未完成或测试。为了测试被测模块,你可以创建一个桩模块,它的作用是模拟这些未完成或未测试的依赖模块的行为。
1.4.3 模拟器(Simulation)
用一个系统来描述另一个要测试的抽象系统的行为特征。
1.4.4 驱动和桩例子
假设现在项目组把任务分给了7个人,每个人负责实现一个模块。你负责的是B模块,你很优秀,第一个完成了编码工作,现在需要开展单元测试工作,先分析结构图:
(1)由于B模块不是最顶层模块,所以它一定不包含main函数(A模块包含main函数),也就不能独立运行。
(2)B模块调用了D模块和E模块,而目前D模块和E模块都还没有开发好,那么想让B模块通过编译器的编译也是不可能的。
那么怎样才能测试B模块呢?需要做:
(1)写两个模块Sd和Se分别代替D模块和E模块(函数名、返回值、传递的参数相同),这样B模块就可以通过编译了。Sd模块和Se模块就是桩模块。
(2)写一个模块Da用来代替A模块,里面包含main函数,可以在main函数中调用B模块,让B模块运行起来。Da模块就是驱动模块。