我有一个简短的(Java)方法,它有几个参数,可以执行一些非直观的计算。为该方法编写单元测试以实现代码覆盖率是微不足道的,但测试并不涵盖该方法的微妙之处。我正在寻找一个测试框架或其他一些工具,它们将允许我基于我为参数定义的分区对此方法进行所有对(所有元组)测试。
例如,假设我有以下方法:
int foo(int begin, int end, int first, int last) {
...
}我已经知道一些约束,这些约束可能是外部强制的:
begin <= end
first <= last我想基于我自己对参数的了解来定义显式的等价关系。例如:
begin == MIN
begin > MIN && begin < 0
begin == 0
begin == 1
begin > 1 && begin < MAX
begin == MAX我还想定义涉及多个参数的等价关系。例如:
begin + 1 < end
begin + 1 == end
begin == end要测试的组合是从每个等价关系(例如,来自第一关系的begin == 0和来自第二关系的begin + 1 < end )中选择等价类,使得约束是可满足的。顺便说一句,我意识到可满足性是NP完全的。考虑到包含相对较小的约束集的组合,我愿意接受它。有了几个参数,组合的数量就变得很难用了。手动为每种组合编写一个测试,并找到满足结果约束集的参数是乏味的,而且容易出错。
我正在寻找一个测试框架,可以自动测试每个组合,或者一个测试生成器,可以为每个逻辑上一致的组合生成测试(不变检查由您真正插入)。这与CodePro等测试生成工具不同,测试生成工具从实际实现生成测试用例。实际上,我希望为方法的接口生成测试,而不是为其实现生成测试。这不仅允许我在方法实现(TDD)之前编写测试,而且还可以确保方法即使在后来的修改之后也能得到全面的测试。
这样的工具是否存在,或者可以将某些东西拼凑在一起?或者我用错了方法,而你有另一个建议...
发布于 2012-05-29 21:45:43
有关这方面的一些想法,请参阅David Saff's work on Theory Testing。
发布于 2012-05-29 18:33:24
简单的嵌套循环(每次循环迭代都会调用一个测试方法)难道不符合要求(至少在很大程度上符合要求)吗?
类似于:
int[] ends = new int[] {-50, -10, -1, 0, 1, 50, MIN, MAX};
for (int end : ends) {
int[] begins = new int[] {end - 10, end - 1, end, MIN, MAX};
for (int begin : begins) {
if (begin <= end && begin >= MIN && begin <= MAX) {
testFoo(begin, end);
}
}
}发布于 2012-05-30 19:14:51
你能在你的测试框架之外使用工具吗?如果是这样的话,我已经使用了James Bach's AllPairs,效果很好。还有Hexawise。
如果你没有意识到这一点,http://pairwise.org是一个阅读成对和组合测试和工具的好地方!
https://stackoverflow.com/questions/10796852
复制相似问题