- 1、本文档共79页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章_路径测试
圈复杂度 一般程序图中,圈复杂度表示从源节点到汇节点的线性独立路径数 V(G)=e-n+2p 强连接图中,圈复杂度表示线性独立环路数 V(G)=e-n+p McCabe方法 程序路径的向量空间 向量空间的基——基路径 路径-边的关联矩阵 McCabe基线方法(基路径算法) (1)选择一个基路径(建议选择有尽可能多的判断节点的路径); (2)重新回溯该基线路径,依次“翻转”每个判断点; (3)重复(2),直到得到所有基路径。 McCabe基路径方法的优缺点 优点 基路径覆盖可保证所有的决策分支都被测试; 缺点 不是充分测试 表示方法的理解困难 对于程序图(DD-路径图)中节点存在依赖关系时,要辅助其他的测试方法。 条件覆盖 优点:显然条件覆盖比判定覆盖,增加了对符合判定情况的测试,增加了测试路径。 缺点:要达到条件覆盖,需要足够多的测试用例,但条件覆盖并不能保证判定覆盖。条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。 判定/条件覆盖(点线结合) 又叫分支-条件覆盖或分支-谓词覆盖 主要特点:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。 判定/条件覆盖? 用例设计: ?X ?Y ?路径 ?1 ?90 ?90 ?OAE ?2 ?50 ?50 ?OBDE ?3 ?90 ?70 ?OBCE ?4 ?70 ?90 ?OBCE 判定/条件覆盖 优点:判定/条件覆盖满足判定覆盖准则和条件覆盖准则,弥补了二者的不足。 缺点:未考虑条件的组合情况。尽管看上去所有条件的所有结果似乎都执行到了,但由于某些特定的条件会屏蔽掉其他的条件,通常并不能全部都执行到。例如:该准则并不一定会发现逻辑表达式中的错误(与、或)。?? 组合覆盖(点线组合) 又叫条件组合覆盖或复合谓词覆盖 主要特点:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。 组合覆盖 用例设计: ?X ?Y ?路径 ?1 ?90 ?90 ?OAE ?2 ?90 ?70 ?OBCE ?3 ?90 ?30 ?OBDE ?4 ?70 ?90 ?OBCE ?5 ?30 ?90 ?OBDE ?6 ?70 ?70 ?OBDE ?7 ?50 ?50 ?OBDE 组合覆盖 优点:多重条件覆盖准则满足判定覆盖、条件覆盖和判定/条件覆盖准则。更改的判定/条件覆盖要求设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身的所有可能结果也至少出现一次。并且每个条件都显示能单独影响判定结果。 缺点:线性地增加了测试用例的数量。 路径覆盖 主要特点:设计足够的测试用例,覆盖程序中所有可能的路径。 路径覆盖 用例设计: X Y 路径 1 90 90 OAE 2 50 50 OBDE 3 90 70 OBCE 4 70 90 OBCE 路径覆盖 优点:这种测试方法可以对程序进行彻底的测试,是上面所给出的测试技术的强化。路径覆盖准则包含了判定覆盖准则,但与条件覆盖、判定/条件覆盖和组合覆盖之间没有包含关系。 缺点:由于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。而在有些情况下,一些执行路径是不可能被执行的,如: If (!A)B++; If (!C)D--; 这两个语句实际只包括了2条执行路径,即A和C为真或假时候对B和D的处理,真或假不可能都存在,而路径覆盖测试则认为是包含了真与假的4条执行路径。这样不仅降低了测试效率,而且大量的测试结果的累积,也为排错带来麻烦。 练习1 求解一元二次方程程序如下: main() {float a,b,c,x1,x2,mid; scanf(“%f,%f,%f”,a,b,c); if(a!=0) {mid=b*b-4*a*c; if(mid0) {x1=(-b+sqrt(mid))/(2*a); x2=(-b-sqrt(mid))/(2*a); printf(“two real roots\n”);} else{ if(mid==0) {x1=-b/2*a; printf(“one real root\n”);} else{x1=-b/(2*a);
文档评论(0)