程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Kotest - 生成无重复的详尽对象排列大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Kotest - 生成无重复的详尽对象排列?

开发过程中遇到Kotest - 生成无重复的详尽对象排列的问题如何解决?下面主要结合日常开发的经验,给出你关于Kotest - 生成无重复的详尽对象排列的解决方法建议,希望对你解决Kotest - 生成无重复的详尽对象排列有所启发或帮助;

我希望能够生成对象的详尽排列。想象以下对象

data class Person (name: String,age: int)

出于测试目的,我想将 name 限制为 3 值。 @H_552_5@mohAMMad、NasirRasulage4 值。 10203040。我想生成 12 个对象,其中每个名称都有 4 个年龄。

我可以生成一个 arbitrary 绑定,但这并不能保证 12 迭代每个都有一个唯一的对象。我必须增加迭代次数,并清除重复项。

    val List = Arb.bind(
        listof("Nasir","Rasul","MohAMMad").exhaustive(),listof(10,20,30,40).exhaustive()
    ) { name,age -> Person(name,agE) }

    "Test person " - {
        runBlocking {
            List.checkAll(12) {
                System.out.println("TesTing $it")
                assertTrue(it.age < 50)
            }
        }
    }

查看源代码,我似乎找不到方法。我希望社区中有人需要这个。

谢谢。

注意:我正在寻找一种使用 Exhaustive 生成器而不是 Arb 生成器的方法。我可以进行一些后期处理并删除重复项,但我希望有一些更可靠、独特的前期工作。

Example outout:

TesTing Person(name=MohAMMad,age=40)
TesTing Person(name=Nasir,age=20)
TesTing Person(name=Rasul,age=30)
TesTing Person(name=MohAMMad,age=10)
TesTing Person(name=Rasul,age=10)
TesTing Person(name=Nasir,age=40)
TesTing Person(name=Rasul,age=30)

注意 Rasul:40 是重复的。 @H_552_5@mohAMMad:10 错过了。

基于@Tenfour04 评论的一种可能的解决方案是使用 times 和 @H_552_5@map。尽管对于我的字段,映射变得很复杂,因为我们将有 PairsPairs 以及 Pairs 需要处理。

    "Test cross product" - {
        val times = Exhaustive.collection(listof("Nasir","Rasul"))
            .times(Exhaustive.collection(listof(10,20)))
            .map { Person(it.first as String,it.second) }
        runBlocking {
            times.checkAll(4) {
                println("$it")
            }
        }
    }

解决方法

您可以通过映射每个组件中的每个值并将它们组合成一个新的 Exhaustive 来实现。例如,如果您想要为以下三个组件生成所有组合:

fun <A,B,C,D> cartesian(
   a: Exhaustive<A>,b: Exhaustive<B>,c: Exhaustive<C>,f: (A,C) -> D
): Exhaustive<D> {
   val ds = a.values.flatMap { _a ->
      b.values.flatMap { _b ->
         c.values.map { _c ->
            f(_a,_b,_C)
         }
      }
   }
   return ds.exhaustive()
}

然后可以在测试中使用穷举(对于 arity-2 等,依此类推)。

以下是您如何将其用于人物示例。

val persons = cartesian(
   Exhaustive.collection(listOf("Nasir","Rasul")),Exhaustive.collection(listOf(10,20))
) { a,b -> Person(a,b) }

checkAll(persons) { person -> .... test here .... }

注意:上述功能存在于 Kotest 4.5 中,在撰写本文时尚未发布。 https://github.com/kotest/kotest/blob/master/kotest-property/src/commonMain/kotlin/io/kotest/property/exhaustive/cartesian.kt

大佬总结

以上是大佬教程为你收集整理的Kotest - 生成无重复的详尽对象排列全部内容,希望文章能够帮你解决Kotest - 生成无重复的详尽对象排列所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-