单元测试编写规范文件修改控制目录第一章文档介绍 (4)目的 (4)阅读对象 (4)第二章概述 (4)2.1 定义 (4)2.2 目的 (4)2.3 步骤 (4)2.4 常见模块单元的错误 (5)第三章单元测试步骤 (6)3.1 设计单元测试方案 (6)3.1.1 输入、输出 (6)3.1.2 任务 (6)3.2 编写单元测试CASE (7)3.2.1 输入、输出 (7)3.2.2 任务 (7)3.3 执行单元测试 (9)3.3.1 输入、输出 (9)3.3.2 任务 (9)3.4 分析单元测试结果 (9)3.4.1 输入、输出 (9)3.4.2 任务 (10)第一章文档介绍目的本文档是关于进行单元测试(Unit Test)的规范性文档,本文档中描述了单元测试的原则、流程和方法,是软件开发人员在进行单元测试时的工作指南。
阅读对象本文档适合以下人员阅读●项目经理●软件开发工程师●软件测试工程师第二章概述2.1 定义单元测试是对软件基本组成单元进行的测试,所谓“单元”是指:●具有明确的功能●具有明确的规格定义(详细设计说明书)●有与其他部分明确的接口定义●能够与程序的其他部分清晰地进行区分2.2 目的单元测试用例的设计是要验证被测程序单元的如下这些方面:1)是否正确实现了规定的功能2)模块内部是否存在错误2.3 步骤单元测试的侧重点在于发现程序设计或者实现中的逻辑错误。
它分为计划、设计、实现、执行和评估五个步骤。
各步骤的定义如下:1)计划单元测试确定测试需求,制订测试策略,确定测试所用资源,创建测试任务的时间表。
2)设计单元测试设计单元测试模型,制订测试方案,确认测试过程3)实现单元测试根据单元测试计划和方案,制订具体的测试用例,创建可重用的测试脚本。
4)执行单元测试根据单元测试的方案、用例对软件单元进行测试,验证测试结果并记录测试过程中出现的缺陷。
5)评估单元测试对单元测试的结果进行评估,主要从需求覆盖和代码覆盖的角度进行测试完备性的评估。
2.4 常见模块单元的错误模块内部错误往往存在于下列方面:1)模块接口:测试模块的数据流a)调用所测模块时输入参数与模块的形式参数在个数、属性、顺序上是否匹配b)所测模块在调用其他模块时,它输入给其他模块的参数在个数、属性、顺序上是否匹配c)是否修改了只做输入用的形式参数d)输出给标准函数的参数在在个数、属性、顺序上是否匹配e)全局变量的定义在各模块中是否一致f)限制是否通过形式参数来传递2)局部数据结构:a)不正确的或者不一致的数据类型说明b)使用未赋值或者未初始化的变量c)错误的初始值或者错误的默认值d)变量名拼写错误e)不一致的数据类型3)路径错误:不正确的计算、比较和控制流4)错误处理a)出错的描述难以理解b)出错的描述不足以对错误定位和确定出错原因c)显示的错误与实际错误不符d)对错误条件的处理不正确e)在对错误进行处理之前,错误条件已经引起了系统的干预5)边界a)在循环的第0次,第一次和最后一次是否有错误b)运算或者判断中最大最小值是否有错误c)数据流、控制流中刚好大于、小于或等于最大或最小值时是否有错误第三章单元测试步骤3.1 设计单元测试方案3.1.1 输入、输出3.1.2 任务1.设计单元测试的模型,一般如下图所示构造单元测试模型需要:●定义(设计)驱动模块,用以调用被测程序单元●定义(设计)测试桩模块,用以模拟被测程序单元调用的函数接口●设计测试数据和状态,准备单元测试的动态结构●确定测试的流程另外,测试模型也可能是由所采用的测试工具所决定的。
2.指定测试项目指定对不同特性(或者特性组合)进行充分测试的途径,包括测试工具、方法和技术的描述以及对测试结果进行提取和分析的方法。
3.定义测试完备性标准(例如代码覆盖、路径覆盖或者条件覆盖),并规定判定测试完备性的手段,例如利用工具或者设计测试代码等。
3.2 编写单元测试CASE3.2.1 输入、输出3.2.2 任务1.根据《XXX单元测试方案》构造测试环境(将待测程序单元纳入测试工具,实现驱动模块和桩模块),编写测试代码(自己开发或使用测试工具)。
需要的时候生成或者导入测试所需要的数据。
2.设计单元测试用例设计测试用例的时候要根据《XXX单元测试方案》中所规定的测试方法、测试项目和完备性标准进行。
单元测试用例的设计,主要有以下五个步骤:1)为系统运行起来设计测试用例首先需要设计这样的测试用例,该用例的执行可以证明测试环境和被测单元是可用的。
如果连这样的测试用例都失败了,那么其他的测试用例都失去了执行的基础2)为正向测试而设计测试用例其次需要设计正向测试用例。
这些用例也是基本的单元测试用例,它们是用来证明设计规格说明书中对应的功能和性能指标是否能够实现。
这些测试用例是按照设计说明书中的描述来开发的。
3)为逆向测试而设计测试用例逆向测试的测试用例是用来证明软件没有做不应该做的事情。
这个步骤可以基于错误猜测的基础进行测试用例的构造。
4)为特殊要求设计测试用例从系统的性能、安全性、保密性的角度为具有这些要求的系统制订的测试用例。
5)为覆盖率设计测试用例测试用例的设计要保证一定的覆盖率要求,所以在最后一步还需要补充一些测试用例,以保证测试用例对代码、路径、或者条件的覆盖率。
在单元测试的设计中,针对测试项目和测试覆盖率的要求经常采用如下的一些方法:A)规格导出法规格导出法是根据相关的规格说明来设计测试用例,每一个测试用例用来检验一个或多个规格陈述的语句。
一个比较实际的办法是按照规格陈述的语句顺序来为被测单元设计测试用例。
这种测试用例的设计可以保证在规格说明中所有的要求在测试案例中都能得到体现,但是它只是一种正向测试的思路,需要其他的测试用例的补充才能达成测试的完整性。
B)等价类划分法等价类划分是一种正式的测试用例设计方法,它基于被测单元的输入、输出所做的划分,对每一个划分中的所有输入、被测单元都有相同(等价)的反应。
例如对一个范围是0-100的整数输入来说,2,38,66应该都具有相同的效力,而-1,120也有相同的效力。
等价类划分法就是针对每一个等价类设计至少一个测试用例来确保被测程序单元的处理是完整的。
等价类划分的设计方法也属于正向测试的技术。
C)边界值分析法边界值分析法使用与等价类划分法相同的划分,只是边界值分析假定错误更多地存在于两个划分的边界上,相应地为边界上及两侧的情况设计测试用例。
D)状态转移测试法对于那些以状态机作为模型或者设计为状态机的软件,状态转移测试是合适的。
状态转移测试法的测试用例涵盖能导致状态迁移的事件来测试状态之间的转换是否正确。
用这种方法可以测试逆向的测试用例,如状态和事件的非法组合。
E)分支测试法在分支测试中,根据单元中控制流分支或者判断点来设计测试用例。
这通常用于达到一定的测试覆盖率。
在单元测试中,如果使用黑盒测试技术,那么需要去猜测存在哪些逻辑分支并相应为这些分支的执行准备测试用例,如果使用白盒测试技术,那么则需要根据该程序单元中的控制流设计测试用例,完成分支覆盖的要求。
F)条件测试法条件测试法中包含了很多测试用例设计技术,它们都致力于弥补在遇到复杂逻辑条件的时候分支测试的弱点。
条件测试的目标是测试在每个逻辑条件的单个成份及它们组合的情况下程序都是正确的。
在考虑各个逻辑条件的组合的时候,决策表是一种有用的工具。
在条件测试法中,需要设计足够的测试用例,确保每种逻辑条件的组合都被测试到。
G)数据定义-使用测试法数据定义是指数据被赋值的地方,数据使用是指数据项被读取或者使用的地方。
使用这种方法设计测试用例时,主要考虑用用例来驱动数据被定义到被使用的路径。
这种方法主要用于检查数据的初始化和处理的正确性,也可以在静态检查中使用。
H)内部边界值测试法这种方法与边界值分析法类似,但是它偏重的是白盒测试技术,也就是说从程序单元的规格说明中导出等价类和边界值。
除了外部可见的数据之外,程序的内部的数据也存在等价类和边界值,它们只能通过对程序单元的设计规格说明进行分析而得到。
内部边界值测试法一般只作为测试用例设计的补充方法,与其他方法结合使用。
I)错误猜测法错误猜测是基于经验和其他一些测试技术的。
在经验的基础上,测试设计者猜测错误的类型及在特定的软件中错误发生的位置,并设计测试用例去发现它们。
例如,如果所有的资源需要动态申请,那么我们就需要判断是否所有的资源都被正确释放了。
一个发现错误的好地方就是资源释放的地方。
对一个有经验的工程师,错误猜测法可能是最好的设计测试用例的方法,因为它可能发现别的设计方法所遗漏的错误。
为了最大限度的利用有效的经验并逐步丰富测试用例的设计技术,建立一个错误类型的列表是一个好方法,这个列表可以帮助工程师猜测程序单元中的错误会在哪里。
这个列表需要通过在实践中不断的维护和扩充来帮助达成错误猜测的有效性。
3.将设计好的测试用例用工具或者文档记录下来。
在需要的时候,标注某个测试用例是为了哪个测试项目而设计的。
一般来说,测试用例都需要注明:测试条件、测试输入、测试操作和预期输出这四大要素。
4.将设计好的测试用例编写为测试脚本(test script)或测试程序,如果设计自动化测试,驱动模块从测试脚本中逐条读取测试用例并且通过程序或者测试人员的目测判断程序单元的行为或者输出是否符合预期。
一般来说,测试工具或者驱动模块也需要将每一条测试用例执行的结果进行记录,以供分析之用。
3.3 执行单元测试3.3.1 输入、输出3.3.2 任务1.执行单元测试用例对单元测试用例的执行一般意味着由驱动模块读取测试脚本,然后通过程序判断或者测试人员目测判断的方式确认测试用例是否执行通过。
d)首先应该确保测试环境和测试程序能正常执行,如果不能正常执行则需要进行相应修改直至正常。
e)在遇到测试用例执行失败而无法执行之后的单元测试用例时,需要调整被测程序单元直到该用例能够正常执行。
修改之后需要重新执行之前的测试用例(回归测试)。
使用测试工具或者编写自动化的测试驱动模块可以使这项工作相对容易些。
2.对测试用例的执行结果进行记录,如果使用工具或者编写了自动化的测试驱动模块,这一步工作可以自动化。
3.根据测试结果修改源代码,重新构造测试环境,需要的时候修改测试用例。
3.4 分析单元测试结果3.4.1 输入、输出3.4.2 任务1.分析测试的完备性,判断是否执行了事先设计的所有测试用例以及在测试过程中新增加的测试用例。
2.使用工具或者其他自定义的方法判断单元测试的覆盖率是否符合事先定义的覆盖率。
3.如果未能达成覆盖率,则补充测试用例,重新执行测试。