最近在看《敏捷软件开发》,看到第31的有关于编写测试类测试一个素数生成器的例子,特此动手实践了下,发现了书中的一个小错误,同时在网上看到一个更好的测试方法。
版本一
//这是书上版本一
public class GeneratePrimes {
public static int[] generatePrimes(int maxValue){
if(maxValue >=2){
int s = maxValue+1;
boolean[] f = new boolean[s];
int i;
for(i=0;i<s;i++){
f[i]=true;
}
f[0]=f[1]=false;
int j;
for(i=2;i<Math.sqrt(s)+1;i++){
for(j=2*i;j<s;j+=i)
f[j] = false;
}
int count=0;
for(i=0;i<s;i++){
if(f[i])
count++;
}
int[] primes = new int[count];
for(i=0,j=0;i<s;i++){
if(f[i])
primes[j++]=i;
}
return primes;
}
else {
return new int[0];
}
}
}
版本二
//这是书上版本二
public class PrimeGenerator {
private static int s;//这里书上是a,很明显错了
private static boolean[] f;
private static int[] primes;
public static int[] generatePrimes(int maxValue){
if(maxValue<2){
return new int[0];
}else{
initializeSieve(maxValue);
sieve();
loadPrimes();
return primes;
}
}
private static void loadPrimes() {
int i;
int j;
int count = 0;
for(i=0;i<s;i++){
if(f[i]){
count++;
}
}
primes = new int[count];
for(i=0,j=0;i<s;i++){
if(f[i]){
primes[j++]=i;
}
}
}
private static void sieve() {
int i;
int j;
for(i=2;i<Math.sqrt(s)+1;i++){
if(f[i]){
for(j=2*i;j<s;j+=i){
f[j]=false;
}
}
}
}
private static void initializeSieve(int maxValue) {
s=maxValue+1;
f=new boolean[s];
int i;
for(i=0;i<s;i++){
f[i]=true;
}
f[0]=f[1]=false;
}
}
书上的测试类
测试类,书上的测试PrimeGenerator的,顺着写就好
import junit.framework.TestCase;
import junit.textui.TestRunner;
public class TestGeneratePrimes2 extends TestCase {
public static void main(String[] args) {
TestRunner.main(new String[]{"TestGeneratePrimes"});
}
public TestGeneratePrimes2(String name){
super(name);
}
public void testPrimes(){
int[] nullArray = PrimeGenerator.generatePrimes(0);
assertEquals(nullArray.length, 0);
int[] minArray = PrimeGenerator.generatePrimes(2);
assertEquals(minArray.length, 1);
assertEquals(minArray[0], 2);
int[] threeArray = PrimeGenerator.generatePrimes(3);
assertEquals(threeArray.length, 2);
assertEquals(threeArray[0], 2);
assertEquals(threeArray[1], 3);
int[] centArray = PrimeGenerator.generatePrimes(100);
assertEquals(centArray.length, 25);
assertEquals(centArray[24], 97);
}
}
我自己写的测试类
测试类,我自己写来测试GeneratePrimes的
import static org.junit.Assert.*;
import org.junit.Test;
public class TestGeneratePrimes {
@Test
public void test() {
int[] nullArray = GeneratePrimes.generatePrimes(0);
assertEquals(nullArray.length, 0);
int[] minArray = GeneratePrimes.generatePrimes(2);
assertEquals(minArray.length, 1);
assertEquals(minArray[0], 2);
int[] threeArray = GeneratePrimes.generatePrimes(3);
assertEquals(threeArray.length, 2);
assertEquals(threeArray[0], 2);
assertEquals(threeArray[1], 3);
int[] centArray = GeneratePrimes.generatePrimes(100);
assertEquals(centArray.length, 25);
assertEquals(centArray[24], 97);
}
}
可以发现代码明显少了很多。
或者这样
import static org.junit.Assert.*;
import org.junit.Test;
public class TestGeneratePrimes {
@Test
public void testNull() {
int[] nullArray = GeneratePrimes.generatePrimes(0);
assertEquals(nullArray.length, 0);
}
@Test
public void testMin(){
int[] minArray = GeneratePrimes.generatePrimes(2);
assertEquals(minArray.length, 1);
assertEquals(minArray[0], 2);
}
@Test
public void testThree(){
int[] threeArray = GeneratePrimes.generatePrimes(3);
assertEquals(threeArray.length, 2);
assertEquals(threeArray[0], 2);
assertEquals(threeArray[1], 3);
}
@Test
public void testCent(){
int[] centArray = GeneratePrimes.generatePrimes(100);
assertEquals(centArray.length, 25);
assertEquals(centArray[24], 97);
}
}
测试结果看着也很清爽。
就是酱紫。