Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как использовать комбинации наборов в качестве тестовых данных
Я хотел бы протестировать функцию с кортежем из набора граничных случаев и нормальных значений. Например, при тестировании функции, которая возвращает true всякий раз, когда заданы три длины, образующие допустимый треугольник, у меня были бы конкретные случаи, отрицательные / малые / большие числа, значения, близкие к переполнению, и т. д.; более того, основная цель состоит в том, чтобы генерировать комбинации этих значений, с повторением или без повторения, чтобы получить набор тестовых данных.
(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...
Как примечание: Я действительно знаю ответ на этот вопрос, но это может быть полезно для других, и вызов для людей здесь! --мой ответ будет опубликован позже.
Безусловно, особенно имея дело с большим количеством этих перестановок/комбинаций, я определенно вижу, что первый проход будет проблемой.
Интересная реализация в python, хотя я написал хороший вариант в C и Ocaml на основе "Algorithm 515" (см. ниже). Он написал свой в Fortran, как это было принято тогда для всех "Algorithm XX" газет, ну, это assembly или c. Мне пришлось переписать его и сделать некоторые небольшие улучшения для работы с массивами, а не диапазонами чисел. Этот делает случайный доступ, я все еще работаю над получением некоторых хороших реализаций тех, которые упоминаются в брошюре кнута 4-го тома 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: генерация вектора из лексикографического индекса"; Buckles, B. P., and Lybanon, M. ACM Transactions on Mathematical Software, Vol. 3, № 2, Июнь 1977 Года.
С совершенно новым Python 2.6 у вас есть стандартное решение с модулем itertools, который возвращает декартово произведение iterables :
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().
Интересный вопрос!
Я бы сделал это, выбирая комбинации, что-то вроде следующего в python. Самое сложное, вероятно, это проверка первого прохода, т. е. if f(1,2,3) returns true, это правильный результат? После того, как вы это проверили, это хорошая основа для регрессионного тестирования.
Вероятно, это хорошая идея, чтобы сделать набор тестовых случаев, которые вы знаете, будут все истинны (например, 3,4,5 для этого случая треугольника), и набор тестовых случаев, которые вы знаете, будут все ложны (например, 0,1, inf). Тогда вам будет легче проверить правильность тестов.
# 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); ...
Я думаю, что вы можете сделать это с помощью атрибута Row Test (доступного в MbUnit и более поздних версиях NUnit), где вы можете указать несколько наборов для заполнения одного модульного теста.
Хотя можно создать множество тестовых данных и посмотреть, что произойдет, более эффективно попытаться свести к минимуму используемые данные.
С типичной точки зрения QA, вы бы хотели определить различные классификации входных данных. Создайте набор входных значений для каждой классификации и определите соответствующие выходные значения.
Вот пример классов входных значений
- допустимые треугольники с малыми числами, такими как (1 млрд, 2 млрд, 2 млрд)
- допустимые треугольники с большими числами, такими как (0.000001, 0.00002, 0.00003)
- допустимые тупые треугольники, которые являются "почти" плоскими, например (10, 10, 19.9999)
- допустимые острые треугольники, которые являются 'almost' плоскими, например (10, 10, 0000001)
- неверный треугольников с, по меньшей мере, одно отрицательное значение
- недопустимые треугольники, где сумма двух сторон равна третьей
- недопустимые треугольники, в которых сумма двух сторон больше третьей
- входные значения, которые не являются числовыми ...
После того, как вы удовлетворитесь списком входных классификаций для этой функции, вы можете создать фактические тестовые данные. Вероятно, было бы полезно проверить все перестановки каждого элемента. (например (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) как правило, вы обнаружите, что некоторые классификации вы пропустили (например, понятие inf в качестве входного параметра).
Случайные данные в течение некоторого периода времени также могут быть полезны, что может привести к обнаружению странных ошибок в коде, но в целом непродуктивно.
Скорее всего, эта функция используется в каком-то конкретном контексте, где применяются дополнительные правила.(например, только целочисленные значения или значения должны быть с шагом 0.01 и т. д.) Они дополняют список классификаций входных параметров.