软件测试章节知识点总结

                **

软件测试方法知识总结

**
一、第一章
1.为什么要进行软件测试
(1)软件测试是软件质量保证的关键步骤。
(2)目的:尽可能发现并排除软件中潜藏的错误,提高软件的可靠性。
2.测试驱动开发的思想
(1)在开发功能代码之前,先编写测试代码,然后只编写使测试通过的功能代码,从而以测试来驱动整个开发过程的进行。这有助于编写简洁可用和高质量的代码,有很高的灵活性和健壮性,能快速响应变化,并加速开发过程。
3.软件测试的分类
软件测试分类
4.为什么要进行软件测试用例设计?
(1)为了更有效的进行测试,需要考虑各种软件使用的场景和操作路径,设计出最有可能发现缺陷的用例。
5.软件测试的原则有哪些?
(1)测试显示缺陷的存在
(2)穷尽测试是不可能的
(3)测试的尽早介入
(4)缺陷的集群性
(5)杀虫剂悖论
(6)测试活动依赖于测试内容

二、第三章
1.等价类划分法
1.1有效等价类
对于程序规格来说合理的、有意义的输入数据的集合,检验程序是否实现了规格说明中的功能和性能。
1.2无效等价类
不合理的、无意义的输入数据集合,验证程序处理意外数据的能力。
1.3划分方法
划分等价类时,可分为按区间划分、按数值划分、按数值集合划分、按限制条件和规则划分、按处理方式划分。除了应掌握必须使同类数据的处理过程及处理结果完全一致的大原则,可参考以下划分方法:
1) 输入条件规定了取值范围或值的个数的情况下,可以确定一个有效等价类和两个无效等价类,如合格成绩取值范围为[60,100],则范围内取值为有效等价类,范围外<60和>100为无效等价类
2) 输入条件规定了输入值的集合或“必须如何”的情况下,可以确定一个有效等价类和一个无效等价类,如:规定数据库类型必须选择oracle,则选择oracle时为有效等价类,否则为无效等价类
3) 输入条件是一个布尔量的情况下,可以确定一个有效等价类和一个无效等价类
4) 输入条件规定必须遵守某种规则的情况下,可以确定一个有效等价类和若干个无效等价类(从不同角度违法规则),如:规定输入必须为非0正整数,则无效等价类可以分为空、0、负整数、小数、字符等
5) 在规定了输入数据的一组值(假定N个),并且程序要对每个输入值分别处理的情况下,可以确立N个有效等价类和一个无效等价类。如下列框选择“科目”,每个科目所显示的信息不同。
6) 在确知已划分的等价类中各元素在程序处理的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类
7)等价类划分表例:
这里写图片描述

(3)一个程序读入3个整数,把这三个数值看作一个三角形的3条边的长度值。这个程序要打印出信息,说明这个三角形是不等边的、是等腰的、还是等边的。”
  我们可以设三角形的3条边分别为A,B,C。如果它们能够构成三角形的3条边,必须满足:
  A>0,B>0,C>0,且A+B>C,B+C>A,A+C>B。
  如果是等腰的,还要判断A=B,或B=C,或A=C。
  如果是等边的,则需判断是否A=B,且B=C,且A=C。

