我写了一些ScalaTest Table-driven property checks,我试图用sbt test
运行它们。查看报告,我看到ScalaTest
可以识别我拥有的所有JUnit
测试(它们与检查在同一个类中),它运行属性检查(即forAll
正文) ,但它不会将forAll
视为测试。如果失败,我会在报告中看到堆栈跟踪(ScalaTest
测试异常失败),sbt
表示测试运行期间出现“错误”,但它表示所有测试都已通过。报告中的测试总数仅包括JUnit
个测试。
sbt
中是否支持这种测试方式?
答案 0 :(得分:6)
forAll不是测试。它本质上是一个美化的断言。您需要在命名测试中放置断言。怎么做取决于你选择的风格。例如,在FunSuite中,您可以编写如下内容:
class MySpec extends FunSuite with PropertyChecks {
test("give the test a name here") {
forAll(x: Int, y: Int) {
// make assertions here
}
}
}
答案 1 :(得分:1)
不要调用forAll
,而是让测试类从org.scalatest.prop.Checkers
扩展,然后在每个测试中,使用要测试的属性调用check
。在这种情况下,“Property”可能表示您创建的forAll
。
所以我猜你现在有一个看起来像的测试类:
class ExampleSuite extends AssertionsForJUnit {
val fractions = Table(
("n", "d"),
( 1, 2),
///...
)
forAll (fractions) { (n: Int, d: Int) => // ...
@Test def verifySomethingElse = ???
}
我相信您需要做的是从Checkers延伸并将您的forAll
移至测试中。
class ExampleSuite extends AssertionsForJUnit with org.scalatest.prop.Checkers {
@Test def verifyFractions = {
val fractions = Table(
("n", "d"),
( 1, 2),
///...
)
check(forAll (fractions) { (n: Int, d: Int) => ???)
}
@Test def verifySomethingElse = ???
}
答案 2 :(得分:0)
标准方法是使用Matchers和TableDrivenPropertyCheck创建FunSuite测试
示例:强>
import org.scalatest._
import org.scalatest.prop.TableDrivenPropertyChecks._
class CreateSpec extends FunSuite with Matchers {
test("B-Tree-Create for different degree parameter value") {
val params = Table(("degree", "result"),
(0, Tree(Leaf(), 0)),
(2, Tree(Leaf(), 1)),
(1999, Tree(Leaf(), 1999)))
forAll(params) {(degree, result) => Algorithms.create(degree) == result}
}
}