1、单元测试Software Testing主要内容主要内容 n单元测试概述n单元测试的环境n单元测试的内容n单元测试策略和方法n单元测试的评估Software Testing6.1单元测试概述单元测试概述n1.单元测试的概念单元测试的概念单元测试又称模块测试模块测试,是针对软件设计的最小单元,进行功能、性能、接口和设计等正确性检验的测试工作。单元测试的内容包括:单元的内部结构、单元的功能和可观测的行为。Software Testingn单元测试的对象结构化编程语言n单元测试对象是函数函数或者子过程子过程。面向对象语言n单元测试对象是类类或者类的方法类的方法。n如一个菜单、屏幕显示界面或对话框等S
2、oftware Testing2.单元测试的目的单元测试的目的n(1)单元测试能更准更全面地找到错误,显著提高软件质量;Software Testingn(2)单元测试能够大量削减开发时间和成本;u单元测试能尽早发现错误Software Testing3.单元测试过程单元测试过程n制定测试计划n单元测试设计n测试执行n测试评估回归测试回归测试制定测试计划制定测试计划 测试设计测试设计 测试开发测试开发 执行测试执行测试评估测试评估测试Software Testing4.单元测试的意义单元测试的意义n对软件的设计实现的意义保障软件质量;降低成本;更清晰的认识设计流程;架构反思;代码易于维护;改善
3、团队沟通;Software Testingn对软件开件开发者的意者的意义更清晰地认识设计规格说明书;提高代码静态分析技能;编码规范;学习机会;Software Testing单元测试的考虑单元测试的考虑Software Testing6.2 单元测试环境单元测试环境n基本单元本身不是一个独立的程序,自己不能运行,要靠其它部分来调用和驱动。Software Testingn驱动模块(Driver)被测基本单元的主程序,它接收测试数据,并把数据传送给被测单元,最后输出实测结果。n桩模块(Stub)用来代替被测基本单元调用的其他基本单元。单元测试环境单元测试环境Software Testing单元测
4、试环境单元测试环境测试结果驱动模块桩模块1被测模块测试用例测试用例桩模块3桩模块2Software Testing举例举例:B BA AC CD DE E待测试模块待测试模块如果没有如果没有A A模块和模块和E E模块,如何测试模块,如何测试B B模块?模块?Software Testing被测模块被测模块B B 驱动模块驱动模块(模拟模块模拟模块A)A)桩模块桩模块(模拟模块模拟模块E)E)测试用例测试用例测试结果测试结果举例举例:Software Testing讨论讨论n通常,在单元测试中需要必要的桩模块和驱动模块。桩模块和驱动模块的设计都需要一定的研发成本。驱动模块和桩模块,哪种驱动模块
5、和桩模块,哪种开发较为容易些?为什么?开发较为容易些?为什么?Software Testing例:计算下一天例:计算下一天n程序源码:NextDate.cpp;n桩模块;n驱动模块;Software Testing6.3 单元测试的内容单元测试的内容单元测试主要对模块的单元测试主要对模块的五个基本特性五个基本特性进行评价进行评价错误处理错误处理模块接口模块接口局部数局部数据结构据结构 重要的重要的执行路径执行路径边界条件边界条件模块模块Software Testing一、模块接口测试一、模块接口测试n对通过被测模块的数据流进行数据流进行测试,检查进出模块的数据是否正确。nChecklist:输
6、入的实际参数与形式参数是否一致。调用其他模块的实际参数与被调模块的形参是否一致。全程变量的定义在各模块是否一致。外部输入、输出。其它Software Testing一、模块接口测试(续)一、模块接口测试(续)n在做内外存交换内外存交换时要考虑:文件属性是否正确;OPEN与CLOSE语句是否正确;缓冲区容量与记录长度是否匹配;在进行读写操作之前是否打开了文件;在结束文件处理时是否关闭了文件;正文书写/输入错误;I/O错误是否检查并做了处理。Software Testing二、模块局部数据结构测试二、模块局部数据结构测试n检查局部数据结构能否保持完整性nChecklist:不正确或不一致的数据类型
7、说明;变量没有初始化;变量名拼写错或书写错;数组越界;非法指针;全局数据对模块的影响;其他 Software Testing三、模块边界条件测试三、模块边界条件测试n检查临界数据是否正确处理nChecklist:普通合法数据是否正确处理;普通非法数据是否正确处理;边界内最接近边界的(合法)数据是否正确处理;边界外最接近边界的(非法)数据是否正确处理;其他Software Testing四、模块独立执行路径测试四、模块独立执行路径测试n检查每一条独立执行路径,保证每条语句被至少执行一次。n查找由于计算错误、判定错误、控制流错误导致的程序错误。nChecklist:死代码;错误的计算优先级;混合类
8、型运算;精度错误(比较运算错误、赋值错误);表达式符号不正确;循环条件错误,死循环;Software Testing五、模块错误处理测试五、模块错误处理测试n检查预见、预设的各种出错处理是否正确有效;nChecklist:输出的出错信息难以理解。记录的错误与实际不相符。异常处理不当。未提供足够的定位出错的信息。其它Software Testing6.4 单元测试策略和方法单元测试策略和方法n静态代码分析n单元结构测试n单元功能测试Software Testing1.静态代码分析静态代码分析n代码走读(Code walkthrough)n代码审查(Code Inspection)n代码评审(Co
9、de Review)Software Testing(1)规范检查)规范检查package testSample;public class StyleSample int year,month,day;void setDate(int i,int j,int k)year=i;month=j;day=k;void printDate()System.out.println(year=+year+,month=+month+,day=+day);Software Testing(2)找出设计中的问题)找出设计中的问题n资源是否释放;n数据结构是否完整正确;n是否有死循环和死代码;n是否存在明显的
10、效率和性能问题;n类、方法(函数)的划分是否清晰、易理解;n代码本身是否健壮,是否有完善的异常处理和错误处理;Software Testing2.单元结构测试单元结构测试n单元结构测试关注的是代码内部的执行情况,关注代码执行的覆盖率。n单元结构测试方法主要采用白盒测试。Software Testing例:计算星期几例:计算星期几n已知1980-1-1是星期二,输入日期在1980-2008年份之间,计算输入日期计算该日期是星期几。n程序代码见教材122页。注意理解123页的switch语句。Software Testing程序控制流图程序控制流图(1)Software Testing程序控制流图
11、程序控制流图(2)Software Testing基路基路径径n圈复杂度V(G)=e n+2p;n图(b)基路径有3条:1.G_PATH1=GA-GB-GC-GE-GH-GA-GI;2.G_PATH2=GA-GB-GC-GE-GH-GA-GB-GD-GE-GH-GA-GI;3.G_PATH3=GA-GI;Software Testingn图(c)的基路径有13条:1.H_PATH1=HA-HA1-HD2.H_PATH2=HA-HA2-HA1-HD3.H_PATH3=HA-HA3-HA2-HA1-HD4.H_PATH4=HA-HA4-HA3-HA2-HA1-HD5.H_PATH5=HA-HA5-
12、HA4-HA3-HA2-HA1-HD6.H_PATH6=HA-HA6-HA5-HA4-HA3-HA2-HA1-HD7.H_PATH7=HA-HA7-HA6-HA5-HA4-HA3-HA2-HA1-HD8.H_PATH8=HA-HA8-HA7-HA6-HA5-HA4-HA3-HA2-HA1-HD9.H_PATH9=HA-HA9-HA8-HA7-HA6-HA5-HA4-HA3-HA2-HA1-HD10.H_PATH10=HA-HA10-HA9-HA8-HA7-HA6-HA5-HA4-HA3-HA2-HA1-HD11.H_PATH11=HA-HA11-HA10-HA9-HA8-HA7-HA6-HA5
13、-HA4-HA3-HA2-HA1-HD12.H_PATH12=HA-HA12-HA11-HA10-HA9-HA8-HA7-HA6-HA5-HA4-HA3-HA2-HA1-HD13.H_PATH13=HA-HDSoftware Testingn图(a)基路径有4条:1.A-B-D-M2.A-B-C-E-M3.A-B-C-F-G-H-I-K-L-J-M4.A-B-C-F-G-H-I-L-J-MSoftware TestingncalcWeek()的圈复杂度V(G)=e n+2p=48-32+2=18;即图(a)、(b)、(c)合并在一起的基路径数为18;Software Testing3.单元功能
14、测试单元功能测试n单元功能测试主要采用黑盒测试方法。n针对上例,可采用边界测试和等价类测试相结合的方法。n详细测试用例参见教材:127页页Software Testing6.5 单元测试的评估单元测试的评估n1.1.测试完备性评估测试完备性评估主要检查测试过程中是否已经执行了所有的测试用例,对新增加的测试用例是否已及时更新测试方案等。Software Testingn2.2.代码覆盖率评估代码覆盖率评估主要根据代码覆盖率工具提供的语句覆盖、判断覆盖等情况报告,检查是否达到方案中的要求。大多数情况下,要求语句覆盖达到100%。Software Testingn2.2.代码覆盖率评估(续)代码覆盖
15、率评估(续)但很多情况下,第一轮测试用例执行完后,很难达到的,这时在评估过程中要对覆盖率进行分析,主要从以下方面考虑:n不可能的路径或条件;n不可达的或冗余的代码;n不充分的测试用例。Software Testingn3.3.从覆盖的角度,测试还需覆盖从覆盖的角度,测试还需覆盖:功能覆盖;输入域覆盖输出域覆盖;函数交互覆盖;代码执行覆盖;Software Testing单元测试工具单元测试工具nCppUnit、Junit;nC+Test、J+Test;nVisual Unit;Software TestingJunit 使用使用nJunit简介nNextDate的单元测试Software Testing6.5 案例案例n折半起泡排序为例来进行单元测试 代码分析分析程序结构设计测试用例Software Testing 1.1.教材教材148148页:第页:第3 3题题 课后作业课后作业