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

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

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...
作为一个说明:我其实知道这个答案,但它可能对其他人有帮助,对这里的人来说也是一个挑战! - 稍后将发布我的答案。
0
额外 编辑
意见: 1
这不是一个WordPress问题。至少,不是你问过的方式。
额外 作者 Anonymous User,
这不是一个WordPress问题。至少,不是你问过的方式。
额外 作者 Anonymous User,
迈克是对的,需要更多的信息,否则愚蠢的答案,如“因为你有一个新的电子邮件!”出现在我的脑海里,我不认为这有帮助。
额外 作者 steve_mtl,
Abacus github 一个用于Node.JS,Python,PHP,Actionscript的组合库(ps我是作者)
额外 作者 Nikos M.,
Hi @Lea:请给我们更多的细节,以便1)我们可以有一个合理的机会来帮助你,并且2)让未来的配置和相同问题的其他人得到解答。例如,我假设你正在使用一个插件?是的,它是什么?你使用了什么设置?你在哪里举办?还有其他可能相关的东西。提前致谢。
额外 作者 MikeSchinkel,

11 答案

如果您使用的是 WP-DB管理器插件,请进入其选项并手动创建备份。如果失败,请检查错误消息并尝试找出可能出错的地方。如果你无法弄清楚,请在这里发布错误消息。

如果手动备份正常,则可能是电子邮件设置出错。检查所有电子邮件设置并确保它们是正确的。你用什么电子邮件提供商发送电子邮件(什么SMTP服务器)?您使用什么电子邮件提供商接收电子邮件(POP3或IMAP服务器)?

如果您没有使用WP-DB Manager,我们需要知道您如何进行这些备份以及您和其他人请求提供的所有信息。

1
额外

如果您使用的是 WP-DB管理器插件,请进入其选项并手动创建备份。如果失败,请检查错误消息并尝试找出可能出错的地方。如果你无法弄清楚,请在这里发布错误消息。

如果手动备份正常,则可能是电子邮件设置出错。检查所有电子邮件设置并确保它们是正确的。你用什么电子邮件提供商发送电子邮件(什么SMTP服务器)?您使用什么电子邮件提供商接收电子邮件(POP3或IMAP服务器)?

如果您没有使用WP-DB Manager,我们需要知道您如何进行这些备份以及您和其他人请求提供的所有信息。

1
额外

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

在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< x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

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

0
额外
@mkb当然。
额外 作者 nlucaroni,
“自我反思”是一个不正确的术语。它被称为“递归”,它是计算机科学的基础部分。问题中的“选择”功能是C(N,K), en.wikipedia.org/wiki/Binomial_coefficient
额外 作者 nlucaroni,
应该指出的是,x是基于1的,而不是像预期的那样基于0。
额外 作者 Andrew Savinykh,
choose()是做什么的?这基本上是否返回 n-c [i] 选择 p-(i + 1)1
额外 作者 mkb,
对不起,我不遵循选择行为。这听起来像它被定义为自我反思 - 选择确实是选择。你能以更简单的方式告诉我它做了什么吗?
额外 作者 CuppM,
即使c数组似乎是指设置元素为1基于而不是0基于。考虑到我们将c [i]从蝙蝠中递增,它永远不会引用第0个元素。或者我错过了什么?或者,OP是否意味着以-1启动c [i]并说选择(n-c [i] -1,...)?
额外 作者 Subu Sankara Subramanian,

有趣的问题!

我会通过选择组合来做到这一点,就像在Python中的以下内容。最难的部分可能是第一次通过验证,即如果f(1,2,3)返回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);
...
0
额外

我认为您可以使用行测试属性(可在MbUnit和更高版本的NUnit),您可以在其中指定几个集合来填充一个单元测试。

0
额外

使用全新的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()将元组或列表转换为集合,反之亦然。

0
额外

虽然可以创建大量测试数据并查看发生了什么,但尝试最小化正在使用的数据会更有效。

从典型的QA角度来看,您需要确定不同的输入分类。为每个分类生成一组输入值并确定适当的输出。

以下是一组输入值的示例

  • 有效三角形的数量很少,例如(10亿,2亿,20亿)
  • 包含大数字的有效三角形,例如(0.000001,0.00002,0.00003)
  • 几乎平坦的有效钝角三角形,例如(10,10,19.9999)
  • <10>几乎平坦的有效急性三角形,例如(10,10,0000001)
  • 至少有一个负值的无效三角形
  • 双方的总和等于第三个的无效三角形
  • 两边的总和大于第三个的无效三角形
  • 输入非数字值

...

一旦您对该功能的输入分类列表感到满意,您就可以创建实际的测试数据。很有可能,测试每个项目的所有排列会有所帮助。 (例如(2,3,4),(2,4,3),(3,2,4),(3,4,2),(4,2,3),(4,3,2))通常情况下,您会发现您错过了一些分类(例如inf作为输入参数的概念)。

一段时间内的随机数据也可能会有所帮助,它可以在代码中发现奇怪的错误,但通常效率不高。

更有可能的是,在应用附加规则的某些特定环境中使用此函数(例如,只有整数值或值必须以0.01为增量等)。这些函数将添加到输入参数分类列表中。

0
额外

以下是一个可能的问题:除其他外,请确保您的服务器上没有磁盘空间不足。备份程序将需要一点空间来压缩数据库,然后在数据库发送邮件之前压缩数据库。

0
额外

以下是一个可能的问题:除其他外,请确保您的服务器上没有磁盘空间不足。备份程序将需要一点空间来压缩数据库,然后在数据库发送邮件之前压缩数据库。

0
额外

我使用相同的插件(很长一段时间),这发生在我身上可能是2-3次。我从来没有能够找出原因。

在任何情况下,取消激活和重新激活插件为我解决了这个问题。

0
额外

我使用相同的插件(很长一段时间),这发生在我身上可能是2-3次。我从来没有能够找出原因。

在任何情况下,取消激活和重新激活插件为我解决了这个问题。

0
额外