Scala 重写的specs2测试框架将自动化测试与scalacheck集成在一起.specs2文档中给出的关于如何将scalacheck与specs2一起使用的示例使用整数或更复杂的自定义生成器,如eric的json示例中所示.
虽然试图让一个稍微不那么复杂的例子工作,但我很难挣扎,因为我不知道如果我想生成String参数而不是Integers,会如何使用specs2和scalacheck.这个快速入门示例如何?
import org.scalacheck._
object StringSpecification extends Properties("String") {
property("startsWith") = Prop.forAll((a: String, b: String)
=> (a+b).startsWith(a))
property("endsWith") = Prop.forAll((a: String, b: String)
=> (a+b).endsWith(b))
// Is this really always true?
property("concat") = Prop.forAll((a: String, b: String) =>
(a+b).length > a.length && (a+b).length > b.length
)
property("substring") = Prop.forAll((a: String, b: String) =>
(a+b).substring(a.length) == b
)
property("substring") = Prop.forAll((a: String, b: String, c: String) =>
(a+b+c).substring(a.length, a.length+b.length) == b
) …
Run Code Online (Sandbox Code Playgroud) 除了一些随机值之外,我想让我的所有属性始终至少使用一组固定的特殊值进行测试.我想在我的生成器规范中定义它,而不是在使用该生成器类型的每个测试中定义.例如,如果我生成Ints,我希望我的生成器始终为每个测试用例生成至少0,1和-1.这可能吗?
我想出了迄今为止最好的是做一个大小发电机,其中最小的ñ大小对应于我ñ特殊情况.这是有问题的,至少因为当最大测试次数配置为低于max size参数时,不测试所有可能的大小.
我写了以下规范
"An IP4 address" should "belong to just one class" in {
val addrs = for {
a <- Gen.choose(0, 255)
b <- Gen.choose(0, 255)
c <- Gen.choose(0, 255)
d <- Gen.choose(0, 255)
} yield s"$a.$b.$c.$d"
forAll (addrs) { ip4s =>
var c: Int = 0
if (IP4_ClassA.unapply(ip4s).isDefined) c = c + 1
if (IP4_ClassB.unapply(ip4s).isDefined) c = c + 1
if (IP4_ClassC.unapply(ip4s).isDefined) c = c + 1
if (IP4_ClassD.unapply(ip4s).isDefined) c = c + 1
if (IP4_ClassE.unapply(ip4s).isDefined) c = c + …
Run Code Online (Sandbox Code Playgroud) 在类似这样的上下文中,生成非空字符串的最佳方法是什么
private def createIndexFn() = {
for{
someChar <- Gen.alphaString
aNumber <- Gen.choose(1,100)
//...
}
yield {
MyThing(AnotherType(someChar.toString), SomeOtherType(aNumber), aNumber)
}
}
Run Code Online (Sandbox Code Playgroud)
你需要的地方也许someChar是一个非空字符串.我知道你可以whenever
在这forAll
部分使用,但我想知道如何在发电机的这一部分做.
谢谢
我在ScalaCheck 用户指南中读到它是测试Scala和Java程序的工具.
我想知道,这只是营销,还是测试仅使用Java的代码库是一个合理的想法?如果是这样,将它与Java项目集成的最佳方法是什么?
我需要生成长度相同的字符串.我怎么也想不到.非常感谢
val s = for {
x <- Gen.alphaStr
} yield ...
Run Code Online (Sandbox Code Playgroud) 我想生成一个与生成器列表对应的整数列表ScalaCheck
.
import org.scalacheck._
import Arbitrary.arbitrary
val smallInt = Gen.choose(0,10)
val bigInt = Gen.choose(1000, 1000000)
val zeroOrOneInt = Gen.choose(0, 1)
val smallEvenInt = smallInt suchThat (_ % 2 == 0)
val gens = List(smallInt, bigInt, zeroOrOneInt, smallEvenInt)
//val listGen: Gen[Int] = ??
//println(listGen.sample) //should print something like List(2, 2000, 0, 6)
Run Code Online (Sandbox Code Playgroud)
对于给定的gens
,我想创建一个listGen
有效样本的生成器List(2, 2000, 0, 6)
.这是我第一次尝试使用元组.
val gensTuple = (smallInt, bigInt, zeroOrOneInt, smallEvenInt)
val tupleGen = for {
a <- gensTuple._1
b <- gensTuple._2 …
Run Code Online (Sandbox Code Playgroud) 我添加了以下内容build.sbt
:
libraryDependencies <<= scalaVersion { scala_version => Seq(
<other entries>
"org.scalacheck" %% "scalacheck" % "1.10.0" % "test",
<other entries>
)
}
Run Code Online (Sandbox Code Playgroud)
当compile
在SBT项目,依赖被成功解析为可以在日志中可以看出:
[info] Resolving org.scalacheck#scalacheck_2.9.1;1.10.0 ...
...
Done updating
Run Code Online (Sandbox Code Playgroud)
但是,在编译一个文件时出现以下错误.
object scalacheck is not a member of package org
import org.scalacheck.Gen
^
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因?
有没有办法看到sbt在compile
任务期间使用的类路径?
Sbt version: 0.11.2
OS: Windows 7
Scala version: 2.9.1
Run Code Online (Sandbox Code Playgroud)
请注意,该项目在ScalaIDE中构建良好.(我使用sbteclipse生成eclipse .classpath
文件.生成的.classpath
具有正确的scalacheck条目.)
我想使用scalacheck使用基于属性的测试来测试我的scala程序.我写 :
class MyProperties extends PropSpec with PropertyChecks {
property("My property") {
val myProperty: org.scalacheck.Prop = new MyProperty
// some code I need to set myProperty
myProperty.check
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎是错的,因为当我使用ScalaTest运行这个类时,我进入控制台:
Run starting. Expected test count is: 1
MyProperties:
! Falsified after 51 passed tests.
> ARG_0: myGeneratedArgument
- My property
Run completed in 1 second, 623 milliseconds.
Total number of tests run: 1
Suites: completed 1, aborted 0
Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
All …
Run Code Online (Sandbox Code Playgroud) 我是第一次尝试ScalaCheck,我想生成一个有序的Ints数组.
我阅读了文档并做了一些搜索,但我找不到办法.
有人可以对此有所了解吗?
谢谢
scalacheck ×10
scala ×9
scalatest ×2
unit-testing ×2
eclipse ×1
java ×1
sbt ×1
specs ×1
specs2 ×1