如何在Scalatest中使用forAll仅生成生成器的一个对象?

我正在使用scalatest和scalacheck,也正在使用FeatureSpec。

我有一个生成器类,可以为我生成类似于以下内容的对象:

object InvoiceGen {

  def myObj = for {

    country <- Gen.oneOf(Seq("France", "Germany", "United Kingdom", "Austria"))
    type <- Gen.oneOf(Seq("Communication", "Restaurants", "Parking"))
    amount <- Gen.choose(100, 4999)
    number <- Gen.choose(1, 10000)
    valid <- Arbitrary.arbitrary[Boolean]

  } yield SomeObject(country, type, "1/1/2014", amount,number.toString, 35, "something", documentTypeValid, valid, "")

现在,我有了与FeatureSpec一起使用的测试类以及运行测试所需的一切。

在此类中,我有一些方案,在每种情况下,我都想生成一个不同的对象。从我的理解是,生成对象最好使用forAll函数,但是对于所有人都不能肯定会带来一个对象,因此可以添加minSuccessful(1)以确保您到达列表1对象... 。

我这样做是这样的,它的工作原理是:

scenario("some scenario") {
      forAll(MyGen.myObj, minSuccessful(1)) { someObject =>
        Given("A connection to the system")
        loginActions shouldBe 'Connected

        When("something")
        //blabla
        Then("something should happened")
        //blabla
      }
    }

但我不确定确切是什么意思。我想要的是在每种情况下生成发票并对其进行一些操作...我不确定为什么我关心生成工作还是不工作...我只希望生成的对象可以使用。

卢纳隆

TL; DR:要仅获得一个对象,请使用myObj.sample.get除非您的发电机正在做一些完全安全且不会爆炸的幻想。

我认为您的意图是对某些随机生成的域对象运行某种集成/验收测试,换句话说,将scalacheck用作简单的数据生成器,并且希望minSuccessful(1)该测试只能运行一次。

请注意,事实并非如此如果scalacheck失败,它将多次运行测试,以尝试将输入数据缩小到最小的反例。

如果您想确保测试只能运行一次,则必须使用sample

但是,如果多次运行测试很好,则最好minSuccessful(1)“快速成功”,但如果测试失败,仍然可以从最小化的反例中受益。


Gen.sample返回一个选项,因为生成器可能失败

ScalaCheck生成器可能会失败,例如,如果您要添加过滤器(listingGen.suchThat(...)),并且该失败是使用Option类型建模的。

但:

[…]如果您确定生成器永远不会失败,则可以像在上面的示例中一样简单地调用Option.get。或者,您可以使用Option.getOrElse将None替换为默认值。

通常,如果您的生成器很简单,即不使用可能会失败的生成器,并且自己不使用任何过滤器,那么只需调用.get由返回的选项是绝对安全.sample我过去一直在这样做,从来没有遇到过问题。如果您的生成器经常None从中返回.sample则可能会使scalacheck也无法成功生成值。

如果只需要一个对象,请使用Gen.sample.get


minSuccessful有一个非常不同的含义:scalacheck运行的成功测试最小数量-绝不意味着

