Как использовать комбинации наборов в качестве тестовых данных - PullRequest
20 голосов
/ 03 августа 2008

Я хотел бы протестировать функцию с кортежем из набора дополнительных случаев и нормальных значений. Например, при тестировании функции, которая возвращает true всякий раз, когда даны три длины, которые образуют действительный треугольник, я бы имел конкретные случаи, отрицательные / маленькие / большие числа, значения, близкие к переполнению, и т. Д .; более того, основная цель - создать комбинации этих значений, с или без повторений, чтобы получить набор тестовых данных.

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

Как примечание: я действительно знаю ответ на этот вопрос, но он может быть полезен для других, и вызов для людей здесь! - позже опубликую мой ответ.

Ответы [ 5 ]

15 голосов
/ 03 августа 2008

Абсолютно, особенно имея дело с множеством этих перестановок / комбинаций, я определенно вижу, что первый проход будет проблемой.

Интересная реализация в python, хотя я написал хорошую для C и Ocaml на основе "Алгоритма 515" (см. Ниже). Он написал его на Фортране, поскольку это было обычным делом для всех работ «Алгоритм XX», ну, в общем, для той сборки или с. Мне пришлось переписать его и сделать несколько небольших улучшений для работы с массивами, а не диапазонами чисел. Это случайный доступ, я все еще работаю над получением хороших реализаций тех, что упомянуты в 4-м томе Knuth тома 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<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = choose(n-c[i],p-(i+1));
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

~ «Алгоритм 515: генерация вектора из лексикографического индекса»; Баклс, Б. П., и Ливан, М. Транзакции ACM по математическому программному обеспечению, Vol. 3, № 2, июнь 1977 года.

4 голосов
/ 04 октября 2008

С совершенно новым 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)]

Вы можете предоставить аргумент "repeat" для выполнения продукта с итерацией и самим собой:

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 ().

3 голосов
/ 03 августа 2008

Интересный вопрос!

Я бы сделал это, выбрав комбинации, что-то вроде следующего в python. Самая сложная часть - это, вероятно, проверка первого прохода, т. Е. if f(1,2,3) returns true, это правильный результат? Как только вы это подтвердите, это хорошая основа для регрессионного тестирования.

Вероятно, хорошей идеей будет сделать набор тестовых случаев, которые, как вы знаете, будут истинными (например, 3,4,5 для этого случая треугольника), а набор тестовых примеров, которые, как вы знаете, будут ложными (например, 0,1, инф). Тогда вам будет проще проверить правильность тестов.

# 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);
...
2 голосов
/ 16 августа 2008

Я думаю, что вы можете сделать это с Атрибутом теста строки (доступен в MbUnit и более поздних версиях NUnit), где вы можете указать несколько наборов для заполнения одного модульного теста.

0 голосов
/ 17 сентября 2008

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

С типичной точки зрения обеспечения качества вы хотели бы определить различные классификации входных данных. Создайте набор входных значений для каждой классификации и определите соответствующие выходные данные.

Вот пример классов входных значений

  • действительных треугольников с небольшими числами, таких как (1 миллиард, 2 миллиарда, 2 миллиарда)
  • допустимые треугольники с большими числами, такие как (0,000001, 0,00002, 0,00003)
  • допустимые тупые треугольники, которые «почти» плоские, такие как (10, 10, 19.9999)
  • действительные острые треугольники, которые «почти» плоские, такие как (10, 10, 0000001)
  • неверные треугольники с хотя бы одним отрицательным значением
  • неверных треугольников, где сумма двух сторон равна третьей
  • недопустимые треугольники, где сумма двух сторон больше, чем третья
  • входные значения, которые не являются числовыми

...

Как только вы будете удовлетворены списком входных классификаций для этой функции, вы можете создать фактические тестовые данные. Вероятно, было бы полезно проверить все перестановки каждого элемента. (например, (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) Как правило, вы обнаружите, что вы пропустили некоторые классификации (например, понятие inf как входной параметр).

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

Скорее всего, эта функция используется в некотором конкретном контексте, где применяются дополнительные правила (например, только целочисленные значения или значения должны быть с шагом 0,01 и т. Д.). Они добавляют к списку классификаций входных параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...