有没有更简单的方法可以通过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,"1","2",contains ->
            println("$begins_with:$contains")
            ... some validation code...
        }

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

有没有一种方法可以生成详尽的排列,而不仅仅是继续遍历每个列表?

iCMS 回答:有没有更简单的方法可以通过Kotest基于属性的测试来测试所有排列?

似乎您想合并两个穷举。当前,一种实现方法是使用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")
    }
}
本文链接:https://www.f2er.com/1874929.html

大家都在问