【问题标题】:Is there a simpler way to test all permutations with Kotest property-based testing?有没有更简单的方法来使用 Kotest 基于属性的测试来测试所有排列?
【发布时间】:2020-11-13 19:17:57
【问题描述】:

我正在使用 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...
        }

我希望使用穷举生成器生成它们的方式是,通过 4 次迭代可以覆盖所有可能的排列。像这样:

a:1
b:2
a:2
b:1

相反,穷举生成器总是按如下所列顺序排列:

a:1
b:2
a:1
b:2

这意味着我要多次测试同一个案例。

我尝试将一些生成器切换到 Arbs,这确实会调高顺序,但不是最佳的。为了增加命中所有案例的可能性,我必须比使用正确的顺序进行更多的测试。

我也考虑过像这样多次列出同一个元素

"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...
        }

但这似乎不可持续,尤其是当我以后想添加更多参数或值时。

有没有办法生成详尽的排列,而不是继续循环遍历每个列表?

【问题讨论】:

  • 你可以试试jqwik的穷举生成功能,它可以满足你的需求; jqwik.net/docs/current/user-guide.html#exhaustive-generation
  • Kotest 4.2(尚未发布)具有对 Exhaustives 的自动跨产品支持。
  • Kotest 4.2 已经发布,它的工作方式与您想要的和上面描述的完全一样。
  • 感谢@sksamuel 的更新!我会看看。除了其他建议之外,我还检查了 propCheck/ArrowCheck。这个空间里似乎有很多很酷的东西。

标签: kotlin property-based-testing kotlintest kotest


【解决方案1】:

您似乎想合并两个穷举。目前,一种方法是使用Exhaustive.times,这将产生两个穷举的叉积:

Exhaustive.collection(listOf("a", "b"))
.times(Exhaustive.collection(listOf("1", "2"))
.checkAll(4) { (begins, contains) ->
    println("$begins:$contains")
}

但是,如果您的用例与您提出问题的用例相似,我建议改为 Kotest Inspectors

listOf("a", "b").forAll { first ->
    listOf("1", "2").forAll { second ->
        println("$first:$second")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2014-08-31
    • 1970-01-01
    • 2017-11-17
    • 2017-04-03
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多