实验二+085
一、实验目的
掌握基于覆盖理论与基本路径的基本白盒测试方法和实践
二、实验要求
运用逻辑覆盖测试的覆盖准则设计被测程序的测试用例,并运行测试用例检查程序的正确与否,给出程序缺陷小结。
三、实验内容
被测代码
1 import java.util.InputMismatchException; 2 import java.util.Scanner; 3 4 public class TestDemo { 5 6 public static String Triangle(int side1,int side2,int side3) 7 { 8 int temp; 9 if(side1>side2) //排个序让小数在前,大数在后 10 {temp=side1;side1=side2;side2=temp;} 11 if(side2>side3) 12 {temp=side2;side2=side3;side3=temp;} 13 14 String result="三角形"; 15 if(side1+side2<=side3) 16 return "不构成"+result; 17 else if(side1==side2 && side2==side3) 18 return "等边"+result; 19 else if(side1==side2 || side2==side3 || side1==side3) 20 return "等腰"+result; 21 else if(side1*side1+side2*side2==side3*side3) 22 return "直角"+result; 23 else 24 return "普通"+result; 25 } 26 27 public static boolean Check(int num) //检验输入的数据是否属于[1,100] 28 { 29 if(num<1 || num>100) 30 { 31 System.out.println("边的值不在范围内!"); 32 return false; 33 } 34 return true; 35 } 36 37 public static void main(String[] args) 38 { 39 while(true) 40 { 41 Scanner scanner=new Scanner(System.in); 42 int side1=0,side2=0,side3=0; 43 boolean flag=true; //用于标记输入的数据是否合法 44 System.out.println("请输入三角形的三条边"); 45 try{ //捕获输入异常 46 side1=scanner.nextInt(); 47 side2=scanner.nextInt(); 48 side3=scanner.nextInt(); 49 } 50 catch(InputMismatchException e) //显示输入异常 51 { 52 flag=false; 53 System.out.println("请输入整数!"); 54 } 55 if(flag) //若输入有误则直接退出 56 if(Check(side1) && Check(side2) && Check(side3)) 57 System.out.println(Triangle(side1,side2,side3)); 58 } 59 } 60 }
Triangle()方法的控制流图如下
通过对控制流图的分析后知至少需要2x2x5=20组测试样例,因此设计的测试用例表如下
Junit 测试脚本、执行结果
这里直接使用参数化测试方法
1 import static org.junit.Assert.*; 2 3 import java.util.Arrays; 4 import java.util.Collection; 5 import org.junit.Before; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.junit.runners.Parameterized; 9 import org.junit.runners.Parameterized.Parameters; 10 11 @RunWith(Parameterized.class) 12 13 public class TestDemoTest { 14 private static TestDemo testcase=new TestDemo(); 15 16 private int side1,side2,side3; 17 private String result; 18 19 @Before 20 public void setUp() throws Exception { 21 } 22 23 //参数存储 24 @Parameters 25 public static Collection Data() 26 { 27 return Arrays.asList(new Object[][]{ 28 {5,2,1,"不构成三角形"}, 29 {3,3,3,"等边三角形"}, 30 {5,3,5,"等腰三角形"}, 31 {5,4,3,"直角三角形"}, 32 {10,6,5,"普通三角形"}, 33 {5,3,1,"不构成三角形"}, 34 {3,1,5,"不构成三角形"}, 35 {3,5,1,"不构成三角形"}, 36 {1,3,5,"不构成三角形"}, 37 {5,5,5,"等边三角形"}, 38 {5,5,6,"等腰三角形"}, 39 {4,5,5,"等腰三角形"}, 40 {4,3,4,"等腰三角形"}, 41 {4,4,3,"等腰三角形"}, 42 {8,6,10,"直角三角形"}, 43 {8,10,6,"直角三角形"}, 44 {3,4,5,"直角三角形"}, 45 {5,7,10,"普通三角形"}, 46 {10,7,5,"普通三角形"}, 47 {5,10,7,"普通三角形"}, 48 }); 49 50 } 51 52 //构造函数 53 public TestDemoTest(int side1,int side2,int side3,String result) 54 { 55 this.side1=side1; 56 this.side2=side2; 57 this.side3=side3; 58 this.result=result; 59 } 60 61 @Test 62 public void testTriangle() { 63 assertEquals(result, testcase.Triangle(side1, side2, side3)); 64 } 65 66 }
测试结果
上面使用的是参数化测试,所以下面只给出打包测试脚本
1 import static org.junit.Assert.*; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 import org.junit.runner.RunWith; 6 import org.junit.runners.Suite; 7 import org.junit.runners.Suite.SuiteClasses; 8 9 @RunWith(Suite.class) 10 @Suite.SuiteClasses({ 11 TestDemoTest.class 12 }) 13 14 public class pakageTest { 15 16 @Before 17 public void setUp() throws Exception { 18 } 19 }
打包测试结果
四、测试小结:
代码能够通过所有测试用例,未发现缺陷
通过实验掌握了单元测试中常用的普通测试、参数化测试、打包测试等测试方法,尤其后面两个测试方法更加高效与便捷。