Unit testing 如何通过基于属性的测试生成有意义的示例来测试n元属性?
在基于属性的测试设置(如Haskell的自定义数据结构快速检查)中,如何为关系的n元属性(如传递性或对称性)生成测试数据?我认为,实现语言并不重要Unit testing 如何通过基于属性的测试生成有意义的示例来测试n元属性?,unit-testing,testing,quickcheck,property-based-testing,Unit Testing,Testing,Quickcheck,Property Based Testing,在基于属性的测试设置(如Haskell的自定义数据结构快速检查)中,如何为关系的n元属性(如传递性或对称性)生成测试数据?我认为,实现语言并不重要 这里是一个天真的C++例子,(因为我现在手头有这个工具): 在这种幼稚的情况下,该工具不太可能生成许多前提(a==b)实际成立的示例,因此您最终会在无意义的测试上浪费大量精力。对于三元关系,如及物性,情况更糟 是否有解决这些问题的通用技术?我是否需要生成相等的对(对于“equals”的一些建设性定义)?那么订单之类的东西呢?我要做的是提高价值冲突的概
这里是一个天真的C++例子,(因为我现在手头有这个工具):
在这种幼稚的情况下,该工具不太可能生成许多前提(a==b
)实际成立的示例,因此您最终会在无意义的测试上浪费大量精力。对于三元关系,如及物性,情况更糟
是否有解决这些问题的通用技术?我是否需要生成相等的对(对于“equals”的一些建设性定义)?那么订单之类的东西呢?我要做的是提高价值冲突的概率,将价值生成限制在较小的范围内,有时将其与更通用的生成器结合起来 考虑以下发电机,其改编自:
@提供
任意键(){
返回任意(
介于(-25,25)之间的任意数.integers(),
任意数。整数()
);
}
生成将首先以相等的概率在任何整数和介于-25和+25之间的整数之间进行选择。因此,大约每100个值都是重复的
在更困难的情况下,我甚至可能有一个生成器,可以从一小组预定义的值中进行选择
更新:jqwik的最新版本允许以给定的概率显式生成副本:
不过,我不知道QuickCheck或任何其他PBT库是否具有类似的功能
rc::check("Double equality is symmetric.", [](double a, double b) {
RC_ASSERT(!(a == b) || (b == a)); // a == b ==> b == a
});
@Provide
Arbitrary<Integer> keys() {
return Arbitraries.oneOf(
Arbitraries.integers().between(-25, 25),
Arbitraries.integers()
);
}