標籤:
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,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.Before20 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的字元流 重新導向 到 bytes25 }26 27 @org.junit.After28 public void tearDown() throws Exception {29 System.setOut(console);30 }31 32 @org.junit.Test33 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 }
測試結果如下:已完成主路徑覆蓋
軟體測試(四)之 PrintPrimes