软件测试作业三

Posted on 2017-03-14 21:11  cgh陈冠宏  阅读(150)  评论(0)    收藏  举报

代码如下:

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());
	}
}

 

最终实现主路径覆盖