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

nlucaroni 20 language-agnostic testing unit-testing

我想测试一个带有一组边缘情况和正常值的元组的函数.例如,在测试一个函数,该函数true在给定三个形成有效三角形的长度时返回,我将具有特定情况,负数/小数/大数,接近溢出的值等等; 更重要的是,主要目的是生成这些值的组合,没有重复,以获得一组测试数据.

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

作为一个注释:我实际上知道答案,但它可能对其他人有帮助,对这里的人们来说是一个挑战! - 稍后会发布我的回答.

nlucaroni.. 15

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

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和Lybanon,M.ACM数学软件交易,卷.1977年6月3日第2号.

  • 应该注意的是,x是基于1的,而不是基于预期的0. (2认同)