标签:
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.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 }
测试结果如下:已完成主路径覆盖
标签:
原文地址:http://www.cnblogs.com/tjulym/p/5334213.html