Homework3
7.Using the following methodprintPrimes()for questions a-d below
/*******************************************************
* Finds and prints n prime integers
* Jeff Offutt, Spring 2003
******************************************************/
public static void printPrimes (int n)
{
int curPrime; // Value currently considered for primeness
int numPrimes; // Number of primes found so far.
boolean isPrime; // Is curPrime prime?
int [] primes = new int [MAXPRIMES]; // The list of prime numbers.
// Initialize 2 into the list of primes.
primes [0] = 2;
numPrimes = 1;
curPrime = 2;
while (numPrimes < n)
{
curPrime++; // next number to consider ...
isPrime = true;
for (int i = 0; i <= numPrimes-1; i++)
{ // for each previous prime.
if (curPrime%primes[i]==0)
{ // Found a divisor, curPrime is not prime.
isPrime = false;
break; // out of loop through primes.
}
}
if (isPrime)
{ // save it!
primes[numPrimes] = curPrime;
numPrimes++;
}
} // End while
// Print all the primes out.
for (int i = 0; i <= numPrimes-1; i++)
{
System.out.println ("Prime: " + primes[i]);
}
} // end printPrimes
a)Draw the control flow graph for theprintPrimes()method.
Answer:
(b) Consider test cases t1=(n=3) and t2=(n=5). Although these tour the same prime paths in ptinrPrimes(), they do not necessarily find the same faults. Design a simple fault that t2 would be more likely to discover than t1 would.
Answer:
当MAXPRIMES = 3 、4时, t2=(n=5) 会溢出 ,t1=(n=3) 不会溢出。
(c) For printPrimes(), find a test case such that the corresponding test path visits the edge that connects the beginning of thewhilestatement to theforstatementwithtoutgoing through the body of the while loop.
Answer:
当n=1的时候,测试用例会通过边对(2,12)。
(d) Enumerate the test requirements for node coverage, edge coverage, amd prime path coverage for the graph fpr printPrime().
Answer:
1) Node Coverage
TR = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
2) Edge Coverage
TR = {(1,2), (2,3), (2,12), (3,4), (4,5), (5,6), (5,9), (6,7), (6,8), (7,5), (8,9)
(9,10), (9,11), (10,11), (11,2), (12,13), (13,14), (13,16), (14,15), (15,13)};
3) Prime Path Coverage
TR = {[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,12,13,14,15], [1,2,12,13,16],
[2,3,4,5,6,8,9,10,11,2], [3,4,5,6,8,9,10,11,2,3], [4,5,6,8,9,10,11,2,3,4], [5,6,8,9,10,11,2,3,4,5],
[6,8,9,10,11,2,3,4,5,6], [8,9,10,11,2,3,4,5,6,8], [9,10,11,2,3,4,5,6,8,9], [10,11,2,3,4,5,6,8,9,10],
[11,2,3,4,5,6,8,9,10,11],
[2,3,4,5,6,8,9,11,2], [3,4,5,6,8,9,11,2,3], [4,5,6,8,9,11,2,3,4], [5,6,8,9,11,2,3,4,5],
[6,8,9,11,2,3,4,5,6], [8,9,11,2,3,4,5,6,8], [9,11,2,3,4,5,6,8,9], [11,2,3,4,5,6,8,9,11],
[2,3,4,5,9,10,11,2], [3,4,5,9,10,11,2,3], [4,5,9,10,11,2,3,4], [5,9,10,11,2,3,4,5],
[9,10,11,2,3,4,5,9], [10,11,2,3,4,5,9,10], [11,2,3,4,5,9,10,11],
[2,3,4,5,9,11,2], [3,4,5,9,11,2,3], [4,5,9,11,2,3,4], [5,9,11,2,3,4,5], [9,11,2,3,4,5,9],
[11,2,3,4,5,9,11],
[13,14,15,13], [14,15,13,14], [15,13,14,15],
[5,6,7,5], [6,7,5,6], [7,5,6,7],
[3,4,5,9,11,2,12,13,16], [3,4,5,9,10,11,2,12,13,16], [3,4,5,6,8,9,11,2,12,13,16],
[3,4,5,6,8,9,10,11,2,12,13,16],
[3,4,5,9,11,2,12,13,14,15], [3,4,5,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,14,15],
[6,7,5,9,11,2,3,4], [6,7,5,9,10,11,2,3,4], [6,7,5,9,11,2,12,13,14,15], [6,7,5,9,10,11,2,12,13,14,15],
[6,7,5,9,11,2,12,13,16], [6,7,5,9,10,11,2,12,13,16],
[7,5,6,8,9,11,2,3,4], [7,5,6,8,9,10,11,2,3,4], [7,5,6,8,9,11,2,12,13,14,15],
[7,5,6,8,9,10,11,2,12,13,14,15], [7,5,6,8,9,11,2,12,13,16], [7,5,6,8,9,10,11,2,12,13,16],
[8,9,11,2,3,4,5,6,7], [8,9,10,11,2,3,4,5,6,7],
[14,15,13,16] };
基于Junit及Eclemma(jacoco)实现一个主路径覆盖的测试。
项目结构:
项目源代码:
PrintPrime.java
1 packagecn.tju.hw3;2
3 public classPrintPrime {4
5 private static final int MAXPRIMES = 100000000;6 public static String printPrimes(intn) {7 String ResultString = "";8 int curPrime; //Value currently considered for primeness
9 int numPrimes; //Number of primes found so far.
10 boolean isPrime; //Is curPrime prime?
11 int[] primes = new int[MAXPRIMES]; //The list of prime numbers.12
13 //Initialize 2 into the list of primes.
14 primes[0] = 2;15 numPrimes = 1;16 curPrime = 2;17 while (numPrimes
19 isPrime = true;20 for (int i = 0; i <= numPrimes - 1; i++) { //for each previous prime.
21 if (curPrime % primes[i] == 0) { //Found a divisor, curPrime is not prime.
22 isPrime = false;23 break; //out of loop through primes.
24 }25 }26 if (isPrime) { //save it!
27 primes[numPrimes] =curPrime;28 numPrimes++;29 }30 } //End while31
32 //Print all the primes out.
33 for (int i = 0; i <= numPrimes - 1; i++) {34 ResultString = ResultString + primes[i] + " ";35 }36 returnResultString;37 } //end printPrimes
38
39 }
PrintPrimeTest.java
1 packagecn.tju.hw3;2
3 import static org.junit.Assert.*;4 importjava.util.Collection;5
6 importorg.junit.Before;7 importorg.junit.Test;8 importorg.junit.runner.RunWith;9 importorg.junit.runners.Parameterized;10 importorg.junit.runners.Parameterized.Parameters;11 importjava.util.Arrays;12
13 @RunWith(Parameterized.class)14 public classPrintPrimeTest {15 private String expected = "";16 private intn;17 privatePrintPrime pp;18
19 public PrintPrimeTest(intnum, String expec) {20 n =num;21 expected =expec;22 }23
24 @Before25 public voidsetUp() {26 pp = newPrintPrime();27 }28
29 @Test30 public voidtest() {31 assertEquals(this.expected, pp.printPrimes(this.n));32 }33
34 @Parameters35 public static CollectiongetData() {36 return Arrays.asList(new Object[][] { { 6, "2 3 5 7 11 13 "} });37 //return Arrays.asList(new Object[][] {{ 2, "2 3 " } });
38 }39 }
运行结果: