我正在使用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运行的成功测试的最小数量-绝不意味着
使用minSuccessful(1)
scalacheck希望成功进行一次测试。它将样本从生成器中取出,直到测试至少运行一次(即,如果whenever
在测试主体中使用过滤生成的值,则scalacheck会采样,只要whenever
丢弃它们即可)。
如果测试通过,则scalacheck很高兴,不会再次运行测试。
但是,如果测试失败,则scalacheck将尝试生成一个最小的示例以使测试失败。只要失败,它就会收缩输入数据并运行测试,然后为您提供最小化的计数器示例,而不是触发初始故障的实际输入。
这是属性测试的重要属性,因为它可以帮助您发现错误:原始数据通常太大而无法进行调试。最小化它可以帮助您发现实际上触发故障的输入数据,即您未曾想到的诸如空字符串之类的极端情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句