Каков наилучший способ доступа ко всем комбинациям - PullRequest
5 голосов
/ 09 апреля 2011

Как работа тестировщика, одна из моих задач - всегда обеспечивать полное тестовое покрытие. Это может быть сложно, так как иногда количество возможных комбинаций действительно много. Давайте возьмем пример для примера. Хороший старый пример заваривания чая

  • Для приготовления чая вы можете использовать черный чай, зеленый чай или белый чай. (3 переменных)

  • Вы можете использовать молоко или воду (2 переменных)

  • вы можете использовать сахар или мед или вообще ничего (3 переменных)

  • Вы можете иметь его со льдом или горячим (2 переменных)

Как видите, теперь, если я хочу протестировать все возможные способы заваривания чая (если предположить, что существует гипотетическое программное обеспечение, позволяющее создавать разнообразные чаи), тогда я должен проверить: комбинации 3x2x3x2 = 36, потому что действительно есть 36 уникальных способов заваривать чай

Какой алгоритм лучше в таком случае. Я вижу, что вложенный цикл является лучшим. Я прав?

Ответы [ 4 ]

2 голосов
/ 09 апреля 2011

Это может быть немного зависит от языка программирования ... но вы в основном ищете декартово произведение набора аргументов.

например, в 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 голос
/ 09 апреля 2011

Вложенные циклы могут быть довольно грязными. Я рекурсивно написал генераторы тестов, чтобы избежать этого, а также обобщил их для нескольких измерений.

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)
1 голос
/ 09 апреля 2011

Да. Вложенный цикл лучше всего подходит для всех возможных комбинаций.

Стоит отметить, что это неосуществимо для большей части производственного кода, который часто содержит десятки значимых входных данных, каждый из которых имеет несколько входных семейств.

0 голосов
/ 09 апреля 2011

В основном вы формируете матрицу ... с каждой переменной, являющейся другим измерением. Вы бы просто умножили эту матрицу на себя ...

ЗНАЧЕНИЕ ... вложенные циклы будут хорошо работать.

Создайте несколько массивов ... и начните крутиться!

...