根据以上分析,从而得到下图列表中的测试用例。
这里写图片描述
这里写图片描述
2.边界值分析法
(1)在边界测试中,对于有n个输入变量的程序,基本边界值分析的测试用例个数为4n+1。
(2)在健壮性测试中,对于有n个输入变量的程序,健壮性测试的测试用例个数为6n+1。
(3)对于有n个输入变量的程序,最坏情况测试的测试用例个数为5^n。
(4)对于有n个输入变量的程序,健壮最坏情况测试的测试用例个数为7^n
1) 如果输入条件规定了值的范围,则应取刚达到这个范围的边界值、以及刚超越这个范围边界的值作为测试输入数据
2) 如果输入条件规定了值的个数,则选取最大个数、最小个数、比最大个数多一、比最小个数少1的数作为测试数据
3) 根据规格说明的每个输出条件,使用规则1)
4) 根据规格说明的每个输出条件,使用规则2)
5) 若输入域是有序集合,则选取集合的第一个元素和最后一个元素作为测试用例
6) 如果程序使用了1个内部数据结构,则应当选择内部数据结构上的边界值作为测试用例。
7) 分析规格说明,找出其他可能的边界条件
8)现有一个学生标准化考试批阅试卷,产生成绩报告的程序。其规格说明如下:程序的输入文件由一些有80个字符的记录组成,如右图所示,所有记录分为3组:
这里写图片描述
标题:这一组只有一个记录,其内容为输出成绩报告的名字。
试卷各题标准答案记录:每个记录均在第80个字符处标以数字"2"。该组的第一个记录的第1至第3个字符为题目编号(取值为1一999)。第10至第59个字符给出第1至第50题的答案(每个合法字符表示一个答案)。该组的第2,第3……个记录相应为第51至第100,第101至第150,…题的答案。
每个学生的答卷描述:该组中每个记录的第80个字符均为数字"3"。每个学生的答卷在若干个记录中给出。如甲的首记录第1至第9字符给出学生姓名及学号,第10至第59字符列出的是甲所做的第1至第50题的答案。若试题数超过50,则第2,第3……纪录分别给出他的第51至第100,第101至第150……题的解答。然后是学生乙的答卷记录。
学生人数不超过200,试题数不超过999。
程序的输出有4个报告:
a)按学号排列的成绩单,列出每个学生的成绩、名次。
b)按学生成绩排序的成绩单。
c)平均分数及标准偏差的报告。
d)试题分析报告。按试题号排序,列出各题学生答对的百分比。
分别考虑输入条件和输出条件,以及边界条件。给出右表所示的输入条件及相应的测试用例。
这里写图片描述
输入条件 测试用例说明 测试数据 期望结果 选取理由
身份证长度及类型 1个数字字符 2 显示无效 仅有一个合法字符
10个数字字符 1234567890 显示无效 仅有10个合法字符
15个数字字符 201519090123456 显示无效 比有效长度少3
18个数字字符 410621199709284511 显示有效 类型及长度有效
这里写图片描述
3.因果图法
(1)原理:用图解的方法表示输入的各种组合关系,写出判定表,从而设计相应的测试用例。
4.软件测试的覆盖方法
  一、语句覆盖(Statement Coverage)
  语句覆盖,顾名思义就是针对代码语句的嘛。它的含义是我们设计出来的测试用例要保证程序中的每一个语句至少被执行一次。通常语句覆盖被认为是“最弱的覆盖”,原因是它仅仅考虑对代码中的执行语句进行覆盖而没有考虑各种条件和分支,因此在实际运用中语句覆盖很难发现代码中的问题。举个非常简单的例子:
  public int foo(int a,int b)
  {
  return a/b;
  }
  这是一个求两数之商的函数。如果我们设计如下的测试用例:
  TestCase: a = 2, b = 1
  这时候我们会发现,该函数的代码覆盖率达到了100%,并且设计的case可以顺利通过测试。但是显然该函数有一个很明显的bug:当 b=0 时,会抛出异常。
  二、判定覆盖(Decision Coverage)
  判定覆盖也被成为分支覆盖(Branch Coverage),也就是说设计的测试用例要保证让被测试程序中的每一个分支都至少执行一次。举个例子,有如下流程图:
