Как использовать комбинации наборов в качестве тестовых данных

голоса
18

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

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

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

Задан 02/08/2008 в 22:34
источник пользователем
На других языках...                            


5 ответов

голоса
14

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

Интересная реализация в Python, хотя я написал хороший один в C и OCaml, основанный на «Алгоритм 515» (см. Ниже) Он написал его в Fortran, как это было распространено тогда для всех работ «Алгоритм XX», хорошо, что сборки или с. Я должен был переписать его и сделать несколько небольших улучшений для работы с массивами не диапазоны чисел. Это один делает случайный доступ, я все еще работаю над несколько хороших реализаций тех, которые упомянуты в Кнут четвёртую объема главке 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: Генерация вектора из индекса лексикографического»; Пряжки, BP, и Lybanon М. ACM Сделки по математическому Software, Vol. 3, № 2, июнь 1977.

Ответил 03/08/2008 в 20:06
источник пользователем

голоса
4

С новенькой 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)]

Вы можете обеспечить «повторить» аргумент для выполнения продукта с итератор и сам по себе:

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)]

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

Просто помните, что вы можете преобразовать кортеж или список набора, и наоборот, используя список (), кортеж () и множество ().

Ответил 04/10/2008 в 09:52
источник пользователем

голоса
4

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

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

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

# xpermutations от http://code.activestate.com/recipes/190465
от xpermutations импорта *

длины = [- 1,0,1,5,10,0,1000, 'инф']
для с в xselections (длины, 3): # или xuniqueselections
    печать с
(-1, -1, -1);
(-1, -1,0);
(-1, -1,1);
(-1, -1,5);
(-1, -1,10);
(-1, -1,0);
(-1, -1,1000);
(-1, -1, инф);
(-1,0, -1);
(-1,0,0);
...
Ответил 03/08/2008 в 01:04
источник пользователем

голоса
2

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

Ответил 16/08/2008 в 14:31
источник пользователем

голоса
0

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

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

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

  • действительные треугольники с малыми числами, такими как (1 млрд, 2, млрд, 2 млрд)
  • действительные треугольники с большими числами, такими как (0.000001, 0.00002, 0.00003)
  • действительные тупые треугольники, которые являются «almost'flat, такие как (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)) как правило, вы найдете там несколько классификаций вы пропустили (например, понятие инфа в качестве входного параметра).

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

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

Ответил 17/09/2008 в 04:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more