  • scalacheck仅从生成器中取出一个值,或者
  • 该测试仅运行一次。

使用minSuccessful(1)scalacheck希望成功进行一次测试。它将样本从生成器中取出,直到测试至少运行一次(即,如果whenever在测试主体中使用过滤生成的值,则scalacheck会采样,只要whenever丢弃它们即可)。

如果测试通过,则scalacheck很高兴,不会再次运行测试。

但是,如果测试失败,则scalacheck将尝试生成一个最小的示例以使测试失败。只要失败,它就会收缩输入数据并运行测试,然后为您提供最小化的计数器示例,而不是触发初始故障的实际输入。

这是属性测试的重要属性,因为它可以帮助您发现错误:原始数据通常太大而无法进行调试。最小化它可以帮助您发现实际上触发故障的输入数据,即您未曾想到的诸如空字符串之类的极端情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将一个元组的Python生成器拆分为2个单独的生成器?

来自分类Dev

python,生成器迭代一个或多个项目

来自分类Dev

使一个随机的mac地址生成器仅生成单播mac

来自分类Dev

如何传递一个空的生成器参数?

来自分类Dev

如何在另一个生成器函数中访问koa上下文?

来自分类Dev

如何创建一个使用种子创建3个数字的Java随机数生成器?

来自分类Dev

使用另一个python生成器对生成的数字进行排序

来自分类Dev

如何在Rails中使用生成器生成自定义表单

来自分类Dev

如何为Hibernate中的每个公司创建一个customerNumber生成器

来自分类Dev

如何编写一个简单的“页面错误生成器”?

来自分类Dev

令牌生成器仅打印第一个令牌

来自分类Dev

如何在Django模板中使用生成器方法?

来自分类Dev

如何在fileinput对象的openhook内使用生成器?

来自分类Dev

PHP-json_encode一个生成器对象(使用yield)

来自分类Dev

如何在Laravel中使用Remember()方法使用查询生成器缓存查询?

来自分类Dev

如何定义一个ScalaCheck生成器来生成序列元素的子集?

来自分类Dev

如何在Python中使用生成器比较可迭代对象?

来自分类Dev

我如何在python中使用生成器时迭代类对象?

来自分类Dev

如何在ARCore中使用多个对象生成一个对象?

来自分类Dev

如何在phpMyAdmin中使用查询视觉生成器

来自分类Dev

如何构建一个简单的令牌生成器

来自分类Dev

Python生成器返回最后一个项目

来自分类Dev

需要一个简单的线梯度生成器

来自分类Dev

使用另一个python生成器对生成的数字进行排序

来自分类Dev

令牌生成器仅打印第一个令牌

来自分类Dev

如果使用Postgre,如何在laravel的查询生成器中使用** distinct on()**?

来自分类Dev

App Generator:如何声明一个变量以在整个生成器中使用?

来自分类Dev

在不使用 Thread.sleep() 的情况下,如何在我的 run 方法中制作一个每 __ 秒生成 1 ____ 的生成器?

来自分类Dev

我想创建一个生成器来生成任意两个输入生成器的交集

Related 相关文章

  1. 1

    如何将一个元组的Python生成器拆分为2个单独的生成器?

  2. 2

    python,生成器迭代一个或多个项目

  3. 3

    使一个随机的mac地址生成器仅生成单播mac

  4. 4

    如何传递一个空的生成器参数?

  5. 5

    如何在另一个生成器函数中访问koa上下文?

  6. 6

    如何创建一个使用种子创建3个数字的Java随机数生成器?

  7. 7

    使用另一个python生成器对生成的数字进行排序

  8. 8

    如何在Rails中使用生成器生成自定义表单

  9. 9

    如何为Hibernate中的每个公司创建一个customerNumber生成器

  10. 10

    如何编写一个简单的“页面错误生成器”?

  11. 11

    令牌生成器仅打印第一个令牌

  12. 12

    如何在Django模板中使用生成器方法?

  13. 13

    如何在fileinput对象的openhook内使用生成器?

  14. 14

    PHP-json_encode一个生成器对象(使用yield)

  15. 15

    如何在Laravel中使用Remember()方法使用查询生成器缓存查询?

  16. 16

    如何定义一个ScalaCheck生成器来生成序列元素的子集?

  17. 17

    如何在Python中使用生成器比较可迭代对象?

  18. 18

    我如何在python中使用生成器时迭代类对象?

  19. 19

    如何在ARCore中使用多个对象生成一个对象?

  20. 20

    如何在phpMyAdmin中使用查询视觉生成器

  21. 21

    如何构建一个简单的令牌生成器

  22. 22

    Python生成器返回最后一个项目

  23. 23

    需要一个简单的线梯度生成器

  24. 24

    使用另一个python生成器对生成的数字进行排序

  25. 25

    令牌生成器仅打印第一个令牌

  26. 26

    如果使用Postgre,如何在laravel的查询生成器中使用** distinct on()**?

  27. 27

    App Generator:如何声明一个变量以在整个生成器中使用?

  28. 28

    在不使用 Thread.sleep() 的情况下,如何在我的 run 方法中制作一个每 __ 秒生成 1 ____ 的生成器?

  29. 29

    我想创建一个生成器来生成任意两个输入生成器的交集

热门标签

归档