2014-03-19 44 views
1

好的,所以我有一個課程作業問題表,我剛剛完成,我知道它工作正常,但我想爲它編寫一些jUnit測試,就像一些測試練習一樣。它引發了一些問題。我寫了一個叫做count的函數,它接收一個int n並彙總來自1 to n的所有值並返回它。所以,我寫了4個測試案例,這和認爲他們應該在相同的測試方法中都去爲這樣的:類似的jUnit測試用例應該在同一個測試中嗎?

@Test 
    public void testCount() { 
     assertEquals(0, SimmonsPS5.count(0)); // 1 obj in table with name => 0 permutations 
     assertEquals(1, SimmonsPS5.count(1)); // 2 obj in table with name => 1 permutation 
     assertEquals(3, SimmonsPS5.count(2)); // 2 obj in table with name => 3 permutations (3c2) 
     assertEquals(5050, SimmonsPS5.count(100)); // 100 obj in table with name => 100c2 permutations (100(100+1)/2) 
    } 

不過,如果一個測試失敗(這可能意味着他們都做)的誤差記者會只能說一個測試失敗了,這是不正確的。

接下來,我在該類的主要方法實例化類,運行幾個函數,然後打印到stdout。主要方法是首先獲取一個參數(文件名),然後讀取文件並對其執行一些操作。所以我想測試它是否爲每個文件輸出正確的數據 - 這些測試用例中的每一個應該駐留在相同的測試方法中還是單獨的測試方法中?我選擇了單獨的,但只是出於我認爲這些比以前的方法更容易失敗的唯一原因。所以如果這是測試它的正確方法,那麼應該調用什麼測試方法? testMain1testMain2等?什麼是'接受'命名法?

main測試用例:

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); 
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); 

@Before 
public void setUpStreams() { 
    System.setOut(new PrintStream(outContent)); 
    System.setErr(new PrintStream(errContent)); 
} 

@After 
public void cleanUpStreams() { 
    System.setOut(null); 
    System.setErr(null); 
} 

@Test 
public void testMain4in() { 
    SimmonsPS5.main(new String[]{"4.in"}); 
    assertEquals(47485, Integer.parseInt(outContent.toString().trim())); 
} 

@Test 
public void testMain5in() { 
    SimmonsPS5.main(new String[]{"5.in"}); 
    assertEquals(1667, Integer.parseInt(outContent.toString().trim())); 
} 

@Test 
public void testMain6in() { 
    SimmonsPS5.main(new String[]{"6.in"}); 
    assertEquals(45871, Integer.parseInt(outContent.toString().trim())); 
} 

@Test 
public void testMain7in() { 
    SimmonsPS5.main(new String[]{"7.in"}); 
    assertEquals(324, Integer.parseInt(outContent.toString().trim())); 
} 

@Test 
public void testMain8in() { 
    SimmonsPS5.main(new String[]{"8.in"}); 
    assertEquals(1057527, Integer.parseInt(outContent.toString().trim())); 
} 

注意,輸出到stdout是一個單一的整數倍。

+0

此外,我意識到類似的問題之前已經被問過 - 但沒有一個像我一樣提出過病例 - 所以請在盲目標記爲重複之前徹底閱讀我的問題:)。 –

+0

1測試可以有很多斷言,如果這是問題 – 2014-03-19 05:43:47

+0

@KeirSimmons我想你的想法是,失敗測試的數量是某種程度的代碼質量。我會說,== 0是好的,> 0需要修復 –

回答

2

您希望每個測試都測試一個特定的功能。所有進行的測試應共同能夠指示功能是否正常工作。因此,例如,在您的第一個示例中:

@Test 
public void testCount() { 
    assertEquals(0, SimmonsPS5.count(0)); // 1 obj in table with name => 0 permutations 
    assertEquals(1, SimmonsPS5.count(1)); // 2 obj in table with name => 1 permutation 
    assertEquals(3, SimmonsPS5.count(2)); // 2 obj in table with name => 3 permutations (3c2) 
    assertEquals(5050, SimmonsPS5.count(100)); // 100 obj in table with name => 100c2 permutations (100(100+1)/2) 
} 

這樣比較合適。您正在測試以查看count()是否按設計運行。如果其中任何一個都失敗,則count()的行爲不符合設計。

沒關係如何其中很多測試失敗 - 如果所有測試都失敗,您將採取的操作與您在其中一個失敗時採取的操作相同:調試count()

你的第二個案例:

主要方法,通過在一個參數(文件名)採取先,然後讀取文件,並在其上做一些操作來實現的。所以我想測試它是否爲每個文件輸出正確的數據 - 這些測試用例中的每一個應該駐留在相同的測試方法中還是單獨的測試方法中?

無論您是否將這些結合到一個測試中,在概念上取決於您正在測試的內容。您是否正在測試以查看main()是否有效?或者您是否正在測試以查看它是否適用於單個特定文件?前者是一個更概念上正確的測試,因爲你並不真的護理,它適用於你的特定文件,你真的照顧,它的工作原理是爲任何文件設計的,並且你想出了一套測試您相信的文件準確地表示程序將運行的文件類型。

+1

我不能相信我們同意這個;) –

+0

@NiklasB。這是一天的兩倍! –

+0

謝謝你的回答。所以你建議在一個'testMain'方法中測試所有'main'調用?然而,僅僅因爲一個方法,比如'count(int i)'失敗多次,它可能因爲不同的原因(角落案例等)而失敗 - 這不足以證明多個測試方法的正確性嗎? –