您好,欢迎访问三七文档
1第七章软件测试2主要内容单元测试环境单元测试的内容单元测试工具——JUnit使用Mock对象7.1单元测试技术7.2自动化测试技术7.3系统测试3测试V模型图4单元测试环境—构造最小运行调度系统,即驱动模块—模拟实现单元接口,即桩模块—模拟生成测试数据或状态5单元测试的内容6检查模块接口是否正确,checklist:输入的实际参数与形式参数是否一致。个数、属性、量纲调用其他模块的实际参数与被调模块的形参是否一致。个数、属性、量纲全程变量的定义在各模块是否一致。外部输入、输出文件、缓冲区、错误处理其它任务1:模块接口测试7检查局部数据结构完整性Checklist:不适合或不相容的类型说明。变量无初值。变量初始化或默认值有错。不正确的变量名或从来未被使用过。出现上溢或下溢和地址异常。其它任务2:模块局部数据结构测试8检查临界数据处理的正确性Checklist:普通合法数据的处理。普通非法数据的处理。边界值内合法边界数据的处理。边界值外非法边界数据的处理。其它任务3:模块边界条件测试9检查每一条独立执行路径的测试。保证每条语句被至少执行一次。Checklist:算符优先级。混合类型运算。精度不够。表达式符号。循环条件,死循环。其它任务4:模块独立执行通路测试10预见、预设的各种出错处理是否正确有效。Checklist:输出的出错信息难以理解。记录的错误与实际不相符。程序定义的出错处理前系统已介入。异常处理不当。未提供足够的定位出错的信息。其它任务5:模块的各条错误处理通路测试11JUnit简介一个自动测试的框架编写者:ErichGamma和KentBeck开放源代码支持语言:Smalltalk,Java,C++,Perl…支持IDE:JBuilder,VisualAge…网站:单元测试工具——JUnit12—JUnit框架JUnit的定位13—JUnit框架JUnit的体系结构14—JUnit框架如何使用JUnit15—JUnit框架JUnit使用四部曲重载-重载setUp(),tearDown()选择被测函数-编写test...()验证-使用Assert.assert...()测试套件-编写suite(),main()16运行测试17运行测试18图形运行界面19练习寻找数组中的最大数:publicclassLargest{publicstaticintlargest(int[]list){intindex,max=Integer.MAX_VALUE;for(index=0;indexlist.length-1;index++){if(list[index]max){max=list[index];}}returnmax;}}20练习排序测试:【9,7,8】→9【7,9,8】→9【7,8,9】→9重复值:【7,9,8,9】→9单值:【1】→1负值:【-9,-8,-7】→-7….空值21练习•执行测试并修正错误•理解单元测试•上机环境:Eclipse+JUnit22复习:单元测试环境BCDGEFTest驱动程序桩程序AAEF23BF桩程序E被测试的模块桩程序A驱动程序测试用例测试结果BCDGEFTestA驱动程序的作用—接受测试数据—获得测试结果—调用被测模块,并把相关的测试数据传送给被测模块24主要内容单元测试环境单元测试的内容单元测试工具——JUnit使用Mock对象7.1单元测试技术7.2自动化测试技术7.3系统测试25publicvoidsendCom(intcmdCode){if(isUT()){//执行单元测试的操作……}else{//产品的真实代码……}}传统的打桩方法使用Mock对象//产品的真实代码……BFEE运行桩程序被测试的模块桩程序26问题:Environmental《interface》+getTime()+playWavFile(Stringname)……SystemEnvironment+getTime()+playWavFile(Stringname)……Checker+voidreminder()……—Environmentalenv被测试类publiclonggetTime(){returnSystem.currentTimeMillis();}importjava.util.Calendar;publicclassChecker{publicChecker(EnvironmentalanEnv){env=anEnv;}publicvoidreminder(){Calendarcal=Calendar.getInstance();cal.setTimeInMillis(env.getTime());inthour=cal.get(Calendar.HOUR_OF_DAY);if(hour=17){env.playWavFile(“quit_whistle.wav”);}}//…privateEnvironmentalenv;}从环境中获得当前时间判断当前时间是否大于等于下午五点如果是,则播放一段音乐remdinder()的处理过程被测试类29问题:你会采用什么方法来对reminder()方法进行测试?—上午八点测试一次?下午五点测试一次?下午六点测试一次?—手动修改系统时间?—变量?30importjava.util.Calendar;publicclassChecker{publicChecker(EnvironmentalanEnv){env=anEnv;}publicvoidreminder(){Calendarcal=Calendar.getInstance();cal.setTimeInMillis(env.getTime());inthour=cal.get(Calendar.HOUR_OF_DAY);if(hour=17){env.playWavFile(“quit_whistle.wav”);}}//…privateEnvironmentalenv;}被测试类出现过SystemEnvironment?Environmental《interface》+getTime()+playWavFile(Stringname)……SystemEnvironment+getTime()+playWavFile(Stringname)……Checker+voidreminder()……—Environmentalenv被测试类publiclonggetTime(){returnSystem.currentTimeMillis();}真实产品运行环境Environmental《interface》+getTime()+playWavFile(Stringname)……SystemEnvironment+getTime()+playWavFile(Stringname)……Checker+voidreminder()……-Environmentalenv被测试类MockEnvironment+getTime()+playWavFile(Stringname)……Mock类TestChecker+voidtestReminder()……测试类测试环境真实产品运行环境33publicclassMockSystemEnvironmentimplementsEnvironmental{publiclonggetTime(){returncurrent_time;}publicvoidsetTime(longaTime){current_time=aTime;}privatelongcurrent_time;publicvoidplayWavFile(Stringfilename){playedWav=true;}publicbooleanwavWasPlayed(){returnplayedWav;}publicvoidresetWav(){playedWav=false;}privatebooleanplayedWav=false;}Mock类Environmental《interface》+getTime()+playWavFile(Stringname)……Checker+voidreminder()……-Environmentalenv被测试类MockEnvironment+getTime()+playWavFile(Stringname)……Mock类TestChecker+voidtestReminder()……测试类测试环境验证预期结果和实际结果publicclassTestCheckerextendsTestCase{publicvoidtestReminder(){MockSystemEnvironmentenv=newMockSystemEnvironment();Calendarcal=Calendar.getInstance();cal.set(Calendar.YEAR,2004);cal.set(Calendar.MONTH,10);cal.set(Calendar.DAY_OF_MONTH,1);cal.set(Calendar.HOUR_OF_DAY,16);cal.set(Calendar.MINUTE,55);longt1=cal.getTimeInMillis();env.setTime(t1);Checkerchecker=newChecker(env);checker.reminder();assertFalse(env.wavWasPlayed());t1+=(5*60*1000);env.setTime(t1);checker.reminder();assertTrue(env.wavWasPlayed());env.resetWav();t1+=2*60*60*1000;env.setTime(t1);checker.reminder();assertTrue(env.wavWasPlayed());}}新生成一个Mock对象设置Mock对象的时间为16:55生成一个Checker对象,设置环境对象为该Mock对象调用被测方法reminder()验证预期结果和实际结果设置Mock对象的时间为17:00调用被测方法reminder()验证预期结果和实际结果复位Mock对象中的playedWav为false设置Mock对象的时间为19:00调用被测方法reminder()测试用例1测试用例2测试用例3Environmental《interface》+getTime()+playWavFile(Stringname)……SystemEnvironment+getTime()+playWavFile(Stringname)……Checker+voidreminder()……-Environmentalenv被测试类MockEnvironment+getTime()+playWavFile(Stringname)……Mock类TestChecker+voidtestReminder()……测试类使用Mock对象的步骤—使用一个接口来描述一个对象—为产品代码实现这个接口—如以测试为目的,在Mock类中实现这个接口可测试性设计—接口依赖使用Mock对象ClassB《interface》B_Inf被测试类测试类ClassATestCaseMock类Mock_B测试类TestCase真实产品运行环境测试环境39难以琢磨的真实对象—真实对象具有不可确定的行为—真实对象很难被创建—真实对象的某些行为很难触发—真实对象令程序的运行速度很慢—真实对象有(或者是)用户界面—测试需要询问真实对象它是如何被调用的—真实对象实际上并不存在使用Mock对象40练习:实现MP3的MOCK对象importjava.util.ArrayLis
本文标题:第7章 软件测试
链接地址:https://www.777doc.com/doc-5912453 .html