软件测试(四)之 PrintPrimes

HOMEWORK 3

题目所给代码如下:

 1 /******************************************************* 
 2      * Finds and prints n prime integers 
 3      * Jeff Offutt, Spring 2003 
 4      ******************************************************/ 
 5     public static void printPrimes (int n) 
 6     { 
 7         int curPrime; // Value currently considered for primeness 
 8         int numPrimes; // Number of primes found so far. 
 9         boolean isPrime; // Is curPrime prime? 
10         int [] primes = new int [MAXPRIMES]; // The list of prime numbers. 
11         
12         // Initialize 2 into the list of primes. 
13         primes [0] = 2; 
14         numPrimes = 1; 
15         curPrime = 2; 
16         while (numPrimes < n) 
17         { 
18             curPrime++; // next number to consider ... 
19             isPrime = true; 
20             for (int i = 0; i <= numPrimes-1; i++) 
21             { // for each previous prime. 
22                 if (isDivisible(primes[i], curPrime)) 
23                 { // Found a divisor, curPrime is not prime. 
24                     isPrime = false; 
25                     break; // out of loop through primes. 
26                 } 
27             } 
28             if (isPrime) 
29             { // save it! 
30                 primes[numPrimes] = curPrime; 
31                 numPrimes++; 
32             } 
33         } // End while 
34         
35         // Print all the primes out. 
36         for (int i = 0; i <= numPrimes-1; i++) 
37         { 
38             System.out.println ("Prime: " + primes[i]); 
39         } 
40     } // end printPrimes

 

(a):控制流图如下(使用ProcessOn绘制)

 

 

(b):将MAXPRIMES设为4,这样t2=(n=5)就会出现数组越界的错误,但t1=(n=3)无影响。

 

(c):n=1的时候不满足numPrimes < n,故不经过while循环

 

(d):点覆盖:{1,2,3,4,5,6,7,5,6,8,9,10,11,12,13,14,15,16}

 

 

边覆盖:{(1,2),(2,3),(2,12),(3,4),(4,5),(5,6),(6,7),(6,8),(7,5),(8,9), (5,9),(9,10),(9,11),(10,11),(11,2),(12,13),(13,14),(14,15),(15,13), (13,16)}

 

 

主路径覆盖:{(1,2,3,4,5,6,7),(1,2,3,4,5,6,8,9,10,11),(1,2,3,4,5,6,8,9,11),(1,2,3,4,5,9,10,11),(1,2,3,4,5,9,11),(1,2,12,13,14,15),(1,2,12,16),(3,4,5,6,8,9,10,11,2,12,13,14,15),

 

(3,4,5,6,8,9,11,2,12,13,14,15),(3,4,5,6,8,9,10,11,2,12,13,16),(3,4,5,6,8,9,11,2,12,13,16),(3,4,5,9,10,11,2,12,13,14,15),(3,4,5,9,11,2,12,13,14,15),(3,4,5,9,10,11,2,12,13,16),

 

(3,4,5,9,11,2,12,13,16),(6,7,5,9,10,11,2,12,13,14,15),(6,7,5,9,11,2,12,13,14,15),(6,7,5,9,10,11,2,12,13,16),(6,7,5,9,11,2,12,13,16),(14,15,13,16),(13,14,15,13),(5,6,7,5),

 

(2,3,4,5,6,8,9,10,11,2),(2,3,4,5,6,8,9,11,2),(2,3,4,5,9,10,11,2),(2,3,4,5,9,11,2)}

 

设计主路径覆盖的测试用例

以测试上面的程序printPrimes为例,下面的测试程序用了一些课外自己学的东西~

代码如下:

 1 import static org.junit.Assert.*;
 2 
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.PrintStream;
 5 import java.lang.reflect.Method;
 6 
 7 import org.junit.After;
 8 import org.junit.AfterClass;
 9 import org.junit.Before;
10 import org.junit.BeforeClass;
11 
12 
13 public class Test {
14     private PrintPrimes p;
15 
16     PrintStream console = null;          // 输出流 (字符设备) 
17     ByteArrayOutputStream bytes = null;  // 用于缓存console 重定向过来的字符流
18 
19     @org.junit.Before
20     public void setUp() throws Exception {
21         p = new PrintPrimes();           //初始化
22         bytes = new ByteArrayOutputStream();    // 分配空间
23         console = System.out;                   // 获取System.out 输出流的句柄
24         System.setOut(new PrintStream(bytes));  // 将原本输出到控制台Console的字符流 重定向 到 bytes
25     }
26     
27     @org.junit.After
28     public void tearDown() throws Exception {
29         System.setOut(console);
30     }
31     
32     @org.junit.Test
33     public void testResult() throws Exception {
34         String s = new String("Prime:2" + '\r'+'\n');    // 控制台的换行,这里用 '\r' + '\n' 与println等价
35         s += "Prime:3" + '\r'+'\n';
36         s += "Prime:5" + '\r'+'\n';
37         
38         Class pp = p.getClass();
39         //获取方法
40         Method method = pp.getDeclaredMethod("printPrimes", 
41                 new Class[]{int.class});
42         //将私有设置可访问
43         method.setAccessible(true);
44         //传值,返回结果对象
45         method.invoke(p, 3);
46      //对比结果
47         assertEquals(s, bytes.toString());          // bytes.toString() 作用是将 bytes内容 转换为字符流
48 
49     }
50 }

测试结果如下:已完成主路径覆盖

 

posted @ 2016-03-29 19:42  马列神教  阅读(587)  评论(0编辑  收藏  举报