jan*_*edn 4 kotlin property-based-testing kotlintest kotest
我正在使用 kotlin + Kotest 属性测试,并尝试使用列表生成器测试 2 个参数的所有排列,如下所示:
"Some test"{
forAll(4 ,
Exhaustive.collection(listOf(
"a",
"b")),
Exhaustive.collection(listOf(
"1",
"2"))
{ begins_with, contains ->
println("$begins_with:$contains")
... some validation code...
}
Run Code Online (Sandbox Code Playgroud)
我希望使用穷举生成器能够以这样的方式生成它们:通过 4 次迭代,所有可能的排列都将被覆盖。像这样:
a:1
b:2
a:2
b:1
Run Code Online (Sandbox Code Playgroud)
相反,详尽的生成器总是按照列出的顺序排列,如下所示:
a:1
b:2
a:1
b:2
Run Code Online (Sandbox Code Playgroud)
这意味着我正在多次测试同一个案例。
我尝试过将一些生成器切换到 Arb,这确实会切换顺序,但不是最佳状态。为了增加命中所有情况的可能性,我必须进行比使用正确顺序时更多的测试。
我也考虑过像这样多次列出相同的元素
"Some test"{
forAll(4 ,
Exhaustive.collection(listOf(
"a",
"b")),
Exhaustive.collection(listOf(
"1",
"1",
"2",
"2"))
{ begins_with, contains ->
println("$begins_with:$contains")
... some validation code...
}
Run Code Online (Sandbox Code Playgroud)
但这似乎不可持续,尤其是当我想稍后添加更多参数或值时。
有没有办法生成详尽的排列,而不是继续循环每个列表?
看来你想合并两个详尽的内容。目前,实现此目的的一种方法是使用Exhaustive.times,它将产生两个详尽的叉积:
Exhaustive.collection(listOf("a", "b"))
.times(Exhaustive.collection(listOf("1", "2"))
.checkAll(4) { (begins, contains) ->
println("$begins:$contains")
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您的用例与您提出的问题类似,我建议使用KotestInspectors:
listOf("a", "b").forAll { first ->
listOf("1", "2").forAll { second ->
println("$first:$second")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |