2011-03-20 142 views
7

是否有任何方便的方式在多個數據集上執行測試 - 就像在JUnit的參數化測試中一樣?使用ScalaTest測試多個數據集

+0

我想看看Scalacheck,它可以從Scalatest中使用。 – 2011-03-20 23:35:45

回答

8

測試ScalaTest 1.5中的多個數據集有一項新功能,您可以將其作爲快照進行嘗試。它被釋放在scala-tools.org:

組ID:org.scalatest 工件ID:scalatest 版本:1.5快照

您在混合(或導入的成員)TableDrivenPropertyChecks,那麼你就可以定義這樣的表:

val examples = 
    Table(
    ("a", "b", "c", "d"), 
    ( 1, 1, 1, 1), 
    ( 1, 1, 1, 1), 
    ( 1, 1, 1, 1), 
    ( 1, 1, 1, 1) 
) 

您將元組的var arg列表傳遞給Table。每個元組都必須具有相同的元組,在這種情況下,每個元組都有4個元素(4個成員)。第一個元組是所有字符串,並且這些定義了列的名稱。隨後的元組每個定義一行數據。您可以將任何類型放入元組中,但通常每列都會包含相同的類型。雖然如果你想要的話,你可以有任何可以包含任何東西的類型的列。你可以有1到22列的表格。如果你需要超過22列(Scala中的最大元組大小是22),你可以做的是在一列或多列中使用複合類型。

一旦你有一個表,你可以用FORALL檢查它們是這樣的:

forAll (examples) { (a, b, c, d) => 
    a + b + c + d should equal (4) 
} 

FORALL需要兩個參數列表。第一個是表格,第二個是「屬性函數」,表示表格的每一行應該是真的。 forAll將佔用表中的每一行(當然,跳過列名稱的標題行)並確保該屬性成立。如果沒有,你會得到一個很好的錯誤信息,說明表中的哪一行失敗,指定列的值是多少,等等。

表是數據元組的一個序列,所以你也可以使用它就像一個Seq。例如,你可以得到選項[異常]表示的序列的行未能像這樣:

for ((a, b, c, d) <- examples) yield { 
    failureOf { a + b + c + d should equal (4) } 
} 

得到的序列包含在表中,這是一個無如果屬性傳遞數據的每一行一個選項對於那一行,以及一些[異常]如果屬性失敗。 Some中的例外包含關於失敗的所有細節。

6

Shared tests對您而言可能很有趣。他們允許你定義一些組測試就像這個堆棧的例子:

def nonEmptyStack(stack: Stack[Int], lastItemAdded: Int) { 
    "be non-empty" in { 
     assert(!stack.empty) 
    } 
    "return the top item on peek" in { 
     assert(stack.peek === lastItemAdded) 
    } 
    "not remove the top item on peek" in { 
     val size = stack.size 
     assert(stack.peek === lastItemAdded) 
     assert(stack.size === size) 
    } 
    "remove the top item on pop" in { 
     val size = stack.size 
     assert(stack.pop === lastItemAdded) 
     assert(stack.size === size - 1) 
    } 
    } 

,然後在實際的規格,你可以使用它像這樣:

behave like nonEmptyStack(stackWithOneItem, lastValuePushed) 

因此,換句話說,nonEmptyStack被參數化可以使用您想要測試的不同數據集的一組測試。

3

另一種可能性爲數據驅動測試是使用下面的語法:

class SampleTest extends FunSuite {  
    val input = List((1, 1), (4, 2), (9, 3)) 

    input.foreach{i => 
    test(s"Test of math.sqrt(${i._1})") { 
     assert(math.sqrt(i._1) === i._2) 
    } 
    } 
} 

測試默認並行執行,除非你build.sbt設置parallelExecution in Test := false