《白盒测试用例设计ppt课件.ppt》由会员分享,可在线阅读,更多相关《白盒测试用例设计ppt课件.ppt(73页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物课程名称:白盒测试用例设计主讲教师:王红亮我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物章节内容 覆盖测试2 最少测试用例数计算4 白盒测试的基本概念3 1 路径测试3 3我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 为什么要进行白盒测试? 如果所有软件错误的根源都可以追溯到某个唯
2、一原因,那么问题就简单了。然而,事实上一个bug 常常是由多个因素共同导致的,如下图所示。 假设此时开发工作已结束,程序送交到测试组,没有人知道代码中有一个潜在的被 0 除的错误。若测试组采用的测试用例的执行路径没有同时经过x=0和y=5/x进行测试,显然测试工作似乎非常完善,测试用例覆盖了所有执行语句,也没有被 0 除的错误发生。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 白盒测试也称结构测试或逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。 它根据程序的控制结构设计测试用例,主要用于软件或程
3、序验证。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 白盒测试法检查程序内部逻辑结构,对所有逻辑路径进行测试,是一种穷举路径的测试方法。但即使每条路径都测试过了,仍然可能存在错误。因为:穷举路径测试无法检查出程序本身是否违反了设计规范,即程序是否是一个错误的程序。穷举路径测试不可能查出程序因为遗漏路径而出错。穷举路径测试发现不了一些与数据相关的错误。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 采用白盒测试方法必
4、须遵循以下几条原则,才能达到测试的目的:保证一个模块中的所有独立路径至少被测试一次。所有逻辑值均需测试真 (true) 和假 (false) 两种情况。检查程序的内部数据结构,保证其结构的有效性。在上下边界及可操作范围内运行所有循环。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 白盒测试主要是检查程序的内部结构、逻辑、循环和路径。常用测试用例设计方法有:逻辑覆盖法(逻辑驱动测试)基本路径测试方法我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没
5、有错:表里边有一个活的生物n由于测试路径可能非常多,由于时间和资源问题,选出足够多的路径测试n由于深入到程序编码,通常开发人员协助测试人员书写白盒测试用例我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物n在进行白盒测试之前,一定要根据说明书建立黑盒测试用例。用这种方式可以真正测试模块的用意。n如果先从模块的白盒子角度建立测试用例,就会受到代码和注释的影响,而忽略模块的真正意图。n白盒测试的局限我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:
6、表里边有一个活的生物测试覆盖率逻辑覆盖法测试覆盖准则我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 测试覆盖率:用于确定测试所执行到的覆盖项的百分比。其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。 测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高效果越好。但覆盖率不是目标,只是一种手段。 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 测试覆盖率包括功能
7、点覆盖率和结构覆盖率:功能点覆盖率大致用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等等。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 根据覆盖目标的不同,逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。语句覆盖:语句覆盖:选择足够多的测试用例,使得程序中的每个可执行语句至少执行一次。判定覆盖:判定覆盖:通过执行足够的测试用例,使得程序中的每个判定至少都获得一次“真”值和“假”值, 也就是使程序
8、中的每个取“真”分支和取“假”分支至少均经历一次,也称为“分支覆盖”。条件覆盖:条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物判定判定/条件覆盖:条件覆盖:设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。 满足判定/条件覆盖的测试用例一定同时满足判定覆盖和条件覆盖。组合覆盖:组合覆盖:通过执行足够的测试用例,使得程序
9、中每个判定的所有可能的条件取值组合取值组合都至少出现一次。 满足组合覆盖的测试用例一定满足判定覆盖、条件覆盖和判定/条件覆盖。路径覆盖:路径覆盖:设计足够多的测试用例,要求覆盖程序中所有可能的路径。 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物组合覆盖判断/条件覆盖判断覆盖条件覆盖语句覆盖我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 Console.WriteLine(Hello World!); if (Sys
10、tem.DateTime.Today.Day = 1 & System.DateTime.Today.Month = 1) Console.WriteLine(Happy New Year!); Console.WriteLine(System.DateTime.Today.ToShortDateString(); Console.ReadLine(); 语句覆盖是否完善?语句覆盖是否完善?我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物void DoWork (int x,int y,int z) int
11、 k=0,j=0; if ( (x3)&(z5) ) j=x*y+10; /语句块2 j=j%3; /语句块3下面画出流程图。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物X3 & z3 & z5X=4 | y5执行语句块执行语句块3 3F FF FT TT Ta ab bd dc ce e我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 要实现DoWork函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执
12、行语句。测试用例输入为: x=4、y=5、z=5 程序执行的路径是:abd 这样就够了吗?我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物测试用例输入为: x=4、y=5、z=5 程序执行的路径是:abd 分析: 语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在第一个判定(x3)&(z5错误写为y3)&(z3 取真值记为T1,取假值记为-T1 条件z5) ): 条件x=4 取真值记为T3,取假值记为-T3 条件y5 取真值记为T4,取假值记为-
13、T4我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 根据条件覆盖的基本思想,要使上述4个条件可能产生的8种情况至少满足一次,设计测试用例如下: 测试用例 执行路径 覆盖条件 覆盖分支 x=4、y=6、z=5 abd T1、T2、T3、T4 bd x=2、y=5、 z=15 ace -T1、-T2、 -T3、-T4 cen分析:上面这组测试用例不但覆盖了4个条件的全部8种情况,而且将两个判定的4个分支b、c、d、e也同时覆盖了,即同时达到了条件覆盖和判定覆盖。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把
14、它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 条件覆盖是否能包括判定覆盖?我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支c 和第二个判定的取真分支d,不满足判定覆盖的要求。 测试用例 执行路径 覆盖条件覆盖分支x=2、y=6、z=5 acd-T1、T2、 -T3、T
15、4 cdx=4、y=5、z=15 acdT1、-T2、 T3、-T4 cd我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 判定/条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。 根据判定/条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖4个条件的8种取值以及4个判定分支。 测试用例 执行路径 覆盖条件覆盖分支x=4、y=6、z=5 abdT1、T2、 T3、T4 bdx=2、y=5、z
16、=15ace-T1、-T2、 -T3、-T4 ce我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 是不是这样就够了?我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 分析:从表面上看,判定/条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定/条件覆盖也不一定能够完全检查出逻辑表达式中的错误。 例如:对于第一个判定(x3)&(z
17、3和z3为假,则编译器将不再检查z5)来说,若条件x=4满足,就认为该判定为真,这时将不会再检查y5,那么同样也无法发现这个条件中的错误。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 组合覆盖的目的是要使设计的测试用例能覆盖每一个判定的所有可能的条件取值组合。 对DoWork函数中的各个判定的条件取值组合加以标记: 1、x3, z3, z=10 记做T1 -T2, 第一个判定的取假分支 3、x=3, z10 记做-T1 T2, 第一个判定的取假分支 4、x=10 记做-T1 -T2,第一个判定的取假分支
18、 5、x=4, y5 记做T3 T4, 第二个判定的取真分支 6、x=4, y5 记做-T3 T4, 第二个判定的取真分支 8、x!=4, y8 AND Y5X0 OR Y0引用语句1引用语句2NYNYX16 OR Y10引用语句3NY我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 逻辑覆盖的出发点是合理的、完善的。所谓“覆盖”,就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。 例如:我们不小心将前面提到的程序段中的 if (x3 & Z=3 & Z10) 按照我们前面设计的测试用例(x的值取2
19、或4)来看,逻辑覆盖对这样的小问题都无能为力。分析出现这一情况的原因在于:错误区域仅仅在x=3这个点上,即仅当x的值取3时,测试才能发现错误。面对这类情况,我们应该从中吸取的教训是测试工作要有重点,要多针对容易发生问题的地方设计测试用例。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 ESTCA覆盖准则:在容易发生问题的地方设计测试用例,即重视程序中谓词(条件判断)的取值。 ESTCA覆盖准则是一套错误敏感用例分析规则。这一规则虽然并不完备,但在普通程序中却是有效的。原因在于这是一种经验型的覆盖准则,规则
20、本身针对了程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。具体规则如下: 规则1 对于A rel B型 (rel可以是) 的分支谓词,应适当的选择A与B的值,使得测试执行到该分支语句时,AB的情况分别出现一次。 这是为了检测逻辑符号写错的情况,如将“AB”。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物规则2 对于A rel C型 (rel可以是或, A是变量,C是常量)的分支谓词:当rel为时,应适当的选择A的值,使A=C+M。 这是为了检测“差1”之类的错误,如“
21、A1”错写成“A0”。规则3 对外部输入变量赋值,使其在每一个测试用例中均有不同的值与符号,并与同一组测试用例中其他变量的值与符号不同。 这是为了检测程序语句中的错误,如应该引用某一变量而错成引用另一个常量。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Goal: exercise each independent path at least once.Using the code, draw a corresponding flow graph (First drawing the activity d
22、iagram for the code may help, but is not required)Determine the cyclomatic complexitycyclomatic complexity of the flow graph.Determine a basis setbasis set of linearly independent paths.Prepare test casestest cases that forceforce the execution of each pathexecution of each path in the basis set.我吓了
23、一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Procedure: process records1.Do While records remain2.Read record;3.If record field 1 = 0 Then4.store in buffer;5.increment counter;6.Else If record field 2 = 0 Then7.reset counter;8.Else store in file;9.End If10.End If11. End DoEnd我吓了一
24、跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物1910112457836V(G) = 4V(G) = 4我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物12,387694,51011我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 V(G) =number of regions (areas bounded by nodes and edg
25、esarea outside the graph is also a region) V(G) = number of edges - the number of nodes + 2 V(G) = number of (simple) predicate nodes + 1 Cyclomatic complexity: Cyclomatic complexity: a quantitative measure of the logical complexity of code, provides an upper bound on the number of paths that need t
26、o be tested in the codeV(G)V(G)modulesmodulesmodules in this range are more error pronemodules in this range are more error prone 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物V(G)=412,378694,51011Region 1Region 2Region 3Region 4我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证
27、实我的猜测没有错:表里边有一个活的生物 Independent pathIndependent path any path that introduces at least one new set of processing statements or a new condition Basis setBasis set set of independent paths through the code Test casesTest cases derived from a basis set are guaranteed to execute every statement at least
28、 one time during testing Basis set is not uniquenot unique我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 Path1: 1-2-3-6-7-9-10-1-11 Path2: 1-2-3-6-8-9-10-1-11 Path3: 1-2-3-4-5-10-1-11Path4: 1-111910112458736我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物Bas
29、is path testing does not test all possible combinations of all paths through the code; it just tests every path at least once. you do not need an activity diagram, but the picture will help when you trace component paths count each logical testcompound tests count as the number of Boolean operators
30、+ 1 (i.e., count each simple predicate) basis path testing should be applied to all components, if possible, and to critical components always我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物实践 路径覆盖我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物基本路径测试方法void So
31、rt ( int iRecordNum, int iType )1 2 int x=0;3 int y=0;4 while ( iRecordNum- 0 )5 6 If ( iType=0 )7x=y+2;8 else9 If ( iType=1 )10 x=y+10;11 else12 x=y+20;13 14 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物基本路径测试方法(续) 画出控制流图: 如右图所示 计算环形复杂度: 10(条边)- 8(个节点)+ 2 = 4 导出独立路径(用语句编号表示)
32、路径1:414 路径2:46714 路径3:4691013414 路径4:4691213414467910121314我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物基本路径测试方法(续) 设计测试用例:我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物使用基本路径测试方法,为以下程序段设计测试用例。 void Do (int X,int A,int B) 1 if ( (A1)&(B=0) ) 2 X = X/A; 3
33、if ( (A=2)|(X1) ) 4 X = X+1; 5 我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物 从本质上说,循环测试的目的就是检查循环结构的有效性。 通常,循环可以划分为简单循环、嵌套循环、串接循环和 非结构循环4类。(1)测试简单循环。设其循环的最大次数为n ,可采用以下测试集:跳过整个循环;只循环一次;只循环两次;循环 m 次,其中m8 AND Y5X0 OR Y0引用语句1引用语句2NYNYX16 OR Y10引用语句3NY我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个
34、美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物2、某程序所画出的N-S图如右图所示的,至少需要多少个测试用例才能对该程序实现逻辑覆盖?我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物数据流测试设置使用对 Set-Use pair 对于每个变量或类成员,标识出赋值以及被使用的代码行对。这些就是Set-Use pair 。如果在赋值行后,使用行前,该数据又在其他行中被赋值,这两行就不是Set-Use pair。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里
35、呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物数据流测试阶乘程序Main() int i,n,f; printf(“n=”); scanf(“%d”,&n); if (n0) printf(“Invalid: %dn”,n); n=-1; else f=1; for(i=1;i=n;i+) f*=i; printf(“%d!=%d n”, n,f) return n;1.我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物实践模拟上例写一个n的m次方的程序,并找出所有pair 与覆盖用例。我吓了一跳,蝎子是多么丑恶和恐怖的东西,为什么把它放在这样一个美丽的世界里呢?但是我也感到愉快,证实我的猜测没有错:表里边有一个活的生物谢谢观看谢谢观看