2013-03-14 144 views
0

我是新來的,大家好。我已經找了一些關於這方面的信息,並沒有找到任何東西,但我確定這很簡單,我失蹤了。我有一個簡單的程序,我試圖測試哪個使用鏈表數來執行算術。我的測試用例生成隨機的int值,並使用原始加法,減法,乘法來檢查答案。我現在看到的問題是,當我反覆運行測試時,原始操作返回的結果不正確,但是我的鏈表數字算術是正確的。內存中的變量是否有可能在重複的junit測試用例運行之間沒有清理?有時候它可以正常工作,有時它不會。java junit測試用例不一致

順便說一句我正在使用Eclipse和JUnit 4.這是我的測試代碼。謝謝你的幫助!

import static org.junit.Assert.*; 
import java.util.Random; 

import org.junit.Test; 

public class NumberTest { 

@Test 
public void testRandomIntAddition1() { 
    Random generator = new Random(); 
    int i = generator.nextInt(); 
    int j = generator.nextInt(); 
    Number a = new Number(""+i); 
    Number b = new Number(""+j); 
    Number sum = a.add(b); 
    System.out.printf("The first number is %d\n", i); 
    System.out.printf("The second number is %d\n", j); 
    System.out.printf("The primative sum is %d\n", i + j); 
    System.out.printf("The Number sum is %s\n\n", sum.toString()); 
    assertEquals(sum.toString(),""+ (i+j)); 
} 

@Test 
public void testRandomIntSubtraction1() { 
    Random generator = new Random(); 
    int i = generator.nextInt(); 
    int j = generator.nextInt(); 
    int k = i - j; 
    Number a = new Number(""+i); 
    Number b = new Number(""+j); 
    Number diff = a.subtract(b); 
    System.out.printf("The first number is %d\n", i); 
    System.out.printf("The second number is %d\n", j); 
    System.out.printf("The primative diff is %d\n", k); 
    System.out.printf("The Number diff is %s\n\n", diff.toString()); 
    assertEquals(diff.toString(),"" + k); 
} 
} 

這裏的示例輸出,顯示了原始的減法不正確的結果:

The first number is -504267212 
The second number is 454054464 
The primitive sum is -50212748 
The Number sum is -50212748 

The first number is 1820929887 
The second number is -1488686395 
The primitive diff is -985351014 
The Number diff is 3309616282 
+0

這是否指向您的Number類中的問題? – 2013-03-14 15:30:41

+1

我會*不*在你的測試中使用隨機生成的數字,順便說一句。它使追蹤問題非常困難。例如你可能會有一個數字組合觸發溢出條件,然後無法在調試器中的後續運行中重複該操作。 – 2013-03-14 15:31:58

+0

嗨,Brian,感謝您的評論。我不這麼認爲。樣本輸出中的失敗是由基本java,i-j執行的減法運算。正如我計算的那樣,1820929887 - (-1488686395)= 3309616282.這是我的Number類的結果。我無法理解1820929887 - (-1488686395)= -985351014是如何發生的。結果似乎完全在左邊的領域。你不這麼認爲嗎?再次感謝。 – user2170433 2013-03-14 15:37:19

回答

2

除了這個事實,你的號碼四溢,你可能想看看JUnit的Parameterized類運行像測試這個。這樣您就可以生成一個隨機數對列表,並將它們用於加法和減法測試。它還允許您輕鬆更改測試次數,並單獨進行故障而不是單次故障。

@RunWith(Parameterized.class) 
public class NumberTest { 
    static int trials = 100; 
    static int MAX_VALUE = 1 << 30; // To prevent overflow 

    @Parameters 
    public static Collection<Object[]> randomVals() { 
     Random rnd = new Random();    
     List<Object[]> stuff = new LinkedList<>(); 
     for(int a = 0; a < trials; a++) { 
      stuff.add(new Object[] {rnd.nextInt(MAX_VALUE), rnd.nextInt(MAX_VALUE)}); 
     } 
     return stuff; 
    } 

    int i, j; 

    public Number(int i, int j) { 
     this.i = i; this.j = j;  
    } 

    // Your tests here, using i and j above. 

}