在基于属性的测试设置(例如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
)实际存在的情况下生成许多示例,因此您最终在无意义的测试上浪费了很多精力。对于象传递性这样的三元关系,情况甚至更糟。
是否有解决这些问题的通用技术?我是否需要生成相等对(对于“相等”的一些建设性定义)?订单之类的东西呢?