【问题标题】:What is the best way of accessing all combinations访问所有组合的最佳方式是什么
【发布时间】:2011-04-08 21:09:33
【问题描述】:

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

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

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

  • 您可以使用糖或蜂蜜或不使用(3 个变量)

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

如您所见,现在如果我想测试所有可能的泡茶方法(假设有一个假设软件可以制作各种茶),那么我必须测试:3x2x3x2 组合 = 36,因为确实有36种独特的泡茶方法

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

【问题讨论】:

  • 我认为您的意思是组合,而不是排列。它们是两个不同的数学概念。
  • 是的,你是对的。对不起,我总是在两者之间混淆。让我看看我是否可以编辑这篇文章 - 我是新人:)
  • 不是一个与编程语言无关的问题。各种测试工具有不同的方法来处理排列。如果您想知道如何合二为一,请询问那个
  • 我想了解更多关于 Python 语言的知识,但是我觉得这是一个算法类型的问题,考虑更多关于算法的想法可能会很有用。但是,是的,特定语言的答案会更好!

标签: algorithm language-agnostic for-loop combinations


【解决方案1】:

它可能有点依赖于编程语言...但您基本上是在寻找一组参数的笛卡尔积。

例如,在 Python 中

import itertools

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

【讨论】:

  • 我想探索更多你提到的这个特性,因为我正在使用 Python,但我仍处于学习阶段。语言的这个特性叫什么?
  • itertools.product 计算笛卡尔积,它是每个给定序列中一个元素的组合。 function(*args) 被称为参数解包或喷溅 (stackoverflow.com/questions/2322355/…) 并扩展给定的项目序列并使用它们调用函数。
【解决方案2】:

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

值得注意的是,这对于大多数生产代码来说是不可行的,它们通常有几十个重要的输入,每个都有多个输入系列。

【讨论】:

  • 你的意思是不可行,因为组合会变得非常不稳定和庞大?就我而言,我测试了一个存储产品。所以是的,我确实必须限制我的变量,所以我尝试关注那些在测试某个特性时最重要的变量,并且我试图在所选变量中实现对该特性的完全覆盖
【解决方案3】:

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

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)

【讨论】:

  • 这是一个有趣的方法。所以在我泡茶的例子中,使用你的 Python 代码,我们如何将上述所有变量封装到“current_values”中。当前值可以是列表列表吗?
  • 当然。或者您可以花哨,让它们成为包含项目类型和可能值列表的对象。上面的 itertools 方法也等价于这个。
【解决方案4】:

基本上你正在形成一个矩阵......每个变量都是另一个维度。您只需将该矩阵自身相乘...

意思...嵌套循环可以很好地工作。

创建一些数组……然后开始吧!

【讨论】:

  • 矩阵在技术上总是二维的。编程术语就是多维数组,数学术语就是张量。
  • 太棒了!所以嵌套循环方法很好。目前虽然我在 python 中使用带有嵌套 for 循环的元组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2018-05-03
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多