- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为什么需要任意,因为自动化属性测试需要属性定义,例如
val prop = forAll(v: T => check that property holds for v)
和值 v 生成器。用户指南说您可以为自定义类型创建自定义生成器(以树生成器为例)。然而,它并没有解释为什么除此之外还需要任意的。
这是一份手册
implicit lazy val arbBool: Arbitrary[Boolean] = Arbitrary(oneOf(true, false))
To get support for your own type T you need to define an implicit def or val of type Arbitrary[T]. Use the factory method Arbitrary(...) to create the Arbitrary instance. This method takes one parameter of type Gen[T] and returns an instance of Arbitrary[T].
它清楚地表明我们需要在 Gen 之上的任意性。尽管如此,任意性的理由并不令人满意
The arbitrary generator is the generator used by ScalaCheck when it generates values for property parameters.
IMO,要使用生成器,您需要导入它们而不是将它们包装到任意生成器中!否则,有人可能会争辩说我们需要将任意值包装到其他东西中以使它们可用(等等无限地包装包装器)。
您还可以解释如何任意[Int]
将参数类型转换为生成器。很好奇,我觉得这些都是相关的问题。
最佳答案
forAll { v: T => ... }
是在 Scala 的帮助下实现的隐式。这意味着 T
类型的生成器是隐式找到的,而不是由调用者显式指定的。
Scala 隐式很方便,但如果您不确定当前范围内的隐式值或转换,它们也可能会很麻烦。通过使用特定类型(Arbitrary
)进行隐式查找,ScalaCheck 尝试限制使用隐式的负面影响(这种使用也使其类似于我们熟悉的 Haskell 类型类对于某些用户)。
所以,您完全正确,实际上并不需要Arbitrary
。通过隐式 Gen[T]
值可以实现相同的效果,但可能会带来更多隐式范围界定困惑。
作为最终用户,您应该将 Arbitrary[T]
视为 T
类型的默认生成器。您可以(通过范围界定)定义和使用多个 Arbitrary[T]
实例,但我不推荐这样做。相反,只需跳过Arbitrary
并明确指定您的生成器:
val myGen1: Gen[T] = ...val mygen2: Gen[T] = ...val prop1 = forAll(myGen1) { t => ... }val prop2 = forAll(myGen2) { t => ... }<小时/>
任意 [Int]
的工作方式与 forAll { n: Int => ... }
类似,它只是查找隐式 Arbitrary[Int]
实例并使用它的生成器。实现很简单:
def arbitrary[T](implicit a: Arbitrary[T]): Gen[T] = a.arbitrary
Arbitrary
的实现在这里也可能会有所帮助:
sealed abstract class Arbitrary[T] { val arbitrary: Gen[T]}
关于scala - 为什么 scalacheck 中需要 Arbitraries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31111106/
我知道我可以 make scalacheck tests deterministic ,但我有一个更普遍的问题:scalacheck默认的非确定性行为是否会导致实际问题?我一直认为测试应该是确定性的和
这是在 https://stackoverflow.com/questions/12639454/make-scalacheck-tests-deterministic 中作为“奖金问题”提出的,但没
有没有办法使用 Scalacheck 为属性测试生成随机日期。我想同时生成 future 日期和过去日期。但是现有的 Scalacheck.Gen 类没有提供任何预定义的方法来这样做。 最佳答案 以下
在我的测试中,我非常广泛地使用 Specs2 + ScalaCheck,并且有一些模式需要考虑。我仍然没有确定我的函数是否应该使用 Arbitrary[T] 或 Gen[T],因为它们非常相似: se
我试图确保我的 ScalaCheck 属性运行 500 次而不是默认的 100 次。我在配置这个时遇到了麻烦。 class BlockSpec extends Properties("BlockSpe
我正在尝试实现一个简单的属性检查,但 Scalacheck 忽略了我的生成器。我在这里做错了什么? object AlgorithmTest extends Properties("Algorithm
我对 ScalaCheck(以及整个 Scala)相当陌生,所以这可能是一个相当简单的解决方案 我正在使用 ScalaCheck 为 AST 生成测试并验证编写器/解析器是否工作。我有这些文件 AST
我是第一次尝试 ScalaCheck,我想生成一个有序的 Int 数组。 我阅读了文档并进行了一些搜索,但没有找到方法。 有人可以对此有所了解吗? 谢谢 最佳答案 我假设您想要一个已排序的任意整数数组
我想在 ScalaCheck 中创建一个生成器,它可以生成介于 1 和 100 之间的数字,但对接近 1 的数字有钟形偏差。 Gen.choose()在最小值和最大值之间随机分配数字: scala>
我想生成一个与ScalaCheck中的生成器列表相对应的整数列表。 import org.scalacheck._ import Arbitrary.arbitrary val
在这样的上下文中,生成非空字符串的最佳方法是什么 private def createIndexFn() = { for{ someChar <- Gen.alpha
我看到 scalacheck 似乎是一个非常明显的错误,如果它真的存在,我看不到人们如何将它用于递归数据结构。 这个程序失败了 StackOverflowError在 scalacheck 接管之前,
我看到 scalacheck 似乎是一个非常明显的错误,如果它真的存在,我看不到人们如何将它用于递归数据结构。 这个程序失败了 StackOverflowError在 scalacheck 接管之前,
我已经实现了以下功能: /** * Returns a function h , which is the composition of the functions f and g. */ d
我正在尝试使用 Scalacheck 生成随机数据。我有一个具有许多属性的案例类层次结构。到目前为止,我发现填充案例类的唯一方法是这样的: case class Data(a: String,
我该如何写Gen[A]使用永远不会返回相同对象两次的 ScalaCheck? Gen.oneOf(a,b,c) 可以重复选择同一个对象,所以不起作用。 我正在 specs2 中编写一个可变规范,我
我正在尝试使用 ScalaCheck 为 BST 创建一个 Gen,但是当我调用 .sample 方法时,它给了我 java.lang.NullPointerException。我哪里错了? seal
我正在使用 ScalaCheck 在 ScalaTest 中进行一些基于属性的测试。假设我想测试一个函数,f(x: Double): Double仅针对 x >= 0.0 定义的, 并返回 NaN对于
UserGuide scalacheck 项目提到了大小的生成器。解释代码 def matrix[T](g:Gen[T]):Gen[Seq[Seq[T]]] = Gen.sized {size =>
我想用 scalatest 和 scalacheck 测试通用堆栈。到目前为止我有这个: "Stack" should "pop the last value pushed" in { check
我是一名优秀的程序员,十分优秀!