




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
练习题一软件质量就是软件产品的质量。该说法正确的是(A)A.狭义质量观B.广义质量观C.错误的D.无法判断严重程度高的缺陷被修复的优先级别一定高。该说法正确吗?为什么?答案:不正确。软件系统往往是为特定的业务服务的,某些业务功能对企业的核心业务至关重要。如果一个不太严重的缺陷影响了核心业务功能,而一个严重的缺陷影响的是非核心业务功能,那么修复影响核心业务功能的缺陷的优先级可能会更高。修复缺陷的优先级是综合考虑缺陷的严重程度、可规避性、出现频率、修复成本和风险以及业务优先级等多种因素的结果。请举例说明缺陷(Fault)、错误(Error)、失效(Failure)的区别。答案:缺陷(Fault)指软件中的静态错误,是产生不正确结果的人为动作;错误(Error)指工作产品中出现的瑕疵或缺点,导致软件产品无法满足用户需求或者规格说明,需要修复或替换,它是内部的错误状态;失效(Failure)指软件运行时,缺陷被激活导致的不正确现象或者错误显示,是外部的不正确行为。如下面的代码:publicstaticintnumZero(int[]arr){//Effects:IfarrisnullthrowNullPointerException//elsereturnthenumberofoccurrencesof0inarrintcount=0;for(inti=1;i<arr.length;i++){if(arr[i]==0){count++;}}returncount;}缺陷(Fault):循环变量inti=1,应为i=0,此处为程序员输入错误;错误(Error):输入测试用例[2,7,0]时,期望输出为1,实际输出为1。在首次循环迭代时,i应该为0,程序里为1,内部状态错误,但不影响输出结果;失效(Failure):输入测试用例[0,2,7]时,期望输出为1,实际输出为0。在首次循环迭代时,i应该为0,程序里为1,内部状态错误,传递出来影响到输出结果。软件测试是软件质量保证的唯一手段吗?为什么?答案:软件测试是软件质量保证的主要手段,是质量控制的方法。软件质量保证是一个全面的、贯穿整个软件生命周期的过程,包括从需求分析、设计、编码到测试、维护等各个阶段的质量控制和管理。验证(Verification)与确认(Validation)有什么区别?答案:验证是评价系统或组件,以确定给定阶段的产品是否满足该阶段开始时确定的条件的过程。确认是在开发过程之中或结束时评价系统或组件,以确定其是否满足所描述需求的过程。验证活动关注“我们是否恰当地构建产品”,确认活动关注“我们是否构建恰当的产品”。验证和确认是相辅相成的。验证确保软件按照设计实现,确认确保软件满足用户需求。只有两者都通过,才能确保软件的质量。通常先进行验证,再进行确认。验证是确认的基础,只有验证通过的软件才有资格进入确认阶段。为什么需要软件测试用例?答案:实现测试目标,完成测试,需要设计测试用例来实现。测试用例根据软件需求规格设计,涵盖需求功能、性能等要求。测试用例是测试执行的基础。测试不可能进行穷举测试,测试用例为某个特定的测试目标而设计,它是测试操作过程序列、条件、预期结果及相关数据的一个特定的集合。设计好的测试用例能以最小的财力、物力、时间解决问题。软件测试和软件质量保证有哪些区别与联系?答案:二者相同点:都是贯穿整个软件开发生命周期的;二者不同点:软件质量保证侧重对流程中各过程的管理与控制,是一项管理工作,侧重于流程和方法。而测试是对流程中各过程管理与控制策略的具体执行与实施,其对象是软件产品(包括阶段性的产品),即测试是对软件产品的检验,是一项技术性的工作。测试,常常被认为是质量控制的最主要手段。软件的质量与哪些因素有关?答案:第一个因素是能满足用户需要;第二能合理处理进度、成本、功能的关系;第三具备一定的可扩展性和灵活性,能够适应一定程度的需求变化;第四具备一定的可靠性,能够有效处理例外的情况,能够承受各种非法情况的冲击;最后的因素是保持成本和性能的平衡。请辨析软件的质量是“设计出来的”还是“测试出来的”观点。答案:软件的质量既是设计出来的也是测试出来的,不论是设计还是测试都不可能做到不出现问题,不论是设计还是测试都旨在引导和满足客户的需求,通过良好的设计或者整个开发过程的测试得到高质量的软件,将质量达到客户、开发人员、开发企业的一个平衡点。如何规范地描述一个缺陷?答案:规范地描述一个缺陷是软件测试和质量保证中的关键环节。通常包括以下描述项:缺陷编号、标题、描述、环境、重现步骤、预期结果、实际结果、严重程度、优先级、截图与附件等。在测试管理中,应该收集哪些测试过程数据,并如何对这些过程数据进行分析?答案:在测试管理中,收集和分析测试过程数据是确保测试活动有效性和效率的关键环节。主要有测试计划文档、测试计划变更记录;测试用例总数、用例状态、用例覆盖率、用例优先级;缺陷总数、缺陷状态、缺陷严重程度、缺陷优先级、缺陷修复情况;测试执行进度、时间、频率;测试人员、工具、环境情况;以及测试报告、会议记录、用户反馈等。通过收集这些数据,利用缺陷趋势分析、分布分析、来源分析等方法、测试用例覆盖率分析、有效性分析、执行效率分析、资源利用分析等方法,可以监控测试进度、评估测试质量、优化测试策略,并为项目决策提供支持。练习题二软件测试的对象包括(B)A)目标程序和相关文档B)源程序、目标程序、数据及相关文档C)目标程序、操作系统和平台软件D)源程序和目标程序下列说法正确的是(D)。A)测试要执行所有可能的输入;B)有时间就多测试一些,来不及就少测试一些;C)软件测试是测试人员的事,与开发人员无关;D)好的测试不一定要使用很多的测试工具。简述测试过程和开发过程的关系。答案:测试过程和软件开发过程都应贯穿软件过程的整个生命周期,它们是相辅相成和相互依赖的。测试过程和开发过程是同步的,即在做系统分析、产品功能设计的同时,测试工程师就可以阅读、评审需求规格说明书,从而确定测试目标,开始测试工作。测试过程是对软件开发过程中阶段性成果和最终产品进行验证和确认的过程,二者相互依赖。在开发前期,测试过程更多依赖于开发过程;在开发后期,开发过程更多依赖于测试过程。二者目标相同,都是开发客户满意的高质量产品。对比不同测试模型的优缺点。答案:V模型:优点:强调了在整个软件项目开发中需要经历的若干个测试级别,并与每一个开发级别对应。缺点:忽略了测试的对象不应该仅仅包括程序,没有明确指出对需求、设计的测试。W模型:优点:补充了V模型中忽略的内容,强调了测试计划等工作的先行和对系统需求和系系统设计的测试。缺点:与V模型相同,没有对软件测试的流程进行说明。X模型:优点:定位了探索性测试,这是不进行事先计划的探索性的特殊类型的测试,这一方式往往能帮助有经验的测试人员在测试计划之外发现更多的软件错误。缺点:X模型从没有被文档化,没有明确的需求角色确认。H模型:优点:强调了测试是独立的,只要测试准备完成,就可以执行测试,可以与其他流程并发执行;软件测试活动可以尽早准备、执行,具有很强的灵活性。缺点:管理要求高,需要清晰地定义规则和管理制度;技能要求高,需要精准地定义每个迭代的规模;测试就绪点分析困难。在进行软件测试中,如何确定合理的测试模型和测试过程?答案:测试人员要明确软件项目的测试目的、所采用的开发过程模型和组织条件等,据此选择合适的测试模型,尽可能应用模型中对项目有实用价值的方面。在软件测试过程中,没有最好的过程可以遵循,可以根据项目的类型,开发模型,企业的管理、员工的层次等方面来综合考虑。6、从测试模型演化过程可以看到,软件测试的地位发生了怎样的变化?为什么?答案:从瀑布模型到敏捷开发,软件测试的地位经历了从边缘到核心、从被动到主动、从单一到综合的显著变化,我们可以发现软件测试在不断左移,意味着人们越来越重视软件质量,测试成为软件质量的关键环节;由于软件复杂性的增加、市场需求的变化、技术的进步、敏捷开发的普及以及安全需求的增加,现代软件测试不仅是发现缺陷,更是预防缺陷、优化流程、提升用户体验的重要手段,尽早测试,修复缺陷的代价就会降低。7、请阐述在智能时代软件测试人员应具备哪些品质和能力?答案:一名优秀的软件测试工程师应具备计算机专业技能包括测试专业技能、软件编程技能、掌握网络、操作系统、数据库、中间件等计算机基础知识;行业领域知识;个人素养要优秀包括对测试的兴趣、好奇心、做事专心细心耐心有责任心和自信心。智能时代,软件测试人员不仅需要掌握技术硬实力,如测试分析、测试设计、测试部署与执行、测试总结,以及专项能力,如自动化测试、AI应用、性能测试等,还需要具备良好的软技能,如团队合作、沟通能力、持续学习、适应新技术、关注行业动态等。练习题三如何结合使用等价类测试技术和边界值分析技术设计测试用例?答案:进行黑盒测试时需要根据被测试对象选择合适的测试方法。在任何情况下都必须使用边界值分析方法。经验表明用这种方法设计出测试用例发现程序错误的能力最强。必要时用等价类划分方法补充一些测试用例。有一个小程序,能够求出三个0~9999间整数中的最大值,请分别用边界值分析和健壮性测试方法设计测试用例。答案:输入值a、b、c的极值分析min-minmin+nommax-maxmax+-1062~99979998999910000边界值分析测试用例、健壮性分析测试用例序号abc预期结果测试结果备注16707c取极值26717367999899984679999999956788abc为nom66077b取极值761778699987999896999979999b取极值100677a取极值111677129998679998139999679999146710000输入无效考虑c值健壮性1567-1166-17考虑b值健壮167考虑a值健壮性191000067注:序号1-13为边界值分析测试用例;序号1-19为健壮性分析测试用例。为什么要进行等价类的划分?等价类划分应遵循哪些原则?答案:使用等价类划分可以在测试资源有限的情况下,用少量有代表性的数据得到比较好的测试结果。基本原则如下:等价类测试的弱形式不如对应的强形式的测试全面。如果实现语言是强类型,则没有必要使用健壮形式的测试。如果错误条件非常,则进行健壮形式的测试是合适的如果输入数据以离散值区间和集合定义,则等价类测试是合适的。当然也适用于如果变量值越界系统就会出现故障的系统。通过结合边界值测试,等价类测试可得到加强。如果程序函数很复杂,则等价类测试是被指示的。在这种情况下,函数的复杂性可以帮助标识有用的等价类。强等价类测试假设变量是独立的,相应的测试用例相乘会引起冗余问题。如果存在依赖关系,则常常会生成错误测试用例。在发现合适的等价关系之前,可能需要进行多次尝试。针对以下问题:某一8位计算机,其十六进制常数的定义是以0x或0X开头的十六进制整数,其取值范围为-7f~7f(不区分大小写字母),如0x11,0x2A,-0x3c。请采用等价类划分的方法设计测试用例。答案:(1)划分等价类输入条件等价类有效等价类编号无效等价类编号长度3-5位0小于3位8大于5位9符号无1长度大于1的字符串10+或—2非+和—的一个其它字符11前缀0X3一个数字或字符120x4长度大于2的数字字符串13长度为2的非0x和0X字符串14第一位数值0到7之间的数5非数字符号15大于7的整数16第二位数值数6非数字非字母的符号17a到f的字母或A到F的字母7其它字母18(2)根据上述等价类设计测试用例测试用例编号输入数据预期结果覆盖等价类符号前缀第一位数值第二位数值10x拒绝820x4455拒绝930x75接收1、3、5、64-0X0A接收2、4、5、75Ab0x05拒绝106*0X0a拒绝117+A0B拒绝12801X57拒绝139+Ab63拒绝1410-0xaB拒绝1511-0X89拒绝1612+0x7*拒绝1713oX5Z拒绝18假定一台ATM机允许提取增量为50元,总金额从100~2000(包含2000)不等的现金,请结合等价类方法和边界值分析进行测试。答案:边界值分析法:测试用例输入金额预期输出150超出[100,2000]2150正常取出31000正常取出41950正常取出52050超出[100,2000]等价分析法:有效等价类编号无效等价类编号整数1浮点数4在100到2000之间2小于1005大于20006在100到2000之间,能被50整除3在100到2000之间,不能被50整除7用例编号输入数据预期结果覆盖的等价类1100提取成功1、2、32100.5提示:输入无效2,4350提示:输入无效542050提示:输入无效2,65101提示:输入无效2,7有一个学生成绩管理系统,要求把成绩好的同学放到前面,其中每个人都有三门课程成绩:语文、数学、英语。首先是按个人的总成绩进行排名,如果某两个人的总分相同,则按他们的语文成绩进行排名;如果总成绩和语文成绩都相同,则按照他们的数学成绩进行排名,请用等价类方法进行测试。(1)划分等价类等价类输入条件有效等价类编号无效等价类编号三个0-100的数0-100的数1小于07大于1008三个数2未输入成绩9只输入一个数10只输入两个数11输入非数字12排名总成绩不同3总成绩相同,语文不同4总成绩和语文均相同,数学不同5总成绩和各科成绩均相同6程序有三个输入变量mouth、day、year(均为整数,且满足:1<=mouthc=12,1<=day<=31,1900<=year<=2050),分别作为输入日期的月份、日、年份,通过程序可以输出日期在日历上隔一天(第三天〉的日期。例如,输入为2005年11月29日,则该程序的输出为2005年12月1日。请用等价类测试和边界测试方法设计测试用例。答案:边界值测试:测试用例输入数据预期输出monthdayyear16151899year超出[1900,2050]261519001900.6.18361519011901.6.18461519751975.6.18561520492049.6.18661520502050.6.1876152051year超出[1900,2050]86-11975day超出[1,31]96119751975.6.4106219751975.6.51162719751975.6.301262819751975.7.11362919751975.7.21463019751975.7.3156311975输入日期超界1643119751975.5.31722920002000.3.3182292001输入日期超界19-1152000month超出[1,12]2011520002000.1.182121520002000.2.1822111520002000.11.1823121520002000.12.182413152000month超出[1,12]等价类测试:等价类有效等价类编号无效等价类编号month整数1浮点数101<=month<=122month<111month>1212day整数3浮点数13month=[1、3、5、7、8、10、12]时1<=day<=314day<114day>3115month=[4、6、9、11]时1<=day<=305month为4、6、9、11时day>3016month=2且leapyear1<=day<=296month为2且year为闰年时,day>2917month=2且不为leapyear1<=day<=287month为2且year不是闰年时,day>2818year整数8浮点数191990<=year<=20509year<199020year>205021测试用例编号输入数据预期结果覆盖等价类monthdayyear11119901990.1.31、2、3、4、8、92113019911991.12.21、2、3、5、8、9322919961996.3.21、2、3、6、8、9422820502050.3.21、2、3、7、8、951.521995拒绝106051996拒绝11732301997拒绝12831.31905拒绝139501906拒绝16122302004拒5拒绝19157211989拒绝20168222051拒绝21某软件的一个模块的需求规格说明书中描述:(1)年薪制员工:严重过失,扣年终风险金的4%;过失,扣年终风险金的2%。(2)非年薪制员工:严重过失,扣当月薪资的8%;过失,扣当月薪资的4%。请绘制出判定表,并设计相应的测试用例。请绘制出判定表,并设计相应的测试用例。答案:(1)绘制判定表1234567条件年薪制员工YYYNNN—严重过失YYNYYNN过失YNYYNYN动作扣年终风险金的4%√√扣年终风险金的2%√√扣当月薪资的8%√√扣当月薪资的4%√√不扣√(2)设计测试用例测试用例编号输入数据预期结果覆盖的规则1年薪制员工严重过失扣年终风险金的4%12年薪制员工过失扣年终风险金的2%23非年薪制员工严重过失扣当月薪资的8%34非年薪制员工过失扣当月薪资的4%45年薪制员工无过失不扣5某公司折扣政策:年交易额在10万元以下的,无折扣;在10万元以上的并且近三个月无欠款的,折扣率10%;在10万元以上,虽然近三个月有欠款,但是与公司交易在10年以上的,折扣率8%;在10万元以上,近三个月有欠款,且交易在10年以下的折扣率5%;请用判定表来描述该公司的折扣政策。答案:12345条件年交易<=10万元YNNNN近三月无存款-YYNN与公司交易>=10年-YNYN动作无折扣√折扣率5%√折扣率8%√折扣率10%√√请讨论判定表测试能够在多大程度上处理多缺陷假设。答案:判断表在表达是可以处理多缺陷假设的,在判断表的表示上,条件桩罗列了多个条件,可以通过条件组合,生成多个规则来解决输入条件的多缺陷问题。请使用因果图法为三角形问题设计测试用例。答案:因:正整数3个数a+b>ca+c>bb+c>aa=b!=ca=c!=bb=c!=aa=b=ca!=b!=c果:不能构成三角形等腰三角形等边三角形一般三角形因果图如下:测试用例(略)分析中国象棋中走马的实际情况(下面未注明的均指的是对马的说明)答案:(1)如果落点在棋盘外,则不移动棋子;(2)如果落点与起点不构成日字型,则不移动棋子;(3)如果落点处有自己方棋子,则不移动棋子;(4)如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子;(5)如果不属于1-4条,且落点处无棋子,则移动棋子;(6)如果不属于1-4条,且落点处为对方棋子(非老将),则移动棋子并除去对方棋子;(7)如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。(1)原因:1.落点在棋盘上;2.落点与起点构成日字;3.落点处不为自己方棋子;4.落点方向的邻近交叉点有棋子;5.落点处无棋子;6.落点处为对方棋子(非老将);7.落点处为对方老将。(2)结果:21.不移动棋子;22.移动棋子;23.移动棋子,并除去对方棋子;24.移动棋子,并提示战胜对方,结束游戏。添加中间结点11(3)绘制因果图,如图所示。1111123457621232224OE假设商店货品价格(R)都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。假定此商店的货币面值只包括:50元(N50)、10元(N10)、5元(N5)、1元(N1)四种。答案:边界值分析法:测试用例输入金额预期输出1R=101R超出[1,100]2R=99能够支付3P=101P超出[1,100]4R<=P<=100能够支付5P<R不能支付等价分析法:等价类有效等价类编号无效等价类编号R整数1浮点数101<=R<=1002R<111R>10012P整数3浮点数131<=P<=R<=1004P<114P>10015R>P16N整数5浮点数19N50=0||N50=16N50!=0||N50!=1200<=N10<=47N10<021N10>422N5=0||N5=18N5!=0||N5!=1230=<N1<=49N1<024N1>425测试用例编号输入数据预期结果R(价格)P(支付)N1N5N10N50199991000接受291914100接受390900010接受460600040接受550500001接受649491001接受746464001接受845450101接受941414101接受1040400040接受11994100接受12550100接受13444000接受14101-----拒绝121599.5100----拒绝101691919000拒绝25179000200拒绝231840400060拒绝221990900002拒绝20第4章--练习题4请用逻辑覆盖法对下面的java代码段进行测试。publiccharfunction(intx,inty){
chart;
if((x>=90)&&(y>=90)){
t='A';
}else{
if((x+y)>=165)
t='B';
else
t='C';
}
returnt;
}答案::修改代码:/**
*第4章练习题1
*/
publicclassSample1{
/**
*该方法接收两个整数参数(科目成绩),返回等级
*@paramx科目1的分数
*@paramy科目2的分数
*@returnchar等级
*/
publiccharfunction(intx,inty){
chart;
if((x>=90)&&(y>=90)){
t='A';
}else{
if((x+y)>=165)
t='B';
else
t='C';
}
returnt;
}
}测试代码如:importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.api.Test;
importstaticorg.junit.jupiter.api.Assertions.*;
classSample1Test{
@DisplayName("语句覆盖")
@Test
voidlineTest(){
Sample1sample1=newSample1();
assertEquals('A',sample1.function(90,90));
assertEquals('B',sample1.function(90,75));
assertEquals('C',sample1.function(80,75));
}
@DisplayName("分支覆盖")
@Test
voidbranchTest(){
Sample1sample1=newSample1();
assertEquals('A',sample1.function(90,90));
assertEquals('B',sample1.function(90,75));
assertEquals('C',sample1.function(80,75));
}
@DisplayName("条件覆盖")
@Test
voidconditionTest(){
Sample1sample1=newSample1();
assertEquals('A',sample1.function(90,90));
assertEquals('B',sample1.function(90,75));
assertEquals('C',sample1.function(80,75));
}
@DisplayName("判定-条件覆盖")
@Test
voidbranchConditionTest(){
Sample1sample1=newSample1();
assertEquals('A',sample1.function(90,90));
assertEquals('B',sample1.function(90,75));
assertEquals('C',sample1.function(80,75));
}
@DisplayName("条件组合覆盖")
@Test
voidconditionComTest(){
Sample1sample1=newSample1();
assertEquals('A',sample1.function(90,90));
assertEquals('C',sample1.function(70,90));
assertEquals('B',sample1.function(90,75));
assertEquals('C',sample1.function(80,75));
}
@DisplayName("条件组合覆盖")
@Test
voidpathTest(){
Sample1sample1=newSample1();
assertEquals('A',sample1.function(90,90));
assertEquals('B',sample1.function(90,75));
assertEquals('C',sample1.function(80,75));
}
}为以下流程图所示的程序段设计一组测试用例,要求分别满足语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。t=-1t=-1x>8andy>5x>16ory>10x>0ory>0t=0t=10FalseFalseTrueTrueTrueFalset=5答案:画出程序流程图对应的控制流图,如图所示(说明:图中绿色和红色的标准对应程序流程图中条件和判定),提示复合条件需要拆分。记:x>8 T1, x<=9 F1,y>5 T2, y<=5 F2,x>0 T3, x<=0 F3,y>0 T4, y<=0 F4,x>16 T5, x<=16 F5,y>10 T6, y<=10 F6(2)语句覆盖测试用例覆盖条件覆盖分支执行路径x=4,y=4F1F2T3T4F5F6361-2-3-6-9x=10,y=6T1T2T3T4F5F622’44’1-2-2’-4-4’-7-9x=0,y=0F1F2F3F4F5F6233’1-2-3-3’-5-9x=20,y=15T1T2T3T4T5T622’41-2-2’-4-8-9(3)判定覆盖测试用例覆盖条件覆盖分支执行路径x=4,y=4F1F2T3T4F5F6361-2-3-6-9x=10,y=6T1T2T3T4F5F622’44’1-2-2’-4-4’-7-9x=0,y=0F1F2F3F4F5F6233’1-2-3-3’-5-9x=20,y=15T1T2T3T4T5T622’41-2-2’-4-8-9(4)条件覆盖测试用例覆盖条件覆盖分支执行路径x=0,y=0F1F2F3F4F5F6233’1-2-3-3’-5-9x=20,y=15T1T2T3T4T5T622’41-2-2’-4-8-9(5)判定-条件覆盖测试用例覆盖条件覆盖分支执行路径x=4,y=4F1F2T3T4F5F6361-2-3-6-9x=10,y=6T1T2T3T4F5F622’44’1-2-2’-4-4’-7-9x=0,y=0F1F2F3F4F5F6233’1-2-3-3’-5-9x=20,y=15T1T2T3T4T5T622’41-2-2’-4-8-9(6)组合覆盖测试用例覆盖条件覆盖分支执行路径x=0,y=0F1F2F3F4F5F6233’1-2-3-3’-5-9x=20,y=15T1T2T3T4T5T622’41-2-2’-4-8-9x=20,y=15T1T2T3T4T5T622’41-2-2’-4-8-9x=0,y=15F1T2F3T4F5T62-3-3’1-2-3-3’-6-9(7)路径覆盖测试用例覆盖条件覆盖分支执行路径x=4,y=4F1F2T3T4F5F6361-2-3-6-9x=10,y=6T1T2T3T4F5F622’44’1-2-2’-4-4’-7-9x=0,y=0F1F2F3F4F5F6233’1-2-3-3’-5-9x=20,y=15T1T2T3T4T5T622’44’1-2-2’-4-8-9请用逻辑覆盖和基路径测试方法对下面的java代码进行测试。代码的功能是:用折半查找法在元素呈升序排列的数组中查找值为key的元素。/**
*二分查找
*/
publicclassSample3{
/**
*二分查找
*@paramarray数组
*@paramkey关键字
*@return位置
*/
publicintbinSearch(intarray[],intkey){
intmid,low,high;
low=0;
high=array.length-1;
while(low<=high){
mid=(low+high)/2;
if(key==array[mid])
returnmid;
elseif(key<array[mid])
high=mid-1;
else
low=mid+1;
}
return-1;
}
}答案:importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.params.ParameterizedTest;
importvider.CsvSource;
importjava.util.Arrays;
importstaticorg.junit.jupiter.api.Assertions.*;
classSample3Test{
@DisplayName("基路径测试")
@ParameterizedTest(name="{index}=>查找''{1}''预期位置{2}")
@CsvSource({"[1:2:3:4:5:6:7:8:9:10],9,8",
"[1:2:3:4:5:6:7:8:9:10],10,9",
"[1:2:3:4:5:6:7:8:9:10],4,3",
"[1:2:3:4:5:6:7:8:9:10],-1,-1"
})
voidbasePathTest(StringarrStr,intkey,intpos){
arrStr=arrStr.substring(1,arrStr.length()-1);
Sample3sample3=newSample3();
String[]arrayString=arrStr.split(":");
int[]array=Arrays.stream(arrayString)
.mapToInt(Integer::parseInt)
.toArray();
assertEquals(pos,sample3.binSearch(array,key));
}
@DisplayName("逻辑覆盖")
@ParameterizedTest(name="{index}=>查找''{1}''预期位置{2}")
@CsvSource({"[1:2:3:4:5:6:7:8:9:10],9,8",
"[1:2:3:4:5:6:7:8:9:10],10,9",
"[1:2:3:4:5:6:7:8:9:10],4,3",
"[1:2:3:4:5:6:7:8:9:10],1,0",
"[1:2:3:4:5:6:7:8:9:10],15,-1",
"[1:2:3:4:5:6:7:8:9:10],-1,-1"
})
voidlogicTest(StringarrStr,intkey,intpos){
arrStr=arrStr.substring(1,arrStr.length()-1);
Sample3sample3=newSample3();
String[]arrayString=arrStr.split(":");
int[]array=Arrays.stream(arrayString)
.mapToInt(Integer::parseInt)
.toArray();
assertEquals(pos,sample3.binSearch(array,key));
}
}以下代码由java语言书写,请按要求回答问题。publicintisLeap(intyear){ if(year%4==0){ if(year%100==0){ if(year%400==0) leap=1; else leap=0; } else leap=1;}else leap=0; returnleap;}问题1:请画出以上代码的控制流图问题2:请计算上述控制流图的圈复杂度V(G)(独立线性路径数)问题3:假设输入的取值范围是0<year<2010,请使用基本路径测试法为变量year设计测试用例,使其满足基本路径覆盖的要求。答案:问题1:(图中红色字符对应代码行号)问题2:V(G)=E–N+2=12–10+2=4V(G)=判定节点数+1=3+1=4v(G)=区域数=4问题3:源码:/**
*闰年判断
*/
publicclassSample4{
/**
*闰年判断
*
*@paramyear年份
*@return闰年
*/
publicBooleanisLeap(intyear){
Booleanleap;
if(year%4==0){
if(year%100==0){
if(year%400==0)
leap=true;
else
leap=false;
}else
leap=true;
}else
leap=false;
returnleap;
}
}测试代码:importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.params.ParameterizedTest;
importvider.CsvSource;
importstaticorg.junit.jupiter.api.Assertions.*;
classSample4Test{
@DisplayName("基路径测试")
@ParameterizedTest(name="{index}=>测试年:{0}")
@CsvSource({"2000,true",
"2024,true",
"1900,false",
"2001,false"
})
voidisLeapTest(intyear,booleanleap){
Sample4sample4=newSample4();
assertEquals(leap,sample4.isLeap(year));
}
}设计判别一个整数x(x≥2)是否为素数的程序,并设计测试用例满足条件覆盖和基本路径覆盖。答案:源码:/**
*判断是否为质数
*/
publicclassSample5{
/**
*判断是否为质数
*@paramn数字
*@return是否为质数
*/
publicbooleanprimeNumber(intn){
inti;
for(i=2;i<n;i++){
if(n%i==0){
returnfalse;
}
}
if(n==i){
returntrue;
}else{
returnfalse;
}
}
}测试代码:importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.params.ParameterizedTest;
importvider.CsvSource;
importstaticorg.junit.jupiter.api.Assertions.*;
classSample5Test{
@DisplayName("基路径测试")
@ParameterizedTest(name="{index}=>测试年:{0}")
@CsvSource({"2,true","3,true",
"1,false","4,false",
})
voidprimeNumberTest(intn,booleanprime){
Sample5sample5=newSample5();
assertEquals(prime,sample5.primeNumber(n));
}
}某程序的功能是:输入两个正整数,计算这两个数的最大公约数。程序代码如下。Publicintdivisor_c(inta,
intb){ if(a<=0||b<=0){ return
0; } while(a!=b){ if(a>b) a=a-b; else b=b-a; } returna; }请根据程序内容,请完成下列题目。(1)根据程序代码绘制控制流图。(2)计算控制流图的圈复杂度。(3)找出程序独立路径。(4)设计测试用例,实现基路径覆盖。(5)设计测试用例,实现语句覆盖。 答案:控制流图圈复杂度V(G)=E–N+2=13–10+2=5V(G)=判定节点数+1=4+1=5v(G)=区域数=5独立路径:1-2-91-1’-2-91-3-7-91-3-4-5-8-3-7-91-3-4-6-8-3-7-9(5)测试用例代码如下:源码:/**
*求最大公约数
*/
publicclassSample6{
/**
*求最大公约数
*@parama数字a
*@paramb数字b
*@return最大公约数
*/
publicintdivisor(inta,intb){
if(a<=0||b<=0){
return0;
}
while(a!=b){
if(a>b)
a=a-b;
else
b=b-a;
}
returna;
}
}测试代码importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.params.ParameterizedTest;
importvider.CsvSource;
importstaticorg.junit.jupiter.api.Assertions.*;
classSample6Test{
@DisplayName("基路径测试")
@ParameterizedTest(name="{index}=>测试:{0}|{1}公约数{2}")
@CsvSource({"2,1,1","2,4,2",
"3,3,3","4,6,2",
"-3,3,0","4,-6,0",
})
voiddivisorTest(inta,intb,intexpected){
Sample6sample6=newSample6();
assertEquals(expected,sample6.divisor(a,b));
}
}第5章--练习题51.单元测试中的单元描述正确的有哪些? A)指一个可独立运行的代码段,独立运行是指的是这个工作不受前一次或接下来的程序运行的结果影响; B)面向过程的测试中指函数或子过程; C)面向对象的测试中指类或类的方法; D)面向对象的测试中成员属性的测试;答案:ABC2.单元测试的描述中正确的描述有哪些? A)单元测试是对软件基本组成单元进行的测试。 B)单元测试从程序的内部结构出发来进行测试的,多采用白盒测试(结构性测试)技术。 C)单元测试是软件开发过程中进行的最低级别的测试活动。测试进行得越早越好。 D)测试工作主要是由程序开发人员进行自测和互测,同时还需要单独的测试角色,来进行测试和评审答案:ABCD3.单元测试中驱动模块(Driver)的作用? A)调用被测试单元; B)它接收测试数据,并把数据传送给被测单元, C)出实测结果。 D)被测试单元调用答案:ABC单元测试有那些步骤,各个步骤有那些实施内容。答案:单元测试包含制订测试计划、单元测试设计、测试执行、测试评估等步骤。制定测试计划的实施内容主要包括单元测试准备、制定单元测试策略和单元测试计划日程。单元测试设计的实施内容主要是根据设计规格说明书,建立单元测试环境,完成测试设计和脚本的开发。测试执行的实施内容主要是测试组根据测试计划和测试日程安排进行测试,并输出测试结果,同时注意回归测试的执行。测试评估的实施内容是由测试结果评估小组或评估人员对测试结果进行评测、分析,并输出分析结果。最后将从测试计划开始到评估结束的所有文档进行整理收集,提交测试结果。简述单元测试的目标和意义。答案:单元测试的目的:一个是查找错误,提高软件质量;另一方面是节约成本和削减开发时间。单元测试的包含两层意义:单元测试对软件设计实现的意义。单元测试对软件设计实现至关重要,旨在保障软件质量、降低开销,并促进代码重构与可测试性。它揭示设计流程,确保架构分层合理,业务逻辑实现于逻辑层。单元测试作为实例,促进开发者理解被测单元,替代过时文档,提高代码维护性,促进团队沟通,是推行质量文化的关键。单元测试对软件开发者的意义。尽管单元测试看似增加工作量,但实则为开发者带来诸多益处。它帮助开发者明确设计规格,锻炼逻辑思维与代码分析能力,促进编写标准一致,通过代码审阅增进团队跨领域理解与学习机会。6.对案例中的排序程序进行修改,替换成为起泡排序程序。具体程序如下:publicvoidbubbleSort(){for(inti=arr.length;--i>=0;){for(intj=0;j<i;j++){if(arr[j]>arr[j+1]){intt=arr[j];arr[j]=arr[j+1];arr[j+1]=t;}pause(i,j);}}}熟读程序,并对其进行单元测试。要求完成以下测试:代码规范检查和逻辑结构检查基路径覆盖测试循环覆盖测试等价类测试特殊值测试测试后,针对缺陷,对代码进行修复,并在修复后进行回归测试。答案:规范后代码/**
*冒泡排序
*/
publicclassSample6{
privateint[]arr;
/**
*冒泡排序
*/
publicvoidbubbleSort(){
for(inti=arr.length;--i>=0;){
for(intj=0;j<i;j++){
if(arr[j]>arr[j+1]){
intt=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
pause(i,j);
}
}
}
/**
*设置数组
*@return数组
*/
publicvoidsetArr(int[]arr){
this.arr=arr;
}
/**
*暂停函数,这里打印数据
*@parami位置i
*@paramj位置j
*/
publicvoidpause(inti,intj){
System.out.println("交换数据位置:i="+i+",j="+j);
}
}基路径覆盖测试代码@DisplayName("基路径覆盖测试")
@ParameterizedTest
@CsvSource({"[1:70:3:4:5:6:7:8:9:10],[1:3:4:5:6:7:8:9:10:70]",
"[1:-2:3],[-2:1:3]",
"[10:2:3:4:5:16:7:8:9:10],[2:3:4:5:7:8:9:10:10:16]",
})
voidbubbleSortPathTest(StringarrStr,StringarrExp){
Sample6sample6=newSample6();
String[]arrayString=arrStr.substring(1,arrExp.length()-1).split(":");
int[]array=Arrays.stream(arrayString)
.mapToInt(Integer::parseInt)
.toArray();
String[]arrayStringExp=arrExp.substring(1,arrExp.length()-1).split(":");
int[]arrayExp=Arrays.stream(arrayStringExp)
.mapToInt(Integer::parseInt)
.toArray();
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(arrayExp,array);
}循环测试代码,按照循环测试要求,测试循环次数,本例中只需测试测试循环0次)@DisplayName("循环覆盖测试")
@Test
voidbubbleSortCycleTest(){
Sample6sample6=newSample6();
int[]array=newint[]{};
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(newint[]{},array);
}等价类,本例中对输入数据进行有效等价类和无效等价类划分,有效类通过基路径测试和循环测试进行测试,这里测试无效数据。@DisplayName("等价类测试-数组为null")
@Test
voidbubbleSortTest(){
Sample6sample6=newSample6();
int[]array=null;
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(null,array);
}特殊值测试,这里主要测试按正序排列数据,倒序排列数据,相同数据的排序的测试@DisplayName("特殊值测试")
@ParameterizedTest
@CsvSource({"[1:1:1:1:1],[1:1:1:1:1]",
"[1:2:3:4:5],[1:2:3:4:5]",
"[5:4:3:2:1],[1:2:3:4:5]",
})
voidbubbleSortSpecialTest(StringarrStr,StringarrExp){
Sample6sample6=newSample6();
String[]arrayString=arrStr.substring(1,arrExp.length()-1).split(":");
int[]array=Arrays.stream(arrayString)
.mapToInt(Integer::parseInt)
.toArray();
String[]arrayStringExp=arrExp.substring(1,arrExp.length()-1).split(":");
int[]arrayExp=Arrays.stream(arrayStringExp)
.mapToInt(Integer::parseInt)
.toArray();
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(arrayExp,array);
}整理代码,抽象公共函数。测试代码如下:packagecn.st.ex5;
importorg.junit.jupiter.api.DisplayName;
importorg.junit.jupiter.api.Test;
importorg.junit.jupiter.params.ParameterizedTest;
importvider.CsvSource;
importjava.util.Arrays;
importstaticorg.junit.jupiter.api.Assertions.*;
classSample6Test{
@DisplayName("基路径覆盖测试")
@ParameterizedTest
@CsvSource({"[1:70:3:4:5:6:7:8:9:10],[1:3:4:5:6:7:8:9:10:70]",
"[1:-2:3],[-2:1:3]",
"[10:2:3:4:5:16:7:8:9:10],[2:3:4:5:7:8:9:10:10:16]",
})
voidbubbleSortPathTest(StringarrStr,StringarrExp){
test(arrStr,arrExp);
}
@DisplayName("循环覆盖测试")
@Test
voidbubbleSortCycleTest(){
Sample6sample6=newSample6();
int[]array=newint[]{};
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(newint[]{},array);
}
@DisplayName("等价类测试-数组为null")
@Test
voidbubbleSortTest(){
Sample6sample6=newSample6();
int[]array=null;
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(null,array);
}
@DisplayName("特殊值测试")
@ParameterizedTest
@CsvSource({"[1:1:1:1:1],[1:1:1:1:1]",
"[1:2:3:4:5],[1:2:3:4:5]",
"[5:4:3:2:1],[1:2:3:4:5]",
})
voidbubbleSortSpecialTest(StringarrStr,StringarrExp){
test(arrStr,arrExp);
}
voidtest(StringarrStr,StringarrExp){
Sample6sample6=newSample6();
String[]arrayString=arrStr.substring(1,arrExp.length()-1).split(":");
int[]array=Arrays.stream(arrayString)
.mapToInt(Integer::parseInt)
.toArray();
String[]arrayStringExp=arrExp.substring(1,arrExp.length()-1).split(":");
int[]arrayExp=Arrays.stream(arrayStringExp)
.mapToInt(Integer::parseInt)
.toArray();
sample6.setArr(array);
sample6.bubbleSort();
assertArrayEquals(arrayExp,array);
}
}测试后,测试用例不能完全通过,源码没有对arr为空的值进行处理,修改后的源码如下:/**
*冒泡排序
*/
publicclassSample6{
privateint[]arr;
/**
*冒泡排序
*/
publicvoidbubbleSort(){
if(arr==null||arr.length==0){
return;
}
for(inti=arr.length;--i>=0;){
for(intj=0;j<i;j++){
if(arr[j]>arr[j+1]){
intt=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
pause(i,j);
}
}
}
/**
*设置数组
*@return数组
*/
publicvoidsetArr(int[]arr){
this.arr=arr;
}
/**
*交换暂停打印
*@parami位置i
*@paramj位置j
*/
publicvoidpause(inti,intj){
System.out.println("交换数据位置:i="+i+",j="+j);
}
}第6章--练习题6基于功能分解的集成的方法有哪些? A)非渐增式集成; B)自顶向下集成; C)自底向上集成; D)三明治集成;答案:BCD基于调用图的集成方法有: A)成对集成 B)相邻集成 C)大棒集成 D)基于MM路径的集成答案:AB简述基于功能分解的集成的特点,并分析其适用的应用场景。答案:针对不同的顺序结构,基于功能分解的集成可分为自顶向下集成、自底向上集成、三明治集成。(1)自顶向下集成的优点是可以使高级别的逻辑和数据流可以在过程的早期阶段测试,有助于最大限度地减少对驱动程序的需求。缺点是低级别的模块在开发周期中相对较晚的周期测试,这样不能很好地支持有限功能的早期发布,如果桩模块不能反应真实情况,重要数据不能及时送回到上层模块,则测试可能不充分。自顶向下集成适用场景:控制结构比较清晰和稳定、高层接口变化比较小、底层接口未定义或经常可能被修改、控制模块具有较大的\t"/html/31/_self"技术风险,需要尽早验证、希望能够尽早看到产品的系统功能行为。(2)自底向上集成的优点是可以最大限度地减少对桩模块的需求,并且可以实施多个模块的并行测试,提高了测试效率,测试人员能较好地锁定软件故障所在的位置。缺点是对驱动程序的需求使得测试管理变得复杂,不能很好地支持有限功能的早期发布。自底向上集成适用场景:底层接口比较稳定、高层接口变化比较频繁、底层模块较早完成。(3)三明治集成兼有自顶向下集成和自底向上集成的优缺点。三明治集成方法在软件测试中适用于大多数项目,特别事当系统的模块层次结构较为复杂,且中间层模块功能较为关键时,推荐使用该方法。简述基于调用图的集成的特点,并分析其适用的应用场景。答案:基于调用图的集成测试是关注于程序模块(函数方法)的调用关系来设计测试会话的,相对基于功能分解的集成测试而言,该测试方法对于功能层次关系不是很明确的软件系统的集成测试,特别是对于调用关系复杂的软件项目的集成测试很是适用。而基于调用图的集成测试,结合了结构性测试的方法,不仅关注模块间的调用关系,还
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度电子商务合伙拆伙协议终止协议
- 2025年度离职解除劳动合同模板:传媒广告行业员工离职流程
- 会计财务审计作业指导书
- 公司股权购买协议详细版
- 金融服务个人风险免责声明
- 《数学思维训练课程:数形结合学习指导》
- 肉类销售代理合同
- 关于项目进度管理的解决方案
- 房地产行业智能楼宇管理与服务平台方案
- 团队培训和发展服务合同
- 2025年湖南有色金属职业技术学院单招职业技能测试题库参考答案
- 储能站施工组织设计施工技术方案(技术标)
- 2025部编版小学道德与法治一年级下册教学计划
- 女职工权益保护法律知识竞赛题库(293题附答案)
- 楼梯 栏杆 栏板(一)22J403-1
- 2024湖北省联合发展投资集团限公司招聘221人高频难、易错点500题模拟试题附带答案详解
- 03S702钢筋混凝土化粪池-标准图集
- 幼儿园中班居家安全教案
- 国网直流电源系统技术监督规定
- 香港雇佣合同协议书
- 部编版四年级语文下册第二单元《习作:我的奇思妙想》课件PPT
评论
0/150
提交评论