软件测试

内容纲要

软件测试实验

深刻理解软件测试的目的,熟知软件测试的基本方法和基本策略。学会使用CASE工具完成软件测试用例的设计以及初步完成单元测试,在此基础上深刻理解单元测试的基本原理及测试类CASE工具的基本使用。

一、实验内容

1 、单元测试的逻辑覆盖测试验证实验

运用Nunit等工具完成对如下例子的单元测试,要求分别完成语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖和路径覆盖测试的测试用例编写以及测试。要求首先按格式编写出该测试所需要的测试用例,然后编写测试程序,对其进行测试,最后把你写的测试用例按格式记录到实验报告中。

测试用例的格式如下:

{[输入], [期望结果]},对于本例请遵循如下格式:

{[A,B,X],[X]}

image-20230426192415309

此外,请测试如下情况:

(1). 如果将第1个判定中的“AND”错写成了“OR”,用数据{[2,0,3],[2.5]}(首先,该组数据满足何种逻辑覆盖)对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第1个判定中的“AND”错写成了“OR”,那么当输入数据为{[2,0,3],[2.5]}时,第一个判断条件将变为(A>1)or(B=0)。由于A=2,所以该条件为真,程序将执行x=x/a,即x=3/2=1.5。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A=2,所以该条件为真,程序将执行x=x+1,即x=1.5+1=2.5。因此,测试结果与期望结果相同,无法发现错误。

(2). 如果将第2个判定中的“x>1”错写成了“x<=1”,则用数据{[2,0,3],[2.5]}对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第2个判定中的“x>1”错写成了“x<=1”,那么当输入数据为{[2,0,3],[2.5]}时,第一个判断条件为(A>1)and(B=0)。由于A=2且B=0,所以该条件为真,程序将执行x=x/a,即x=3/2=1.5。接下来,程序将进入第二个判断条件(A=2)or(x<=1),由于A=2,所以该条件为真,程序将执行x=x+1,即x=1.5+1=2.5。因此,测试结果与期望结果相同,无法发现错误。

(3). 如果将第1个判定中的“AND”错写成了“OR”,则用数据{[3,0,1],[1/3]}和{[2,1,2],[3]}(首先,该组数据满足何种逻辑覆盖)对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第1个判定中的“AND”错写成了“OR”,那么当输入数据为{[3,0,1],[1/3]}时,第一个判断条件将变为(A>1)or(B=0)。由于A=3且B=0,所以该条件为真,程序将执行x=x/a,即x=1/3。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A≠2且x≤1,所以该条件为假,程序将直接进入下一步。因此,测试结果与期望结果相同。

当输入数据为{[2,1,2],[3]}时,第一个判断条件将变为(A>1)or(B=0)。由于A=2且B≠0,所以该条件为真,程序将执行x=x/a,即x=2/2=1。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A=2且x≤1,所以该条件为真,程序将执行x=x+1,即x=1+1=2。因此,测试结果与期望结果不同,可以发现错误。

这两组数据分别满足了条件覆盖和决策覆盖。

如果将第2个判定中的“x>1”错写成了“x<=1”,则用数据{[3,0,1],[1/3]}和{[2,1,2],[3]})对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第2个判定中的“x>1”错写成了“x<=1”,那么当输入数据为{[3,0,1],[1/3]}时,第一个判断条件为(A>1)and(B=0)。由于A=3且B=0,所以该条件为真,程序将执行x=x/a,即x=1/3。接下来,程序将进入第二个判断条件(A=2)or(x<=1),由于A≠2且x≤1,所以该条件为真,程序将执行x=x+1,即x=1/3+1=4/3。因此,测试结果与期望结果不同,可以发现错误。

当输入数据为{[2,1,2],[3]}时,第一个判断条件为(A>1)and(B=0)。由于A=2且B≠0,所以该条件为假,程序将直接进入下一步。接下来,程序将进入第二个判断条件(A=2)or(x<=1),由于A=2且x>1,所以该条件为真,程序将执行x=x+1,即x=2+1=3。因此,测试结果与期望结果相同。

这两组数据分别满足了条件覆盖和决策覆盖。

