【问题标题】:High-order Scalacheck property高阶 Scalacheck 属性
【发布时间】:2016-05-04 06:08:20
【问题描述】:

我是 Scala、Scalacheck 和 specs2 的新手,所以如果问题很明显,请耐心等待。我试图看一个这样的例子,但找不到任何相关的东西。

基本上,我正在寻找一种方法来创建一个测试类,使用 specs2 来定义一个 Prop.forAll 属性,该属性接收另一个 scalacheck 属性(如果可能的话,donno)、一个生成器( Gen[A] )和一个文件路径并检查属性是否通过了一组确定的样本(来自生成器)并将错误保存在文件中。

有没有办法实现这个?用一般的方式说话

【问题讨论】:

  • 你的属性接收和其他属性+一个生成器+一个文件路径是一个“Prop”吗?特别是当您使用 Prop.forAll((p: Prop, g: Gen[A], f: File) => ...) 时,您必须有一个用于 p、g 和 f 的 Arbitrary
  • Gen[A] 是从 Class FromRDDGen 中获取的,该 Class FromRDDGen 读取 RDD 并返回包装为 Gen[A] 的行,路径将在测试类中给出。主要目标是:给定一个属性 P 来检查该 Gen[A] 是否失败并将其保存在文件中。

标签: scala specs2 scalacheck


【解决方案1】:

我建议这样做:

import org.specs2._
import org.specs2.execute._
import org.scalacheck._

class TestSpec extends Specification with ScalaCheck { def is = s2"""

  Test my RDD $test

  """

  def test = {
    // get / create a generator
    val gen: Gen[Row] = ???
    // run the property
    property(gen, "prop1.txt") { r: Row =>
      r.values must haveSize(3)
    }
  }

  def property[A, R : AsResult](g: Gen[A], path: String)(prop: A => R): Result =
    saveResult(path)(Prop.forAll(g)(prop))

  def saveResult[R : AsResult](path: String)(r: R): Result = {
    val result = AsResult(r)
    if (!result.isSuccess) writeToFile(result, path)
    result
  }

  def writeToFile(result: Result, path: String) = ???

  case class Row(values: List[Int])
}

【讨论】:

  • 您好!在调用 saveResult 时尝试在属性函数中应用您的示例,您能否解释一下这段代码:saveResult(path)(Prop.forAll(g)(prop)) 如何将括号中的 2 个参数传递给 forAll 属性。我得到一个单元没有任何参数错误:(但总的来说,你的例子看起来很有希望,谢谢!
  • 很抱歉。我编辑了代码,现在可以编译了。
  • 有效!谢谢 !如果您允许我,我想问您其他问题,在我的情况下定义 gen 时,我从从 avro 文件创建的 RDD 中包装一行,但由于我在尝试在测试中定义复杂属性时使用泛型实现它函数我不能这样做,因为它只返回一个 Row ,我应该像你一样创建一个案例类并根据 avro 中的模式定义参数并进行转换吗?顺便感谢您花时间回答我的问题!最好的问候。
  • 是的,我认为值得定义类型,并在无类型世界和有类型世界之间划清界限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 2019-10-25
  • 2019-11-10
  • 2011-04-28
  • 2019-08-18
  • 2020-05-30
  • 1970-01-01
相关资源
最近更新 更多