问题描述
使用白盒测试用例设计方法为下面的程序设计测试用例(基本路径测试)并Junit下测试:
程序要求
10个铅球中有一个假球(比其他铅球的重量要轻),用天平三次称出假球。
程序设计思路
第一次使用天平分别称5个球,判断轻的一边有假球;
拿出轻的5个球,取出其中4个第二次称,两边分别放2个球:
如果两边同重,则剩下的球为假球;
若两边不同重,拿出轻的两个球称第三次,轻的为假球。
程序代码
package com.softtest.baihe;
public class SearchBall {
private static int x[]=new int[10];
public SearchBall(){}
public void setBWeight(int w[]){
for(int i=0;i<w.length;i++){
x[i]=w[i];
}
}
public String BeginSearch(){
if(x[0]+x[1]+x[2]+x[3]+x[4]<x[5]+x[6]+x[7]+x[8]+x[9]){
if(x[1]+x[2]==x[3]+x[4]){
return "1号是假球";
}
if(x[1]+x[2]<x[3]+x[4]){
if (x[1]<x[2]) {
return "2号是假球";
}else {
return "3号是假球";
}
}else {
if (x[3]<x[4]){
return "4号是假球";
}
else{
return "5号是假球";
}
}
}else {
if(x[6]+x[7]==x[8]+x[9]){
return "6号是假球";
}
if(x[6]+x[7]<x[8]+x[9]) {
if (x[6]<x[7]) {
return "7号是假球";
}else {
return "8号是假球";
}
}else {
if (x[8]<x[9]) {
return "9号是假球";
}else {
return "10号是假球";
}
}
}
}
}
程序控制流图
Y代表判定结果为真,N代表判定结果为假。
简化后的控制流图
计算环形复杂度
控制流图G的环形复杂度计算公式:$ V(G)=E−N+2 $,其中E为控制流图中边的数量,N是控制流图中的结点数量。
函数BeginSearch()
的控制流图的环形复杂度为
V
(
G
)
=
18
−
19
+
2
=
1
V(G)=18−19+2=1
V(G)=18−19+2=1
基本路径
从程序流图中可知,共有10条基本路径,具体如下
路径编号 | 经过结点 |
---|---|
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 |
测试用例
路径 | 测试用例 | 预期结果 | 测试结果 |
---|---|---|---|
1 | 1,2,2,2,2,2,2,2,2,2 | 1号是假球 | 1号是假球 |
2 | 2,1,2,2,2,2,2,2,2,2 | 2号是假球 | 2号是假球 |
3 | 2,2,1,2,2,2,2,2,2,2 | 3号是假球 | 3号是假球 |
4 | 2,2,2,1,2,2,2,2,2,2 | 4号是假球 | 4号是假球 |
5 | 2,2,2,2,1,2,2,2,2,2 | 5号是假球 | 5号是假球 |
6 | 2,2,2,2,2,1,2,2,2,2 | 6号是假球 | 6号是假球 |
7 | 2,2,2,2,2,2,1,2,2,2 | 7号是假球 | 7号是假球 |
8 | 2,2,2,2,2,2,2,1,2,2 | 8号是假球 | 8号是假球 |
9 | 2,2,2,2,2,2,2,2,1,2 | 9号是假球 | 9号是假球 |
10 | 2,2,2,2,2,2,2,2,2,1 | 10号是假球 | 10号是假球 |
测试代码
public class SearchBallTests {
@Test
public void test1() {
SearchBall obj = new SearchBall();
int[] input;
int ballIndex;
// 遍历测试各个基本路径
for (int i = 0; i < 10; ++i) {
// 生成用例输入
input = new int[]{2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
input[i] = 1;
obj.setBWeight(input);
// 测试用例输出
ballIndex = i + 1;
assertEquals(ballIndex + "号是假球", obj.BeginSearch());
}
}
}