这里写图片描述
  针对该图我们想要做到判定覆盖,可以设计如下case:
  TestCase1: a=1, b=1 (路径:ab)
  TestCase2: a=-1, b=-1 (路径:acd)
  TestCase3: a=2, b=-1 (路径:ace)
  判定覆盖比语句覆盖强一些,能发现一些语句覆盖无法发现的问题。但是往往一些判定条件都是由多个逻辑条件组合而成的,进行分支判断时相当于对整个组合的最终结果进行判断,这样就会忽略每个条件的取值情况,导致遗漏部分测试路径。
  三、条件覆盖(Condition Coverage)
  条件覆盖于分支覆盖不同,条件覆盖要求所设计的测试用例能使每个判定中的每一个条件都获得可能的取值,即每个条件至少有一次真值、有一次假值。
  仍然以上面流程图作为例子来说明。上图中涉及到的条件一共有4个:
  a>0, a<0, b>0, b<0
  为了达到条件覆盖的目的,我们设计的用例需要在 a 点有:
  a>0, a≤0, b>0, b≤0,
  这些情况出现,并且在 c 点有:
  a<0, a≥0, b<0, b≥0
  这些情况出现。现在可以设计如下用例:
  TestCase1: a=1, b=1 (路径:ab)
  TestCase1: a=-1, b=-1 (路径:acd)
  TestCase1: a=-1, b=0 (路径:ace)
  TestCase1: a=1, b=-1 (路径:ace)
  通常而言条件覆盖比判定覆盖强,因为条件覆盖使得判定中的每一个条件都取到了不同的结果,这一点判定覆盖则无法保证。但条件覆盖也有缺陷,因为它只能保证每个条件都取到了不同结果,但没有考虑到判定结果,因此有时候条件覆盖并不能保证判定覆盖。
  四、判定条件覆盖(Decision/Condition Coverage)
  判定条件覆盖,说白了就是我们设计的测试用例可以使得判断中每个条件所有的可能取值至少执行一次(条件覆盖),同时每个判断本身所有的结果也要至少执行一次(判定覆盖)。不难发现判定条件覆盖同时满足判定覆盖和条件覆盖,弥补了两者各自的不足,但是判定条件覆盖并未考虑条件的组合情况。
  五、组合覆盖(Branch Condition Combination Coverage)
  组合覆盖也叫做条件组合覆盖。意思是说我们设计的测试用例应该使得每个判定中的各个条件的各种可能组合都至少出现一次。显然,满足条件组合覆盖的测试用例一定是满足判定覆盖、条件覆盖和判定条件覆盖的。
  针对前文提到的流程图,做条件组合覆盖时我们可以设计如下用例:
  TestCase1: a=1, b=1 (路径:ab)
  TestCase1: a=-1, b=-1 (路径:acd)
  TestCase1: a=-1, b=0 (路径:ace)
  TestCase1: a=1, b=-1 (路径:ace)
  条件组合覆盖能够同时满足判定、条件和判定条件覆盖,覆盖度较高,但是组合覆盖的测试用例数量相对来说也是比较多的。
  六、路径覆盖
  路径覆盖,意思是说我们设计的测试用例可以覆盖程序中所有可能的执行路径。这种覆盖方法可以对程序进行彻底的测试用例覆盖,比前面讲的五种方法覆盖度都要高。那么这种方法是不是就一定最好呢?当然不能讲得这么绝对,它的缺点也是显而易见的:由于需要对所有可能的路径全部进行覆盖,那么我们需要设计数量非常巨大的而且较为复杂的测试用例,用例数量将呈现指数级的增长。所以理论上来讲路径覆盖是最彻底的测试用例覆盖,但实际上很多时候路径覆盖的可操作性不强。

5,.圈复杂度
(1)圈复杂度是一种衡量代码复杂程度的标准
(2)圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n
  e : 控制流图中边的数量
  n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)
6.静态测试和动态测试
(1)静态测试
静态测试:静态测试是指不运行被测程序本身,通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。
(2)动态测试
通过运行被测程序来检查运行结果与预期结果的差异,并分析运行效率和健壮性等指标;这种方法包括三部分:构造测试用例、执行程序、分析程序的输出结果。
7.系统源码—>测试过程
8.模块->系统—>安全性测试部署安装
三、第五章
1.单元测试
(1)概念:单元测试是对软件基本组成单元进行的测试,而且软件单元是在与程序的其他部分相隔离的情况下进行独立的测试。
(2)单元测试工具:Junit、CppUnit、NUnit、GoogleTest。
(3)断言语句
这里写图片描述
(4)注解语句
这里写图片描述
2.集成测试的模式和集成方法
(1)模式分类;
①非渐增式测试模式:先分别测试每个模块,再把每个模块按设计要求放在一起结合成所要的程序。如大棒模式。
②渐增式测试模式:把下一个要测试的模块同已经测试好的模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合起来进行测试。
(2)方法:
①自顶向下法:
采用了和设计一样的顺序对系统进行测试,在第一时间内对系统的控制接口进行了验证。
1)方法(策略)
a. 以主模块为所测模块兼驱动模块,所有直属于主模块的下属模块全部用桩模块替换,对主模块进行测试;
b.采用深度优先(Depth-First)或者宽度优先(Breath-First)的策略,用实际模块替换相应桩模块,再用桩替代它们的直接下属模块,与已测试的模块或子系统组装成新的子系统;
c.进行回归测试,排除组装过程中引起的错误的可能;
d.判断所有的模块是否都已组装到系统中?如果是,则结束测试,否则转到b步骤去执行。
2)目的
从顶层控制开始,采用同设计顺序一样的思路对被测系统进行测试,以验证系统的接口稳定性。
3)优点
a.自顶向下的增殖方式在测试过程中较早的验证了主要的控制和判断点;
b.功能可行性较早得到证实,还能够给开发者和用户带来成功的信心;
c.最多只需要一个驱动模块,减少了驱动器开发的费用;
d.由于和设计顺序的一致性,可以和设计并行进行,如果目标环境可能存在改变,该方法可以灵活的适应;
e.支持故障隔离。

注:
内容部分参考自:
(1)http://www.51testing.com/html/44/n-3713444.html
(2)http://wiki.jikexueyuan.com/project/junit/using-assertion.html

发布了32 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Evan_love/article/details/78692142
今日推荐