访问所有组合的最佳方式是什么

时间:2011-04-08 21:09:33

标签: algorithm language-agnostic for-loop combinations

作为测试人员的工作,我的一个顾虑是始终确保完整的测试覆盖率。这可能会变得困难,因为有时可能的组合数量确实很多。让我们举一个例子。一个很好的制作茶的例子

  • 要泡茶,你可以使用红茶,绿茶或白茶。 (3个变量)

  • 您可以使用牛奶或水(2个变量)

  • 你可以使用糖或蜂蜜或没有(3个变量)

  • 你可以让它结冰或热(2个变量)

正如你所看到的,现在如果我想测试所有可能的制茶方法(假设有一个允许创造各种茶的假设软件),那么我必须测试:3x2x3x2组合= 36,因为确实有36种独特的制茶方式

在这种情况下哪种算法最好。我可以看到嵌套的for循环是最好的。我是对的吗?

4 个答案:

答案 0 :(得分:2)

它可能与编程语言有点相关......但你基本上是在寻找参数集的笛卡尔积。

例如,在Python中

import itertools

for args in itertools.product(
      ['black tea','green tea','white tea'],
      ['milk','water'],
      ['sugar','honey','none'],
      ['iced','hot']
   ): 
   drink_tea(*args)

答案 1 :(得分:1)

是的。嵌套的for循环最适合做所有可能的组合。

值得注意的是,对于大多数生产代码而言,这是不可行的,这些代码通常具有数十个重要输入,每个输入具有多个输入系列。

答案 2 :(得分:1)

嵌套循环可能会非常混乱。我已经递归地编写了测试生成器来避免这种情况并且也推广到多个维度。

fun build_test_args(possible_values, i, current_values):
     if i>len(possible_values):
         do_test(current_values)
     for value in possible_values[i]:
         cur_list = current_values + [value]
         build_test_args(possible_values, i+1, cur_list)

答案 3 :(得分:0)

基本上你正在形成一个矩阵......每个变量都是另一个维度。你只需将这个矩阵单独乘以...

含义......嵌套循环可以正常工作。

创建一些数组......并开始发声!