2011-04-20 88 views
58

理論與參數化測試有什麼區別?JUnit理論與參數化測試的區別

我對創建測試類時的實現差異不感興趣,只是當您選擇一個測試類時。

+1

我之前使用參數化,但發現它可能會有點混亂。理論似乎也以同樣的方式做了同樣的事情,但以更清晰的方式。也許這是第二次嘗試讓參數化測試的概念正確。好問題,謝謝你提高它! – Newtopian 2011-04-20 08:46:48

回答

27

根據我的理解: 使用參數化測試,您可以爲測試案例提供一系列靜態輸入。

理論相似但概念不同。他們背後的想法是創建測試用例,測試假設而不是靜態值。 因此,如果我提供的測試數據根據一些假設是真實的,則得出的斷言總是確定性的。 背後的驅動思想之一是您將能夠提供無限數量的測試數據,並且您的測試案例仍然是真實的;此外,通常您需要在測試輸入數據中測試一系列可能性,例如負數。如果您靜態測試,即提供一些負數,則無法保證您的組件能夠對付所有負數,即使這樣做極有可能。

從我所知道的情況來看,xUnit框架試圖通過創建所提供的測試數據的所有可能組合來應用理論的概念。

在數據驅動場景中接近場景時(即只有輸入發生變化,但測試總是一次又一次地執行相同的斷言),兩者都應該使用。

但是,由於理論似乎是實驗性的,我只有在需要在輸入數據中測試一系列組合時纔會使用它們。對於所有其他情況,我會使用參數化測試。

+1

https://github.com/BartoszMiller/junit4-explored/blob/master/src/test/java/explored/theory/TheoriesRunner.java - 這是一個基本的樣本測試,對10000個不同的輸入數據執行一個@Theory謝謝重寫抽象ParameterSupplier。我不確定使用參數化亞軍是否可以輕鬆實現。 – MrKiller21 2016-10-30 12:29:36

0

根據我的理解,不同之處在於,當您想要做的只是測試一組不同的輸入(單獨測試每個輸入)時,使用參數化測試,理論是參數化測試的一個特例測試每個輸入作爲一個整體(每個參數都必須爲真)。

11

Parameterized.class用單個變量測試「parametrize」測試,而Theories.class用幾個變量的所有組合來「參數化」。

有關示例,請閱讀:

http://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit

http://blog.schauderhaft.de/2010/02/07/junit-theories/

http://blogs.oracle.com/jacobc/entry/junit_theories

Theories.class類似於Haskell的快速​​檢查:

http://en.wikibooks.org/wiki/Haskell/Testing

但QuickCheck自動生成參數組合

+4

這不是事實。您可以使用任意數量的變量(參數)進行參數化測試,並使用單參數進行理論測試。上面的@Fabio Kenji的回答很好地解釋了真正的差異。 – Gilead 2012-10-12 11:56:40

0

有點晚回覆。但這對未來的測試人員會有幫助。

參數化測試VS理論

  • 類具有 「@RunWith(Parameterized.class)」 VS「@RunWith(理論註釋。類)」
  • 測試輸入是從一個靜態方法返回Collection中獲取,並用@參數VS與@DataPoints或@DataPoint註釋的靜態字段註釋。
  • 的輸入被傳遞給構造(強制)和由測試方法中所使用VS輸入直接傳遞給測試方法
  • 試驗方法都被註解@Test和doen't接受參數VS試驗方法都被註解@Theory並且可以採取參數
0

除了上述反應: 在具有4個值和2種測試方法的輸入上

  • @RunWith(Theories.class) - 將產生2個JUnit測試

  • @RunWith(Parameterized.class) - 將產生8(4個輸入x 2種方法)JUnit測試