(4). 如果将第2个判定中的“x>1”错写成了“x<=1”,则用数据{[2,0,3],[2.5]}和{[1,1,1],[1]}(首先,该组数据满足何种逻辑覆盖)对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第2个判定中的“x>1”错写成了“x<=1”,那么当输入数据为{[2,0,3],[2.5]}时,第一个判断条件为(A>1)and(B=0)。由于A=2且B=0,所以该条件为真,程序将执行x=x/a,即x=3/2=1.5。接下来,程序将进入第二个判断条件(A=2)or(x<=1),由于A=2且x>1,所以该条件为真,程序将执行x=x+1,即x=1.5+1=2.5。因此,测试结果与期望结果相同。

当输入数据为{[1,1,1],[1]}时,第一个判断条件为(A>1)and(B=0)。由于A≠2且B≠0,所以该条件为假,程序将直接进入下一步。接下来,程序将进入第二个判断条件(A=2)or(x<=1),由于A≠2且x≤1,所以该条件为真,程序将执行x=x+1,即x=1+1=2。因此,测试结果与期望结果不同,可以发现错误。

这两组数据分别满足了条件覆盖和决策覆盖。

(5). 如果将第1个判定中的“a>1”错写成了“a<=1”,且把“b=0”错写成了“b<>0”,则用数据{[2,1,1],[2]}和{[1,0,2],[3]}对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第1个判定中的“a>1”错写成了“a<=1”,且把“b=0”错写成了“b<>0”,那么当输入数据为{[2,1,1],[2]}时,第一个判断条件将变为(A<=1)or(B<>0)。由于A=2且B≠0,所以该条件为真,程序将执行x=x/a,即x=1/2=0.5。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A=2且x≤1,所以该条件为真,程序将执行x=x+1,即x=0.5+1=1.5。因此,测试结果与期望结果不同,可以发现错误。

当输入数据为{[1,0,2],[3]}时,第一个判断条件将变为(A<=1)or(B<>0)。由于A≤1且B=0,所以该条件为真,程序将执行x=x/a,即x=2/1=2。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A≠2且x>1,所以该条件为真,程序将执行x=x+1,即x=2+1=3。因此,测试结果与期望结果相同。

这两组数据分别满足了条件覆盖和决策覆盖。

(6). 如果将第1个判定中的“a>1”错写成了“a<=1”,且把“b=0”错写成了“b<>0”,则用数据{[2,1,1],[2]}、{[2,0,2],[2]}、{[1,1,1],[1]}和{[1,0,2],[3]}对程序进行测试,可否发现错误?为什么? 请先测试,然后把结论记录到实验报告中。

如果将第1个判定中的“a>1”错写成了“a<=1”,且把“b=0”错写成了“b<>0”,那么当输入数据为{[2,1,1],[2]}时,第一个判断条件将变为(A<=1)or(B<>0)。由于A=2且B≠0,所以该条件为真,程序将执行x=x/a,即x=1/2=0.5。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A=2且x≤1,所以该条件为真,程序将执行x=x+1,即x=0.5+1=1.5。因此,测试结果与期望结果不同,可以发现错误。

当输入数据为{[2,0,2],[2]}时,第一个判断条件将变为(A<=1)or(B<>0)。由于A=2且B=0,所以该条件为假,程序将直接进入下一步。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A=2且x≤1,所以该条件为真,程序将执行x=x+1,即x=2+1=3。因此,测试结果与期望结果不同,可以发现错误。

当输入数据为{[1,1,1],[1]}时,第一个判断条件将变为(A<=1)or(B<>0)。由于A≤1且B≠0,所以该条件为真,程序将执行x=x/a,即x=1/1=1。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A≠2且x≤1,所以该条件为假,程序将直接进入下一步。因此,测试结果与期望结果相同。

当输入数据为{[1,0,2],[3]}时,第一个判断条件将变为(A<=1)or(B<>0)。由于A≤1且B=0,所以该条件为真,程序将执行x=x/a,即x=2/1=2。接下来,程序将进入第二个判断条件(A=2)or(x>1),由于A≠2且x>1,所以该条件为真,程序将执行x=x+1,即x=2+1=3。因此,测试结果与期望结果相同。

这四组数据分别满足了语句覆盖、分支覆盖、条件覆盖和决策覆盖。

经过上述的测试过程,你有什么体会,请写到实验报告中!

语句覆盖、分支覆盖、条件覆盖和决策覆盖都是白盒测试中的代码覆盖率技术。

语句覆盖是指在测试时,设计若干个测试用例,然后运行被测程序,使得程序中每条语句至少被执行一次。它要求测试用例要覆盖所有的语句¹。

分支覆盖(也称为判定覆盖)是指在测试时,设计若干个测试用例,然后运行被测程序,使得每个判断本身的判定结果也至少出现一次。它要求对来自代码模块(语句或循环)的每个结果进行测试¹。

条件覆盖是指在测试时,设计若干个测试用例,然后运行被测程序,使得判断中每个条件的所有可能至少出现一次。它要求覆盖软件应用程序的每个可能路径(if-else和其他条件循环)¹。

决策/条件覆盖是指在测试时,设计若干个测试用例,然后运行被测程序,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次¹。

这四种技术都旨在通过测试用例来验证程序中的所有分支和条件,以确保程序的正确性。

2 、循环结构测试

现有一个简单循环,需要对其进行测试,其程序伪代码如下:

Int i,a;
Input(i,a);
While(i<=10)
{
a += 2;
if(a>4)
{
a *= 2;
a += 3;
}
Else
{
If(a>1)
a -= 4;
else
a += 5;
}
i++;
}
a *=4;
Output(a);

要求为该程序设计 满足简单循环的所有测试用例 ,记录到实验报告中。

1. 当输入i=0,a=0时,程序将执行while循环11次。在第一次循环中,a的值将增加2,变为2。由于a≤4,所以程序将进入else分支。由于a>1,所以a的值将减少4,变为-2。接下来,i的值将增加1,变为1。在第二次循环中,a的值将增加2,变为0。由于a≤4,所以程序将进入else分支。由于a≤1,所以a的值将增加5,变为5。接下来,i的值将增加1,变为2。在第三次循环中,a的值将增加2,变为7。由于a>4,所以程序将进入if分支。a的值将乘以2再加3,变为17。接下来,i的值将增加1,变为3。在剩余的循环中,程序将重复上述过程,并在最后一次循环后退出while循环。最后,a的值将乘以4,变为2720。因此,当输入i=0,a=0时,输出结果为2720。

2. 当输入i=5,a=3时,程序将执行while循环6次。在第一次循环中,a的值将增加2,变为5。由于a>4,所以程序将进入if分支。a的值将乘以2再加3,变为13。接下来,i的值将增加1,变为6。在剩余的循环中,程序将重复上述过程,并在最后一次循环后退出while循环。最后,a的值将乘以4,变为2080。因此,当输入i=5,a=3时,输出结果为2080。

3. 当输入i=11, a=6时, 程序不会执行while循环. 最后, a 的值会乘以 4, 变成 24. 因此, 当输入 i=11, a=6 时, 输出结果是 24.

3 、等价类划分及边界值测试的验证实验

有如下算法A和B均是非负整型变量(注:int型)

如果10<A<100,则B=A*20-5,如果0<A<=10,则B=A*15+20,如果A>=100,则B=A*100-200

请分别用等价类划分方法和边界值分析方法设计测试用例,然后编写测试程序完成测试。并把测试结论写入到实验报告中。

根据等价类划分方法,我们可以将输入数据A划分为三个等价类:A<0,0≤A≤10,10<A<100和A≥100。

  1. 当A<0时,程序没有定义输出结果。因此,这种情况不需要测试。
  2. 当0≤A≤10时,可以选择A=5作为代表性值。根据算法,B=5*15+20=95。因此,当输入A=5时,输出结果应为95。
  3. 当10<A<100时,可以选择A=50作为代表性值。根据算法,B=50*20-5=995。因此,当输入A=50时,输出结果应为995。
  4. 当A≥100时,可以选择A=150作为代表性值。根据算法,B=150*100-200=14800。因此,当输入A=150时,输出结果应为14800。

根据边界值分析方法,可以选择输入数据A的边界值来设计测试用例。

  1. 当A=0时,根据算法,B=0*15+20=20。因此,当输入A=0时,输出结果应为20。
  2. 当A=10时,根据算法,B=10*15+20=170。因此,当输入A=10时,输出结果应为170。
  3. 当A=11时,根据算法,B=11*20-5=215。因此,当输入A=11时,输出结果应为215。
  4. 当A=99时,根据算法,B=99*20-5=1985。因此,当输入A=99时,输出结果应为1985。
  5. 当A=100时,根据算法,B=100*100-200=9800。因此,当输入A=100时,输出结果应为9800。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注