代码如下:
package printPrimes;
public class printPrimes{
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 (isDivisible(primes[i], curPrime))
{ // 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.为printPrimes()画控制流图;
b.考虑测试用例t1=(n=3)和t2=(n=5)。即使这些测试用例游历printPrimes()方法中相同的主路径,它们不一定找出相同的错误,设计一个简单的错误,使得t2比t1更容易发现;
c.针对printPrimes(),找到一个测试用例,使得响应的测试路径访问连接while语句开始到for语句的边,而不用通过while循环体;
d. 针对printPrimes()的图例列举每个节点覆盖,边覆盖和主路径覆盖的测试需求;
1, 控制流图
(图片无法上传,就先空着了)
2, 如果n值大,t2=(n=5)就容易出现数据越界的错误。例如,将MAXPRIMES设为4,这样t2=(n=5)就会出现数组越界的错误,但t1=(n=3)无影响
3, 可令n=1,n=1的时候不满足numPrimes < n,故不经过while循环
4, 节点覆盖:
TR = {1,2,3,4,5,6,7,5,6,8,9,10,11,12,13,14,15,16}
边覆盖:
TR = {(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)}
主路径覆盖:
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,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)}
5, Junit测试
书中所给代码(略)
如果想要运行代码需要稍作修改,添加一个isDivisible方法和一个变量。
修改后的代码如下图:
package printPrimes;
public class printPrimes{
public static int MAXPRIMES = 10;
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 (isDivisible(primes[i], curPrime))
{ // 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
private static boolean isDivisible(int divisor, int divided){
boolean divisible = true;
int remain = 0;
remain = divided%divisor;
if(remain == 0){
divisible = true;
}
else
{
divisible = false;
}
return divisible;
}
}
然后编写测试用例:
package printPrimes;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
public class printPrimesTest {
printPrimes primes;
ByteArrayOutputStream Stream;
@Before
public void setUp() throws Exception {
primes = new printPrimes();
Stream = new ByteArrayOutputStream();
System.setOut(new PrintStream(Stream));
}
@Before
public void setUpStreams(){
System.setOut(new PrintStream(Stream));
}
@After
public void cleanUpStreams(){
System.setOut(null);
}
@Test
public void testprintPrimes() {
String output = new String("Prime:2" + '\r'+'\n');
output += "Prime:3" + '\r'+'\n';
output += "Prime:5" + '\r'+'\n';
printPrimes.printPrimes(3);
assertEquals(output,Stream.toString());
}
}
最终实现主路径覆盖
浙公网安备 33010602011771号