软件测试技术作业3---PrintPrimes()

时间:2022-05-12 21:56:20

一、代码部分:

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

     代码分析:printPrimes()方法输出质数,用户传递参数n到printPrimes()方法,该方法将会输出从2开始的n个质数。其中,MAXPRIMES规定数组primes的大小,n的值应该小于等于MAXPRIMES。

     在书中给出的代码部分,需要我们自己补充部分代码。MAXPRIMES的值需要我们自己给出,另外,代码中的isDivisible()方法需要我们自己实现。实现代码如下:

 

1  public boolean idDivisible(int a,int b)
2      {
3          if(b%a==0)
4              return true;
5          else
6              return false;
7      }

      此外,我们定义MAXPRIMES的值为10。添加Main函数之后,我们可以进行测试,结果如下:

软件测试技术作业3---PrintPrimes()

 

输出从2开始的5个质数。

二、习题解答:

(a) Draw the control flow graph for the printPrimes() method.绘制控制流图

软件测试技术作业3---PrintPrimes()

 

(b) Consider test cases t1=(n=3) and t2=(n=5). Although these tour the same prime paths in printPrimes(), they do not necessarily find the same faults.Design a simple fault that t2 would be more likely to discover than t1 would. 

考虑测试用例,n = 3 和 n = 5,它们游历相同的主路径。设计一个简单的错误,t2发现而t1不会发现。

解:将MAXPRIMES的值设为4,t2会发生越界错误,t1不会。

 

(c) For printPrimes(), find a test case such that the corresponding test path visits the edge that connects the beginning of the while statement to the for statement without going through the body of the while loop.

设计一个测试用例,不执行while循环。

解:令n = 1,此时不满足while语句的判断条件,不执行while循环。

(d)Enumerate the test requirements for node coverage, edge coverage, and prime path coverage for the graph for printPrimes().

列举节点覆盖,边覆盖和主路径覆盖的测试要求。

点覆盖:{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)}

 

三、基于Junit及Eclemma(jacoco)实现一个主路径覆盖的测试。

测试代码:

 

 1 package hw3Test;
 2 
 3 import static org.junit.Assert.*;
 4 
 5 import org.junit.After;
 6 import org.junit.Before;
 7 import org.junit.Test;
 8 
 9 import hw3.Hw3;
10 
11 public class Hw3Test {
12 
13     Hw3 t = new Hw3();
14     @Before
15     public void setUp() throws Exception {
16     }
17 
18     @After
19     public void tearDown() throws Exception {
20     }
21 
22     @Test
23     public void testPrintPrimes() {
24         t.printPrimes(5);
25     }
26 
27 }

测试结果如下:

软件测试技术作业3---PrintPrimes()

 

使用EclEmma 进行覆盖测试:

软件测试技术作业3---PrintPrimes()