2010-03-18 65 views
12

我主要用scala和java編程,在scala和junit中使用scalatest進行單元測試。我想將相同的測試應用於相同接口/特性的多個實現。這個想法是驗證接口契約是否被強制執行並檢查Liskov替換原則。單元測試幾個實現相同的特質/接口

例如,測試列表的實現時,測試可能包括:

  • 實例應該是空的,當且僅當且僅當它具有零大小。
  • 調用清除後,大小應爲零。
  • 在列表中間添加一個元素,會將rhs元素的索引加1。

什麼是最佳實踐?

回答

6

這聽起來像它可能是共享測試的工作。共享測試是由不同燈具對象共享的測試。即,對不同的數據運行相同的測試代碼。 ScalaTest確實對此有支持。在您最喜歡的風格特徵的文檔中搜索「共享測試」,這些特徵代表測試作爲函數(Spec,WordSpec,FunSuite,FlatSpec等)。一個例子是FlatSpec語法:

it should behave like emptyList

Sharing TestsFlatSpec文檔

4

合同測試很容易處理JUnit 4,here的Ben Rady的視頻。

+0

太棒了!這項技術是否也適用於Scalatest? – paradigmatic 2010-03-18 10:04:37

+0

對不起,不知道:) – abyx 2010-03-18 10:12:50

+0

我只是試着用scalatest,它似乎工作。謝謝。 – paradigmatic 2010-03-18 10:49:57

8

在Java/JUnit中,我通常通過具有抽象測試用例來處理這個問題,從中測試特定的測試類將繼承所有測試,並且有一個設置方法實例化實現。我無法觀看現在發佈的視頻abyx,但我懷疑這是一個普遍的想法。

另一個有趣的可能性,如果你不介意引入另一個測試框架將使用JDave規範類。

我還沒有嘗試過使用這些Scalatest或Scala特性和實現,但應該可以做類似的事情。

0

對於Scala歌劇院,認真考慮ScalaCheck。所有這些合同都可以在ScalaCheck中作爲單行規範表達。運行時,ScalaCheck會隨機生成一個可配置數量的採樣輸入,並檢查所有規格是否成立。它是關於創建單元測試可能的語義最密集的方式。

相關問題