1.下面给出的伪码中有一个错误。仔细阅读这段伪码,说明该伪码的语法特点,找出并改正伪码中的错误。字频统计程序的伪码如下:
INITIALIZE the Program
READ the first text record
DO WHILE there are more words in the text record
DO WHILE there are more words in the text record
EXTRACT the next text word
SEARCH the word-table for the extracted word
IF the extracted word is found
INCREMENT the word’s occurrence count
ELSE
INSERT the extracted word into the table
END IF
INCREMENT the words-processed count
END DO at the end of the text record
READ the next text record
END DO when all text records have heen read
PRINT the table and summary information
TERMINATE the program 答:INSERT the extracted word into the table在这个后面,有没有给这个word的occurrence/count 赋值为1
2、研究下面给出的伪码程序,要求: (1) 画出它的程序流程图。 (2) 它是结构化的还是非结构化的?说明理由。 (3) 若是非结构化的,则 (a) 把它改造成仅用3种控制结构的结构化程序; (b) 写出这个结构化设计的伪码; © 用盒图表示这个结构化程序。 (4) 找出并改正程序逻辑中的错误。 COMMENT:PROGRAM SEARCHES FOR FIRST N REFERENCES TO A TOPIC IN AN INFORMATION RETRIEVAL SYSTEM WITH T TOTAL ENTRIES INPUT N INPUT KEYWORD(S)FOR TOPIC I=O MATCH=0 DO WHILE I≤T I=I+1 IF WORD=KEYWORD THEN MATCH=MATCH+1 STORE IN BUFFER END IF MATCH=N THEN GOTO OUTPUT END END IF N=0 THEN PRINT ″NO MATCH″ OUTPUT:ELSE CALL SUBROUTINE TO PRINT BUFFER INFORMATION END 答:
(4)程序中的错误:语句"IF WORD=KEYWORD"里的变量"WORD"没有预先赋值。 程序中没有预先输入T的值 “N=0"应该是"MATCH=0”
3.在第2题的设计中若输入的N值或KEYWORD不合理,会发生问题。 (1) 给出这些变量的不合理值的例子。 (2) 将这些不合理值输入程序会有什么后果? (3) 怎样在程序中加入防错措施,以防止出现这些问题? 答: (1)N=1,KEYWOED=#。 (2)无法打印出任何信息。 (3)加入循环
4、(1)什么是模块测试和集成测试?它们各有什么特点? (2)假设有一个由1000行FORTRAN语句构成的程序(经编译后大约有5000条机器指令),估计在对它进行测试期间将发现多少个错误?为什么? (3)设计下列伪码程序的语句覆盖和路径覆盖测试用例: START INPUT(A,B,C) IF A>5 THEN X=10 ELSE X=1 END IF IF B>10 THEN X=20 ELSE X=2 END IF IF C>15 THEN X=30 ELSE X=3 END IF PRINT (X,Y,Z) STOP 答:(1)模块测试是对每个单独的模块,分别用黑盒和白盒测试技术,测试它的功能是否正确,检查模块控制结构中的特定路径并发现最大数量的错误。 其特点是:主要应用白盒测试的技术,对多个模块的测试可以并发的进行。 集成测试是把模块装配在一起形成完整的软件包,在装配的同时进行测试。 特点是:可能发生接口问题。 (2)月25至100个错误,美国的一些统计数字告诉我们通常这个比值在0.005-0.02之间,也就是说,测试之前每1000条指令中大约有5-20个错误。假设测试之前每1000条指令中有10个错误,则估计对它进行测试期间将发现的错误数为:5000×10/1000=50。 (3)语句覆盖的测试用例 因为每个判定表达式为真或为假时均有赋值语句,为了使每个语句都至少执行一次,总共需要两组测试数据,以便使得每个判定表达式取值为真或为假各一次。下面是实现语句的典型测试用例: ①使3个判定表达式之值全为假 输入:A=1,B=1,C=1 预期的输出:X=1,Y=2,Z=3 ②使3个判定表达式之值全为真 输入:A=20,B=40,C=60 预期的输出:X=10,Y=20,Z=30 路径覆盖的测试用例 本程序共有8条可能的执行通路,为做到路径覆盖总共需要8组测试数据。下面是实现路径覆盖的典型测试用例: ①3个判定表达式之值全为假 输入:A=1,B=1,C=1 预期的输出:X=1,Y=2,Z=3 ②3个判定表达式依次为假、假、真 输入:A=1,B=1,C=60 预期的输出:X=1,Y=2,Z=30 ③3个判定表达式依次为假、真、假 输入:A=1,B=40,C=1 预期的输出:X=1,Y=20,Z=3 ④3个判定表达式依次为假、真、真 输入:A=1,B=40,C=60 预期的输出:X=1,Y=20,Z=30 ⑤3个判定表达式依次为真、假、假 输入:A=20,B=1,C=1 预期的输出:X=10,Y=2,Z=3 ⑥3个判定表达式依次为真、假、真 输入:A=20,B=1,C=60 预期的输出:X=10,Y=2,Z=30 ⑦3个判定表达式依次为真、真、假 输入:A=20,B=40,C=1 预期的输出:X=10,Y=20,Z=3 ⑧3个判定表达式全为真 输入:A=20,B=40,C=60 预期的输出:X=10,Y=20,Z=30
5.某图书馆有一个使用CRT终端的信息检索系统,该系统有下列4个基本检索命令:
要求:
(1) 设计测试数据以全面测试系统的正常操作;
(2) 设计测试数据以测试系统的非正常操作 答:(1)测试系统正常操作的测试数据 ①顺序执行下列3个命令: b(KEYWORD) s(L) d(N) 其中,KEYWORD是正确的关键字;L是执行命令b后在屏幕上显示的约20个行号中的一个(至少应该使L分别为第一个、最后一个和中央一个行号);N是执行命令s后列出的索引号中的一个(至少应该使N 分别为第一个、最后一个和中央一个索引号)。 针对若干个不同的KEYWORD重复执行上述命令序列。 ②顺序执行下列2个命令: f(NAME) d(N) 其中,NAME是已知的作者姓名;N是执行命令f后列出的索引号中的一个(至少应该使N分别为第一个、最后一个和中央一个索引号)。 针对若干个不同的NAME重复执行上述命令序列。 (2)测试系统非正常操作的测试数据 ①用过长的关键字作为命令b的参数:例如,b(reliability software and hardware combined) 预期的输出:系统截短过长的关键字,例如,上列命令中的关键字可能性被截短为reliability software ②用不正确的关键字作为命令b的参数:例如,b(AARDV ARK) 预期的输出:显示出最接近的匹配结果,例如,执行上列命令后可能显示 1.AARON,JULES(book) ③用比执行命令b后列出的最大行号大1的数作为命令s的参数 预期的输出:“命令s的参数不在行号列表中” ④用数字和标点符号作为命令b和命令f的参数 预期的输出:“参数类型错” ⑤用字母字符作为命令s和命令d的参数 预期的输出:“参数类型错” ⑥用0和负数作为命令s和命令d的参数 预期的输出:“参数数值错” ⑦命令顺序错:例如,没执行命令b就执行命令s,或没执行命令s就执行命令d 预期的输出:“命令顺序错” ⑧命令语法错:例如,遗漏命令名b、s、d或f;或命令参数没用圆括号括起来 预期的输出:“命令语法错” ⑨命令参数空:例如,b()、s()、d或f() 预期的输出:系统提供默认参数或给出出错信息 ⑩使用拼错了的作者姓名作为f的参数 预期的输出:“找不到这们作者的著作”
6.航空公司A向软件公司B订购了一个规划飞行路线的程序。假设你是软件公司C的软件工程师,A公司已雇用自己所在的公司对上述程序进行验收测试。任务是,根据下述事实设计验收测试的输入数据,解释选取这些数据的理由。 领航员向程序输入出发点和目的地,以及根据天气和飞机型号而初步确定的飞行高度。程序读入途中的风向风力等数据,并且制定出3套飞行计划(高度,速度,方向及途中的5个位置校核点)。所制定的飞行计划应做到燃料消耗和飞行时间都最少。 答: 用正常的输入数据作为测试数据 ①向程序输入常规的出发点,目的地,飞机型号,5个位置校核点,高度和速度。 ②输入3~5组出发点和目的地,重复执行步骤1 ③输入固定的出发点、目的地、飞机型号、5个位置校核点和高度,分别输入3~5个不同的速度,重复执行步骤1 ④输入固定的出发点、目的地、飞机型号、5个位置校核点和速度,分别输入3~5个不同的高度,重复执行步骤1 ⑤输入固定的出发点、目的地、飞机型号、速度和高度,分别输入3~5组不同的位置校核点,重复执行步骤1 ⑥输入固定的出发点、目的地、5个位置校核点和高度,分别输入3~5个不同的飞机型号,重复执行步骤1 ⑦输入固定的目的地、5个位置校核点和高度,分别输入3~5个不同的飞机型号,重复执行步骤1 ⑧输入固定的出发点、5个位置校核点和高度,分别输入3~5个不同的目的地,重复执行步骤1 (2)用特殊的数据值作为测试数据 ①分别输入非常高和非常低的数据组合测试 ②用负数测试 ③输入数字0进行测试 ④分别输入相距非常远和非常近的出发点和目的地测试 ay和size,size小于数组的大小,并给出需要查找的值,该值在somearray中; 预期的输出:返回-1; ⑤首先给出某个数组somearray和size,size大于数组的大小,并给出需要查找的值,该值不在somearray 中; 预期的输出:返回-1; ⑥首先给出某个数组somearray和size,size大于数组的大小,并给出需要查找的值,该值在somearray 中; 预期的输出:返回-1;
7.严格说来,有两种不同的路径覆盖测试,分别为程序路径覆盖和程序图路径覆盖。这两种测试可分别称为程序的自然执行和强迫执行。所谓自然执行是指测试者(人或计算机)读入程序中的条件表达式,根据程序变量的当前值计算该条件表达式的值(真或假),并相应地分支。强迫执行是在用程序图作为程序的抽象模型时产生的一个人为的概念,它可以简化测试问题。强迫执行的含义是,一旦遇到条件表达式,测试者就强迫程序分两种情况(条件表达式的值为真和为假)执行。显然,强迫执行将遍历程序图的所有路径,然而由于各个条件表达式之间存在相互依赖的关系,这些路径中的某一些在自然执行时可能永远也不会进入。 为了使强迫执行的概念在实际工作中有用,它简化测试工具的好处应该超过它使用额外的不可能达到的测试用例所带来的坏处。在绝大多数情况下,强迫执行的测试数并不比自然执行的测试数大很多,此外,对强迫执行的定义实际上包含了一种技术,能够缩短在测试含有循环的程序时所需要的运行时间。 程序的大部分执行时间通常用于重复执行程序中的DO循环,特别是嵌套的循环。因此必须发明一种技术,使得每个DO循环只执行一遍。这样做并不会降低测试的功效,因为经验表明第一次或最后一次执行循环时最容易出错。 Laemmel教授提出的自动测试每条路径的技术如下。 当编写程序时每个DO循环应该写成一种包含测试变量T和模式变量M的特殊形式,因此 DO I= 1 TO 38 应变成 DO I=1 TO M×38+(1-M)×T 可见,当M=0时处于测试模式,而M=1时处于正常运行模式。当处于测试模式时,令T=0则该循环一次也不执行,令T=1则该循环只执行一次。 类似地应该使用模式变量和测试变量改写IF语句,例如 IF X+Y>0 THEN Z=X ELSE Z=Y 应变成 IF M×(X+Y)+T>0 THEN Z=X ELSE Z=Y 正常运行时令M=1和T=0,测试期间令M=0,为测试THEN部分需令T=+1,测试ELSE部分则令 T=-1。 要求: (1) 选取一个包含循环和IF 语句的程序,用Laemmel 技术修改这个程序,上机实际测试这个程序并解释所得到的结果。 (2) 设计一个程序按照Laemmel 技术自动修改待测试的程序。利用这个测试工具修改上一问中人工修改的程序,两次修改得到的结果一致吗? (3) 怎样把Laemmel 技术推广到包含WHILE DO 和REPEAT UNTIL 语句的程序? (4) 试分析Laemmel 技术的优缺点并提出改进意见。 答:(1)if (x+y)>2 A=x Else A=y 改为:if M×(x+y)+T>2 A=x Else A=y 结果一致。 (2)两次结果是一致的 (3)WHILE DO 和IF ELSE 修改技术类似。 (4)优点是可以使得结果更为精确。缺点是并不适用所有的程序,有时会有程序运行变得复杂。
8.对一个包含10000条机器指令的程序进行一个月集成测试后,总共改正了15个错误,此时MTTF=10h ;经过两个月测试后,总共改正了25个错误(第二个月改正了10个错误),MTTF=15h 。 要求: (1)根据上述数据确定MTTF 与测试时间之间的函数关系,画出MTTF 与测试时间τ的关系曲线。在化这条曲线是做了什么假设? (2)为做到MTTF=100h ,必须进行多长时间的集成测试?当集成测试结束时总共改正了多少个错误,还有多少个错误潜伏在程序中? 答:(1)MTTF 与测试时间τ的关系曲线如下:
假设调试过程中没有引入新的错误。 (2)根据估算平均无故障时间的公式可得: 1/K(Et/10000-100/10000)=10 1/K (Et/10000-300/10000)=15 计算可得:K =333,Et=45 当MTTF=100h 时,有 1/333(45/10000-Ec/10000)=100 计算可得:Ec=42.按前两个月测试改错的进度估算,需进行3个月的集成测试。 当测试结束时,共改正了42个错误,还有3个错误潜伏在程序中。
如对一个长度为100000条指令的程序进行集成测试期间记录下下面的数据: (a )7月1日:集成测试开始,没有发现错误。 (b )8月2日:总共改正100个错误,此时MTTF=0.4h (c )9月1日:总共改正300个错误,此时MTTF=2h 根据上列数据完成下列各题。 (1)估计程序中的错误总数。 (2)为使MTTF 达到10h ,必须测试和调试这个程序多长时间? (3)画出MTTF 和测试时间τ之间的函数关系曲线。 答:(1)根据估算平均无故障时间的公式可得: 1/K(Et/100000-100/100000)=0.4 1/K (Et/100000-300/100000)=2 计算可得:K =1000,Et=350即程序中的错误总数为350。 (2)当MTTF =10h 时,有 1/K (350/100000- Ec/100000)=10 计算可得:Ec=340.按前两个月测试改错的进度估算,还进行2个月的集成测试。 (3)MTTF 和测试时间τ之间的函数关系曲线如下:
10.在测试一个长度为24000条指令的程序时,第一个月由甲、乙两名测试员各自独立测试这个程序。经一个月测试后,甲发现并改正20个错误,使MTTF 达到10h 。与此同时,乙发现24个错误,其中6个甲也发现了。以后由甲一个人继续测试这个程序。问: (1)刚开始测试时程序中总共有多少个潜藏的错误? (2)为使MTTF 达到60h ,必须再改正多少个错误?还需用多长测试时间? (3)画出MTTF 与集成测试时间τ之间的函数关系曲线。 答:(1)根据公式:B0=B2B1/bc ,可得: B0=20×24/6=80,即刚开始测试时程序中总共有80个错误。 (2)根据估算平均无故障时间的公式可得: 1/K(80/24000-20/24000)=10 1/K(80/24000- Ec/24000)=60 计算可得:K=40,Ec=70 即还需要改正50个错误。根据甲的改正进度,估计还需要3个月。 (3)MTTF 与集成测试时间τ之间的函数关系曲线如下: