如何使用组合的组合作为测试数据

我想用一组条纹和正常值的元组来测试一个函数。 例如,当测试一个返回true的函数时,无论何时给定三个长度形成一个有效的三角形,我都会遇到特定情况,负数/小数/大数,接近溢出的值等。 更重要的是,主要目标是产生这些值的组合,无论是否重复,以获得一组测试数据。

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

作为一个提示:我确实知道这个答案,但它可能对其他人有帮助,对这里的人来说也是一个挑战! - 稍后会发布我的答案。


当然,特别是处理很多这些排列/组合,我绝对可以看到第一遍是一个问题。

在Python中有趣的实现,虽然我在C和Ocaml基于“算法515”(见下文)写了一个很好的实现。 他在Fortran中撰写了他的论文,因为那时所有的“算法XX”论文都很常见,那就是程序集或c。 我不得不重新编写它,并进行一些小改进,以使用不包含数字范围的数组。 这是一个随机访问,我仍然在努力获得Knuth 4卷第2卷中提到的一些很好的实现。我将解释这是如何对读者起作用的。 虽然如果有人好奇,我不会反对写点东西。

/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = choose(n-c[i],p-(i+1));
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

〜“算法515:从词典索引中生成矢量”; Buckles,BP,and Lybanon,M. ACM Transactions on Mathematical Software,Vol。 3,第2号,1977年6月。


使用全新的Python 2.6,您可以使用itertools模块的标准解决方案来返回迭代的笛卡尔积:

import itertools

print list(itertools.product([1,2,3], [4,5,6]))
   [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]

您可以提供一个“重复”参数以使用迭代器本身来执行产品:

print list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

你也可以用组合来调整某些东西:

print list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]

如果订单很重要,则有排列:

print list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]

当然,所有那些很酷的东西并不完全一样,但是你可以以某种方式使用它们来解决你的问题。

请记住,您可以使用list(),tuple()和set()将元组或列表转换为集合,反之亦然。


有趣的问题!

我会通过选择组合来做到这一点,就像在Python中的以下内容。 最难的部分可能是首次通过验证,即if f(1,2,3) returns true ,那么结果是否正确? 一旦你证实了这一点,那么这是回归测试的良好基础。

可能这样做是一个好主意,可以让你知道的一组测试用例都是真实的(例如3,4,5这个三角形的情况),你知道的一组测试用例都是假的(例如0,1 ,INF)。 然后,您可以更轻松地验证测试是否正确。

# xpermutations from http://code.activestate.com/recipes/190465
from xpermutations import *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3):        # or xuniqueselections
    print c
(-1,-1,-1);
(-1,-1,0);
(-1,-1,1);
(-1,-1,5);
(-1,-1,10);
(-1,-1,0);
(-1,-1,1000);
(-1,-1,inf);
(-1,0,-1);
(-1,0,0);
...
链接地址: http://www.djcxy.com/p/85029.html

上一篇: How to use combinations of sets as test data

下一篇: Php recursion to get all possibilities of strings