免费智能真题库 > 历年试卷 > 软件评测师 > 2016年下半年 软件评测师 上午试卷 综合知识
  第66题      
  知识点:   白盒测试基本技术   测试方法
  关键词:   测试方法   测试        章/节:   测试技术的分类       

 
以下关于测试方法的叙述中,不正确的是(66)。
 
 
  A.  根据被测代码是否可见分为白盒测试和黑盒测试
 
  B.  黑盒测试一般用来确认软件功能的正确性和可操作性
 
  C.  静态测试主要是对软件的编程格式M结构等方面进行评估
 
  D.  动态测试不需要实际执行程序
 
 
 

 
  第60题    2014年下半年  
   46%
对于逻辑表达式((a||b)||(c&&d)),需要 (60) 个测试用例才能完成条件组合覆盖。
  第61题    2016年下半年  
   35%
一个程序的控制流图中有6个节点,10条边,在测试用例数最少的情况下,确保程序中每个可执行语句至少执行一次所需要的测试用例数的..
  第62题    2019年下半年  
   32%
对于逻辑表达式(buf_c[i]>223&&buf_c[i]<240&&i+2<total_bytes),需要( )个测试用例才能完成条件组合覆..
   知识点讲解    
   · 白盒测试基本技术    · 测试方法
 
       白盒测试基本技术
               词法分析与语法分析
               通过词法分析与语法分析可以获取软件组成的重要基本因数,例如:变量标识符、过程标识符、常量等,组合这些基本因数可以得到软件的基本信息。如:
               . 标号交叉引用表。列出在各模块中出现的全部标号,在表中标出标号的属性,包括已说明、未说明、已使用、未使用。表中还包括在模块以外的全局标号、计算标号等。
               . 变量交叉引用表,即变量定义与引用表。在表中应标明各变量的属性,包括已说明、未说明、隐式说明以及类型及使用情况,进一步还可区分是否出现在赋值语句的右边,是否属于COMMON变量、全局变量或特权变量等。
               . 子程序、宏和函数表。在表中列出各个子程序、宏和函数的属性,包括已定义、未定义、定义类型;以及参数表、输入参数的个数、顺序、类型,输出参数的个数、顺序、类型;已引用、未引用、引用次数等。
               . 等价表。表中列出在等价语句或等值语句中出现的全部变量和标号。
               . 常数表。表中列出全部数字常数和字符常数,并指出它们在哪些语句中首先被定义。
               按功能分类,引用表的作用有以下3种。
               . 直接从表中查出说明/使用错误。如循环层次表、变量交叉引用表、标号交叉引用表。
               . 为用户提供辅助信息。如子程序(宏、函数)引用表、等价表、常数表。
               . 用来做错误预测和程序复杂度计算。如操作符和操作数的统计表等。
               静态错误分析
               静态错误分析用于确定在源程序中是否有某类错误或“危险”结构。它有以下几种。
                      类型和单位分析
                      为了强化对源程序中数据类型的检查,在程序设计语言中扩充一些新的数据类型,例如,仅能在数组中使用的“下标”类型及在循环语句中当作控制变量使用的“计数器”类型。这样就可以静态预处理程序,分析程序中的类型错误。
                      引用分析
                      在静态错误分析中,最广泛使用的技术就是发现引用异常。如果沿着程序的控制路径,变量在赋值以前被引用,或变量在赋值以后未被引用,这时就发生了引用异常。
                      为了检测引用异常,需要检查通过程序的每一条路径。通常采用类似深度优先的方法遍历程序流图的每一条路径,也可以建立引用异常的探测工具,这种工具包括两个表:定义表和未引用表。每张表中都包含一组变量表。未引用表中包括已被赋值但还未被引用的一些变量。
                      当扫描抵达一个出度大于1的节点V时,深度优先探测算法要求先检查最左分支的那一部分程序流图,然后再检查其他分支。在最左分支检查完之前,应把定义表与未引用表的当前内容用一个栈暂时存储起来,当最左分支检查完之后,算法控制返回到节点V,从栈中恢复该节点的定义表和未引用表的老的副表,然后再去遍历该节点的下一个分支,这个过程要继续到全部分支检查完为止。
                      表达式分析
                      对表达式进行分析,以发现和纠正在表达式中出现的错误。包括:
                      . 在表达式中不正确地使用了括号造成错误;
                      . 数组下标越界造成错误;
                      . 除数为零造成错误;
                      . 对负数开平方,或对π求正切造成错误。
                      最复杂的一类表达式分析是对浮点数计算的误差进行检查。由于使用二进制数不精确地表示十进制浮点数,常常使计算结果出乎意料。
                      接口分析
                      接口一致性是程序的静态错误分析和设计分析共同研究的题目。接口一致性的设计可以分析检查模块之间接口的一致性和模块与外部数据库之间接口的一致性。
                      程序关于接口的静态错误分析检查过程与实参在类型、函数过程之间接口的一致性,因此要检查形参与实参在类型、数量、维数、顺序、使用上的一致性;检查全局变量和公共数据区在使用上的一致性。
               程序插桩技术
               在软件动态测试中,程序插桩(Program Instrumentation)是一种基本的测试手段,有着广泛的应用。
                      方法简介
                      程序插桩方法,简单地说,是借助往被测程序中插入操作,来实现测试目的的方法。
                      我们在调试程序时,常常要在程序中插入一些打印语句。其目的在于,希望执行程序时,打印出我们最为关心的信息。进一步通过这些信息了解执行过程中程序的一些动态特性。比如,程序的实际执行路径,或是特定变量在特定时刻的取值。从这一思想发展出的程序插桩技术能够按用户的要求,获取程序的各种信息,成为测试工作的有效手段。
                      如果我们想要了解一个程序在某次运行中所有可执行语句被覆盖(或称被经历)的情况,或是每个语句的实际执行次数,最好的办法是利用插桩技术。这里仅以计算整数X和整数Y的最大公约数程序为例,说明插桩方法的要点。下图所示给出了这一程序的流程图。图中虚线框并不是源程序的内容,而是为了记录语句执行次数而插入的。
                      
                      插桩后求最大公约数程序的流程图
                      这些虚线框要完成的操作都是计数语句,其形式为:
                      C(i)= C(i)+1i=1,2,…,6
                      程序从入口开始执行,到出口结束。凡经历的计数语句都能记录下该程序点的执行次数。如果我们在程序的入口处还插入了对计数器C(i)初始化的语句,在出口处插入了打印这些计数器的语句,就构成了完整的插桩程序,它便能记录并输出在各程序点上语句的实际执行次数。如下图所示表示了插桩后的程序,图中箭头所指均为插入的语句(源程序语句略)。
                      
                      插桩程序中插入的语句
                      通过插入的语句获取程序执行中的动态信息,这一做法如同在刚研制成的机器特定部位安装记录仪表一样。安装好以后开动机器试运行,我们除了可以从机器加工的成品检验得知机器的运行特性外,还可通过记录仪表了解其动态特性。这就相当于在运行程序以后,一方面可检验测试的结果数据,另一方面还可借助插入语句给出的信息了解程序的执行特性。正是这个原因,有时把插入的语句称为“探测器”,借以实现“探查”或“监控”的功能。
                      在程序的特定部位插入记录动态特性的语句,最终是为了把程序执行过程中发生的一些重要历史事件记录下来。例如,记录在程序执行过程中某些变量值的变化情况,变化的范围等。又如本书前面章节中所讨论的程序逻辑覆盖情况,也只有通过程序的插桩才能取得覆盖信息。实践表明,程序插桩方法是应用很广的技术,特别是在完成程序的测试和调试时非常有效。
                      设计插桩程序时需要考虑的问题包括:
                      . 探测哪些信息;
                      . 在程序的什么部位设置探测点;
                      . 需要设置多少个探测点。
                      
                      插桩后求最大公约数程序的流程图
                      其中前两个问题需要结合具体情况解决,并不能给出笼统的回答。至于第三个问题,需要考虑如何设置最少探测点的方案。例如,在如上图所示的程序入口处,若要记录语句Q=X和R=Y的执行次数,只需插入C(1)=C(1)+1这样一个计数语句就够了,没有必要在每个语句之后都插入一个计数语句。在一般的情况下,我们可以认为,在没有分支的程序段中只需一个计数语句。但程序中如果出现了多种控制结构,使得整个结构十分复杂,则为了在程序中设计最少的计数语句,需要针对程序的控制结构进行具体的分析。这里我们以Fortran程序为例,列举至少应在哪些部位设置计数语句:
                      . 程序块的第一个可执行语句之前;
                      . entry语句的前后;
                      . 有标号的可执行语句处;
                      . do、do while、do until及do终端语句之后;
                      . block-if、else if、else及endif语句之后;
                      . logical if语句处;
                      . 输入/输出语句之后;
                      . call语句之后;
                      . 计算go to语句之后。
                      断言语句
                      在程序中的特定部位插入某些用以判断变量特性的语句,使得程序执行中这些语句得以证实,从而使程序的运行特性得到证实。我们把插入的这些语句称为断言(assertions)。这一作法是程序正确性证明的基本步骤,尽管算不上严格的证明,但方法本身仍然是很实用的。下面以求两个非负数NUM和DEN之商的Wensley迭代算法为例,对断言语句的作用作一简要说明。
                      假定两个非负数中,NUM小于M(即所得之商小于1),算法中只用到加、减及除2的运算。该迭代算法的程序如下图所示。
                      
                      计算两非负数之商的迭代程序
                      从程序中可以看出,在每次迭代中由分母得到的变量B以及权增量W都要缩小一半,而且变量A随着迭代次数的增加将接近分子。这些粗略的观察和分析可以用以下4个断言语句表达,在每次迭代开始时4个断言必定为真:
                      ①W =2-K(K是迭代次数,并且K≥0);
                      ②A=DEN*Q;
                      ③B=DEN*W/2;
                      ④NUM/DEN-W
                      此外,我们还看出,在循环外W
                      NUM/DEN-E
                      它和上面的第④断言很相似。
                      假定我们所用的编译系统能够处理表达式形式的断言语句,插入断言以后的程序如下图所示。其中带有标记@的语句是断言语句。新增加的变量K只是在计算第①断言时用到。
                      
                      插入断言后的迭代程序
                      首先来检验在初始化以后循环后的断言。
                      ①由于K=0,所以是初值。W=2-K=1。
                      ②由于Q=0,A的初始A=DEN*Q=0。
                      ③将W的值代入DEN * W/2,则得B的初值:B=DEN/2。
                      ④我们曾假定0≤NUM
                      以上说明了这些断言在初始状态下为真。如果继续迭代,要证明断言为真,就必须证明无论if-then结构中执行什么路径这些断言都为真。我们先来考虑在初始测试中NUM-A-B≥0为假,即检验失败,然后给出程序向量的新值(A′,B′,W′,Q′和K′),我们有:
                      A*=A
                      B*=B/2
                      W*=W/2
                      Q*=Q
                      K*=K+1
                      再来检验4个断言:
                      ①W*=W/2=1/2 ** K*
                      ②A*=A=DEN*Q=DEN*Q*
                      ③ B*=B/2=DEN * W/4=DEN* W*/2
                      ④把A和B代入(NUM-A-B<0),得到NUM-DEN * Q-DEN * W/2<0,对此关系式两端除以DEN,并加Q,得到,由于Q′=Q, W′=W/2,我们有NUM/DEN-W**,且Q≤NUM/DEN。
                      如果if-then检验成立,再来看4个断言。使用A″,B″,W″,Q″和K″作为新的程序向量,我们有:
                      ①W′=W/2=1/2 ** K"
                      ②A"=DEN * Q+DEN * W/2=DEN *(Q+W/2)=DEN * Q"
                      ③ B″=B/2=DEN * W/4=DEN * W″/2
                      ④代入(NUM-A-B ≥ 0),并作同前的变换,得到NUM/DEN - W″/2
                      总之,无论执行哪一路径,在每一迭代的开始,4个断言均为真。尽管并未考虑输出断言,但是我们知道,第④断言成立,由于W
 
       测试方法
        根据是否执行软件,将软件测试方法分为静态测试和动态测试。动态测试是建立在程序的执行过程中,根据是否要求了解被测对象的内部,分为黑盒测试和白盒测试。
               静态测试和动态测试
                      静态测试
                      静态测试方法包括检查单和静态分析方法,对软件文档的静态测试方法主要是以检查单的形式进行文档审查,而对软件代码的静态测试方法一般采用代码审查、代码走查和静态分析的形式进行。
                      静态分析是一种对代码的机械性和程序化的特性分析方法。一般包括控制流分析、数据流分析、接口分析和表达式分析。
                      代码审查是检查代码和设计的一致性、代码执行标准的情况、代码逻辑表达的正确性、代码结构的合理性以及代码的可读性。代码审查应根据所使用的语言和编码规范确定审查所用的检查单,检查单的设计或采用应经过评审。
                      代码走查是由测试人员组成小组,准备一批有代表性的测试用例,集体扮演计算机的角色,按照程序的逻辑,逐步运行测试用例,查找被测软件缺陷。代码走查应由测试人员集体阅读讨论程序,是用“人脑”执行测试用例并检查程序。
                      对于规模较小、安全性要求很高的代码也可进行形式化证明。静态分析常需要使用软件工具进行。
                      静态测试的特点有:不必设计在计算机上执行的测试用例;可充分发挥人的逻辑思维优势;不需特别条件,容易开展;发现错误的同时也就定位了错误,不需作额外的错误定位工作。
                      动态测试
                      动态测试是建立在程序的执行过程中,根据是否对被测对象内部的了解,分为黑盒测试和白盒测试。
                      黑盒测试是一种按照软件功能说明设计测试数据的技术,不考虑程序内部结构和编码结构,也不需考虑程序的语句及路径,只需了解输入/输出之间的关系,依靠这一关系和软件功能说明确定测试数据,判定测试结果的正确性。黑盒测试又称功能测试、数据驱动测试或基于需求的测试。
                      白盒测试是一种按照程序内部逻辑结构和编码结构设计测试数据的技术,可以看到程序内部结构,并根据内部结构设计测试数据,使程序中的每个语句、每个条件分支、每个控制路径的覆盖情况都在测试中受到检验。白盒测试又称结构测试、逻辑测试或基于程序的测试。
                      动态测试的特点有:实际运行被测程序;必须设计测试用例来运行;测试结果分析工作量大,测试工作费时、费力;投入人员多、设备多,处理数据多,要求有较好的管理和工作规程。
                      在软件动态测试过程中,应采用适当的测试方法,实现测试要求。配置项测试和系统测试一般采用黑盒测试方法;部件测试一般主要采用黑盒测试方法,辅助以白盒测试方法;单元测试一般采用白盒测试方法,辅助以黑盒测试方法。
               黑盒测试
               黑盒测试方法一般采用功能分解、等价类划分、边界值分析、判定表、因果图、随机测试、猜错法和正交试验法等。
                      功能分解
                      功能分解是将需求规格说明中每一个功能加以分解,确保各个功能被全面地测试。功能分解是一种较常用的方法。
                      步骤如下:
                      (1)使用程序设计中的功能抽象方法把程序分解为功能单元。
                      (2)使用数据抽象方法产生测试每个功能单元的数据。
                      功能抽象中程序被看成一种抽象的功能层次,每个层次可标识被测试的功能,层次结构中的某一功能有由其下一层功能定义。按照功能层次进行分解,可以得到众多的最低层次的子功能,以这些子功能为对象,进行测试用例设计。
                      数据抽象中,数据结构可以由抽象数据类型的层次图来描述,每个抽象数据类型有其取值集。程序的每一个输入和输出量的取值集合用数据抽象来描述。
                      等价类划分
                      等价类划分是在分析需求规格说明的基础上,把程序的输入域划分成若干部分,然后在每部分中选取代表性数据形成测试用例。
                      步骤如下:
                      (1)划分有效等价类:对规格说明是有意义、合理的输入数据所构成的集合。
                      (2)划分无效等价类:对规格说明是无意义、不合理的输入数据所构成的集合。
                      (3)为每一个等价类定义一个唯一的编号。
                      (4)为每一个等价类设计一组测试用例,确保覆盖相应的等价类。
                      边界值分析
                      边界值分析是针对边界值进行测试的。使用等于、小于或大于边界值的数据对程序进行测试的方法就是边界值分析方法。
                      步骤如下:
                      (1)通过分析需求规格说明,找出所有可能的边界条件。
                      (2)对每一个边界条件,给出满足和不满足边界值的输入数据。
                      (3)设计相应的测试用例。
                      对满足边界值的输入可以发现计算错误,对不满足的输入可以发现域错误。该方法会为其他测试方法补充一些测试用例,绝大多数测试都会用到本方法。
                      判定表
                      判定表由四部分组成:条件桩、条件条目、动作桩、动作条目。任何一个条件组合的取值及其相应要执行的操作构成规则,条目中的每一列是一条规则。
                      条件引用输入的等价类,动作引用被测软件的主要功能处理部分,规则就是测试用例。
                      建立并优化判定表,把判定表中每一列表示的情况写成测试用例。
                      该方法的使用有以下要求:
                      (1)需求规格说明以判定表形式给出,或是很容易转换成判定表。
                      (2)条件的排列顺序不会影响执行哪些操作。
                      (3)规则的排列顺序不会影响执行哪些操作。
                      (4)每当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则。
                      (5)如果某一规则的条件的满足,将执行多个操作,这些操作的执行与顺序无关。
                      因果图
                      因果图方法是通过画因果图,把用自然语言描述的功能说明转换为判定表,然后为判定表的每一列设计一个测试用例。
                      步骤如下:
                      (1)分析需求规格说明,引出原因(输入条件)和结果(输出结果),并给每个原因和结果赋予一个标识符。
                      (2)分析需求规格说明中语义的内容,并将其表示成连接各个原因和各个结果的“因果图”。
                      (3)在因果图上标明约束条件。
                      (4)通过跟踪因果图中的状态条件,把因果图转换成有限项的判定表。
                      (5)把判定表中每一列表示的情况生成测试用例。
                      如果需求规格说明中含有输入条件的组合,宜采用本方法。有些软件的因果图可能非常庞大,根据因果图得到的测试用例数目非常多,此时不宜使用本方法。
                      随机测试
                      随机测试指测试输入数据是在所有可能输入值中随机选取的。测试人员只需规定输入变量的取值区间,在需要时提供必要的变换机制,使产生的随机数服从预期的概率分布。该方法获得预期输出比较困难,多用于可靠性测试和系统强度测试。
                      猜错法
                      猜错法是有经验的测试人员,通过列出可能有的错误和易错情况表,写出测试用例的方法。
                      正交实验法
                      正交实验法是从大量的实验点挑出适量的、有代表性的点,应用正交表,合理地安排实验的一种实验设计方法。
                      利用正交实验法来设计测试用例时,首先要根据被测软件的需求规格说明找出影响功能实现的操作对象和外部因素,把它们当作因子,而把各个因子的取值当作状态,生成二无的因素分析表。然后,利用正交表进行各因子的状态的组合,构造有效的测试输入数据集,并由此建立因果图。这样得出的测试用例的数目将大大减少。
               白盒测试
               白盒测试方法一般包括控制流测试(语句覆盖测试、分支覆盖测试、条件覆盖测试、修订的条件/判定覆盖MC/DC、条件组合覆盖测试、路径覆盖测试)、数据流测试、程序变异、程序插桩、域测试和符号求值等。
                      控制流测试
                      控制流测试依据控制流程图产生测试用例,通过对不同控制结构成分的测试验证程序的控制结构。所谓验证某种控制结构即指使这种控制结构在程序运行中得到执行,也称这一过程为覆盖。以下介绍几种覆盖:
                      (1)语句覆盖。语句覆盖要求设计适当数量的测试用例,运行被测程序,使得程序中每一条语句至少被遍历,语句覆盖在测试中主要发现错误语句。
                      (2)分支覆盖。分支覆盖要求设计适当数量的测试用例,运行被测程序,使得程序中每个真值分支和假值分支至少执行一次,分支覆盖也称判定覆盖。
                      (3)条件覆盖。条件覆盖要求设计适当数量的测试用例,运行被测程序,使得每个判断中的每个条件的可能取值至少满足一次。
                      (4)修订的条件/判定覆盖(MC/DC——Modified Condition/Decision Coverage)。修订的条件/判定覆盖要求设计适当数量的测试用例,运行被测程序,使得每个判定中的每个条件都曾独立的影响判定的结果至少一次(独立影响意思是在其他的条件不变的情况下,只改变一个条件,就可影响整个判定的值)。
                      对安全性要求比较高的软件,一般采用此覆盖要求。此覆盖要求在测试用例的效率和数量之间较为平衡。
                      (5)条件组合覆盖。条件组合覆盖要求设计适当数量的测试用例,运行被测程序,使得每个判断中条件的各种组合至少出现一次,这种方法包含了“分支覆盖”和“条件覆盖”的各种要求。
                      (6)路径覆盖。路径覆盖要求设计适当数量的测试用例,运行被测程序,使得程序沿所有可能的路径执行,较大程序的路径可能很多,所以在设计测试用例时,要简化循环次数。
                      以上各种覆盖的控制流测试步骤如下:
                      (1)将程序流程图转换成控制流图。
                      (2)经过语法分析求得路径表达式。
                      (3)生成路径树。
                      (4)进行路径编码。
                      (5)经过译码得到执行的路径。
                      (6)通过路径枚举产生特定路径的测试用例。
                      控制流图是描述程序控制流的一种图示方式,它由结点和定向边构成。控制流图的结点代表一个基本块,定向边代表控制流的方向。其中要特别注意的是,如果判断中的条件表达式是复合条件,即条件表达式是由一个或多个逻辑运算符连接的逻辑表达式,则需要改变复合条件的判断为一系列单个条件的嵌套的判断。控制流图的基本结构如下图所示。
                      
                      控制流图基本结构
                      数据流测试
                      数据流测试是用控制流程图对变量的定义和引用进行分析,查找出未定义的变量或定义了而未使用的变量,这些变量可能是拼错的变量、变量混淆或丢失了语句。数据流测试一般使用工具进行。
                      数据流测试通过一定的覆盖准则,检查程序中每个数据对象的每次定义、使用和消除的情况。
                      数据流测试步骤:
                      (1)将程序流程图转换成控制流图。
                      (2)在每个链路上标注对有关变量的数据操作的操作符号或符号序列。
                      (3)选定数据流测试策略。
                      (4)根据测试策略得到测试路径。
                      (5)根据路径可以获得测试输入数据和测试用例。
                      动态数据流异常检查在程序运行时执行,获得的是对数据对象的真实操作序列,克服了静态分析检查的局限,但动态方式检查是沿与测试输入有关的一部分路径进行的,检查的全面性和程序结构覆盖有关。
                      程序变异
                      程序变异是一种错误驱动测试,是为了查出被测软件在做过其他测试后还剩余一些的小错误。本方法应用于测试工具。
                      程序插装
                      程序插装是向被测程序中插入操作以实现测试目的方法。程序插装不应该影响被测程序的运行过程和功能。
                      有很多的工具有程序插装功能。由于数据记录量大,手工进行将是一件很烦琐的事。
                      域测试
                      域测试是要判别程序对输入空间的划分是否正确。该方法限制太多,使用不方便,供有特殊要求的测试使用。
                      符号求值
                      符号求值是允许数值变量取“符号值”以及数值。符号求值可以检查公式的执行结果是否达到程序预期的目的;也可以通过程序的符号执行,产生出程序的路径,用于产生测试数据。符号求值最好使用工具,在公式分支较少时手工推导也是可行的。
   题号导航      2016年下半年 软件评测师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第66题    在手机中做本题