我想寫一堆針對Java類庫的測試代碼,我在Scala上使用specs2。對specs2中的測試用例或「shared_examples_for」進行分組
我有一組測試用例應該爲T類的所有子類運行, 但無法找出最佳實現方法。
從Ruby開始,我自然會像在Rspec中那樣尋找類似* shared_examples_for *的宏,但specs2中似乎沒有這樣的東西。
然後我想,繼承我自己的規範子類與測試用例可能是一種方法。
有沒有什麼更整潔的解決方案呢?
我想寫一堆針對Java類庫的測試代碼,我在Scala上使用specs2。對specs2中的測試用例或「shared_examples_for」進行分組
我有一組測試用例應該爲T類的所有子類運行, 但無法找出最佳實現方法。
從Ruby開始,我自然會像在Rspec中那樣尋找類似* shared_examples_for *的宏,但specs2中似乎沒有這樣的東西。
然後我想,繼承我自己的規範子類與測試用例可能是一種方法。
有沒有什麼更整潔的解決方案呢?
你可以找到在User Guide共享實例的實例。基本上這使用了一個事實,即你可以定義一個方法來獲取特定的實例來測試和聲明它的例子(參見nonEmptyStack
方法)。
如果這可以幫助讓我用一個可變Specification
的kickstart你一個簡單的例子:
import org.specs2._
class SubclassesSpec extends mutable.Specification {
"These examples must pass for all subclasses" >> {
subclasses foreach { subclass => examples(subclass) }
}
/** @return instances of subclasses of type T where T is
* the supertype of the classes you want to test */
def subclasses: Seq[T] = ...
/** @return examples parameterized by a specific instance */
def examples(t: T) = {
"this is the first example" >> {
// use t here
}
"this is the second example" >> {
// use t here
}
}
}
你需要檢查你做之前是實例之間可能產生的副作用的唯一的事情。在上面的說明中,所有示例都是同時執行的和它們共享同一個對象。如果創建的任何問題,您可以:
在規範的頂部添加sequential
避免併發
變化subclasses
和examples
到def subclasses: Seq[() => T]
和def examples(t:() => T)
讓你將創建一個全新的實例對於每個示例
這不是specs2,但ScalaTest有這樣的語法:
我在這裏看不到'例子'上的傳遞點。你在哪裏嘗試了後面提到的副作用守衛,但後來退出並忘記將其刪除? –
你是對的丹尼爾,我相應地編輯了答案。 – Eric
這不適合我。例子的返回類型應該是「片段」嗎?我得到:錯誤:(40,13)找不到類型org.specs2.main.CommandLineAsResult [單位] 「#status」的證據參數的隱式值>> { – Matthias