簡體   English   中英

測試 Java 方法的 output 的“正確”方法是什么?

[英]What is the “right” way to test the output of Java methods?

在 Python 中,我經常有如下所示的測試:

tests = [
    (2, 4),
    (3, 9),
    (10, 100),
]
for (input, expected_output) in tests:
    assert f(input) == expected_output

在 Java 和 JUnit 中編寫這樣的測試(其中指定一組測試用例,然后循環運行每個測試用例)的“正確”方法是什么?

謝謝!

先發制人的回應:我意識到我可以做類似的事情:

assertEquals(4, f(2))
assertEquals(9, f(3))
....

但是...我希望有更好的方法。

一樣。

    int[][] tests = {
            {2, 4},
            {3, 9},
            {10, 100}
    };
    for (int[] test : tests) {
        assertEquals(test[1], f(test[0]));
    }

當然不如 python 漂亮,但很少有東西。

您可能還想研究JUnit 理論,一個未來的功能......

正確的方法是編寫單獨的斷言語句,即使您不喜歡它。

它避免了不必要的復雜性,並且當它失敗時,有時更容易查看哪個值失敗(無需啟動調試器)。

但是,如果您自動生成測試數據,那就另當別論了。

查看 Junit 中的參數化測試運行器。

http://junit.org/apidocs/org/junit/runners/Parameterized.html

看起來它會做你正在尋找的東西。

嗯...

int[][] tests = new int[][]{
        {2, 4},
        {3, 9},
        {10, 100},
    };

for(int[] i : tests)
{
    assertEquals(i[1], f(i[0]);
}

一樣的,真的。 唯一的問題是 Java 缺少元組文字,因此對於更復雜的情況,您必須使用 Object[] arrays 並進行轉換,或者編寫一個元組 class。

難道你不只是定義一個簡單的 class 兩個字段,真實結果和預期結果,然后以類似於你的 Python 片段正在做的方式循環集合嗎?

There are no tuples in Java, but you could use a Map or two parallel arrays to specify input/output pairs and then do a loop just like your Python example.

絕對不是單元測試方面的專家,但我更願意為我正在測試的每個案例使用一個單獨的方法,並使用一些測試運行工具(如 NUnit-GUI,用於 C#)。 這樣我就可以確切地知道哪種情況會失敗,如果確實如此。 它還有更多的工作要做,但我認為它最終會得到很好的回報。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM