kotlin - 是否有更简单的方法来使用基于 Kotest 属性的测试来测试所有排列?

标签 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...
        }

我希望使用详尽的生成器能够以这样一种方式生成它们,即通过 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...
        }

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

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

最佳答案

看来你想合并两个穷举。目前,一种方法是使用 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")
    }
}

关于kotlin - 是否有更简单的方法来使用基于 Kotest 属性的测试来测试所有排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63064837/

相关文章:

python - 对于假设策略,如何从 max_value 而不是 min_value 开始测试用例?

gradle - Kotlintest 中的数据表测试 - 高级方法名称和测试用例的传播

kotlin-coroutines - Kotest 与 kotlinx-coroutines-test 集成

eclipse - 无法运行Kotlin项目

kotlin - 如何反序列化格式为 "yyyy-mm-dd hh:mm:ss"的日期?

scala - 测试递归数据结构

Scalatest GeneratorDrivenPropertyChecks 初始化种子

kotlin - 如何使用 MicronautTest 和 Kotlintest 在测试时注入(inject) Bean?在 Kotlin 中

Android Kotlin registerForActivityResult 无回调

android - Retrofit2+Kotlin 如何在获取响应作为数据类时查看原始 json