在基于属性的测试设置中,例如 Haskell 对自定义数据结构的快速检查,您如何为关系的 n 元属性(例如传递性或对称性)生成测试数据?我认为,实现语言无关紧要。
这是一个使用rapidcheck的幼稚 C++ 示例(只是因为我现在手头有这个工具):
rc::check("Double equality is symmetric.", [](double a, double b) {
RC_ASSERT(!(a == b) || (b == a)); // a == b ==> b == a
});
在这种幼稚的情况下,该工具不太可能生成许多前提 ( a == b
) 实际成立的示例,因此您最终会在无意义的测试上浪费大量精力。对于像传递性这样的三元关系,情况会变得更糟。
是否有解决这些问题的通用技术?我是否需要生成相等的对(对于“等于”的一些建设性定义)?订单之类的东西呢?