测试n个项目时,如何用尽可能少的s-子集覆盖所有t-子集?


10

此问题源于软件测试。这个问题有点难以解释。我将首先给出一个示例,然后尝试概括该问题。

共有10个要测试的项目,例如A到J,以及一个可以同时测试3个项目的测试工具。测试工具中项目的顺序无关紧要。当然,要进行详尽的测试,我们需要10 C 3的项目组合。10C3

问题比较复杂。还有一个附加条件是,一旦一对项目一起测试过,就不需要再对同一对进行测试。

例如,一旦我们执行以下三个测试:

美国广播公司

ADE

BDF

我们不必执行:

ABD

因为第一个测试用例覆盖了A,B对,第二个覆盖了A,D,第三个覆盖了B,D。

因此,问题在于,我们需要确保所有对都经过测试的最小测试用例数量是多少?

概括地说,如果我们有n个项目,则可以同时测试s,并且我们需要确保测试所有可能的t元组(使得s> t),我们需要的最小测试用例数是多少? n,s和t的项?

最后,什么是生成所需测试用例的良好算法?


1
块设计的概念涵盖了测试是“最佳”的情况(每个仅被测试一次)。这些完美的测试可能性相对较少,所以我猜想,还需要其他启发式方法。t
Hendrik 2013年1

您的测试范例有问题;仅测试对可能还不够。仅当三个(或更多)组件以特定的组合方式共同作用时,才可能发生某些错误。
拉斐尔

4
@Raphael,感谢您提供的更好的标题,但是我完全不理解您对实际问题或实际情况的零了解如何声称“您的测试范式是错误的”。
wookie919

@ wookie919那是因为您没有提供任何上下文,而是提出了一个普遍的问题。我只是观察到,通常来说,您可能需要测试所有可能发生的组合(实际上)。
拉斐尔

Answers:


11

您想要的模块设计(一次测试3项,并涵盖所有对)被称为Steiner三元系统。存在一个带有1的Steiner三元系统三元组每当Ñ1ö- [R36,和算法是已知的构造这些。例如,请参见此MathOverflow问题(带有指向有效的Sage代码的链接!)。对于其他Ñ,可以向上舍入到下一个Ñ'1ö- [R36,并且使用该三重系统的变形例为Ñ'以覆盖所有对Ñ13(n2)n1 or 36nn1 or 36nn

n C(n,3,2)C(n,3,2); 如果这个公式成立,从直觉上讲,这意味着可能应该有很好的算法来构造这些覆盖物,但是由于该公式是推测的,因此很明显,目前尚无人知道它们。

C(n,3,2)


5

GG=(V,E)V={{a,b}:a,bItemsab}E={(s,t):s,tV|st|=1}(n2)2n4

G({A,B},{B,C})EABC(n2)/21.5


4

s=3t=2(n2)/3(n2)(n2)

如果您实际上是对此进行编程,那么可以通过首先随机选择一些数字测试,然后对到目前为止尚未覆盖该测试的对进行强力测试来优化此方法。


st(nt)/(st)C(nt)(st)log((nt))O(t(ntst)tlog(n))

sS[n]tX[n]Pr[XS]=(ntst)(ns)C(nt)log((nt))

Pr[X does not belong to any of them]=(1(ntst)(ns))C(nt)log((nt))exp(C(ntst)(nt)(ns)(st)log((nt)))=exp(Clog(nt))1/(nt).

O(t(ntst)tlog(n))t


(nt)/s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.