Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的定制生成器Scalacheck测试在丢弃了很多用例后失败了,我该如何修复这个问题?_Scala_Testing_Quickcheck_Scalacheck_Generative Testing - Fatal编程技术网

为什么我的定制生成器Scalacheck测试在丢弃了很多用例后失败了,我该如何修复这个问题?

为什么我的定制生成器Scalacheck测试在丢弃了很多用例后失败了,我该如何修复这个问题?,scala,testing,quickcheck,scalacheck,generative-testing,Scala,Testing,Quickcheck,Scalacheck,Generative Testing,我是Scala的新手,正在编写我的第一个Scalacheck套件 我的程序中有一个数据结构,基本上看起来像(List[Double],List[Double]),只有当\u 1的每个元素严格大于\u 2的对应元素时,它才是格式良好的 因为它在实践中稍微复杂一点(尽管为了这个MWE的目的,我们可以假装它有一切),所以我为它编写了一个自定义生成器 然后,我添加了两个简单的测试(包括所有测试中最简单的一个,1==1),在这两种情况下,测试都失败,只有XX次通过测试后,消息放弃。YYY测试已被放弃。 为

我是Scala的新手,正在编写我的第一个Scalacheck套件

我的程序中有一个数据结构,基本上看起来像
(List[Double],List[Double])
,只有当
\u 1
的每个元素严格大于
\u 2
的对应元素时,它才是格式良好的

因为它在实践中稍微复杂一点(尽管为了这个MWE的目的,我们可以假装它有一切),所以我为它编写了一个自定义生成器

然后,我添加了两个简单的测试(包括所有测试中最简单的一个,
1==1
),在这两种情况下,测试都失败,只有XX次通过测试后,消息
放弃。YYY测试已被放弃。

为什么会这样?我该如何修复它

附件是我的测试套件和输出


package com.foo.bar
导入org.scalacheck_
进口道具_
任意导入_
对象FooSpecification扩展属性(“FooInterval”){
键入footInterval=(List[Double],List[Double])
/*这应该是列表s.t的元组,每个元素都是_1
*是
任意[Double]。例如(\u>low)
这是您的问题。
suchThat
将放弃条件为false的所有情况。您将获取两个随机值,并放弃其中一个值大于另一个值的所有情况,这将是很多。您可以使用
retryUntil
而不是
suchThat
,它将生成新值,直到条件得到满足,而不是丢弃值,但如果条件不太可能满足,则可能需要很长时间,甚至可能永远循环(想象一下,如果
low
的值非常高,您可能会循环很长时间以获得一个大于它的高值,或者如果您运气不好,将最大可能的双倍值设为low,则可能会一直循环

可以使用的是
Gen.choose(low,Double.MaxValue)
,它将在
low
Double.MaxValue
之间选择一个值(可能的最大双精度)


使用
choose
one/of
等方法限制生成器仅选择所需的值,通常比生成任何可能的任意值并丢弃或重试无效案例要好。仅当与总订单相比,只有极少数案例不符合您的标准时,才应这样做可能性和有效案例不容易用这些方法定义。

哦,谢谢,我完全误解了
的语义。非常感谢。
package com.foo.bar

import org.scalacheck._
import Prop._
import Arbitrary._

object FooSpecification extends Properties("FooIntervals") {

  type FooIntervals = (List[Double], List[Double])

  /* This is supposed to be a tuple of lists s.t. each element of _1
   *  is < the corresponding element of _2
   * 
   *  e.g. (List(1,3,5), List(2,4,6))
   */

  implicit def arbInterval : Arbitrary[FooIntervals] =
    Arbitrary {
      /**
        * Yields a pair (low, high) s.t. low < high
        */
      def GenPair : Gen[(Double, Double)] = for {
        low <- arbitrary[Double]
        high <- arbitrary[Double].suchThat(_ > low)
      } yield (low, high)

      /**
        * Yields (List(x_1,...,x_n), List(y_1,...,y_n))
        * where x_i < y_i forall i and 1 <= n < 20
        */
      for {
        n <- Gen.choose(1,20)
        pairs : List[(Double, Double)] <- Gen.containerOfN[List, (Double, Double)](n, GenPair)
      } yield ((pairs.unzip._1, pairs.unzip._2))
    }

  property("1 == 1") = forAll {
    (b1: FooIntervals)
    =>
    1 == 1
  }

  property("_1.head < _2.head") = forAll {
    (b1: FooIntervals)
    =>
    b1._1.head < b1._2.head
  }
}
[info] ! FooIntervals.1 == 1: Gave up after only 32 passed tests. 501 tests were discarded.
[info] ! FooIntervals._1.head < _2.head: Gave up after only 28 passed tests. 501 tests were discarded.
[info] ScalaTest
[info] Run completed in 1 second, 519 milliseconds.
[info] Total number of tests run: 0
[info] Suites: completed 0, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
[info] No tests were executed.
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error]     com.foo.bar.FooSpecification