Почему strategy.permutations не обеспечивает наименьшего набора перестановок?

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

Используя пакет hypothesis python, я попытался построить этот тестовый пример. Однако список сгенерированных перестановок содержит множество повторяющихся тестовых примеров.

Например, используя список из 3 элементов (['a', 'b', 'c']), я ожидал бы 6 записей в списке перестановок (abc, acb, bac, bca, cab, cba), но это не так.

Вот MWE, если у вас есть пакет гипотез:

from hypothesis import given
from hypothesis.strategies import permutations

@given(permutations(['a', 'b', 'c']))
def test(permutation):
    print(permutation)

test()

Кроме того, код доступен на repl.it.

К сожалению, документация меня не просветила, но, возможно, я ищу не в том месте.

Есть идеи, что я делаю не так?


person Jir    schedule 02.07.2019    source источник
comment
Ответ на Как вы генерируете динамические (параметризованные) модульные тесты на Python? может быть полезен другим в аналогичной ситуации.   -  person Jir    schedule 03.07.2019


Ответы (1)


Вы не делаете ничего плохого, именно так работает Гипотеза. Он не гарантирует (и не может) гарантировать, что он не генерирует повторяющиеся элементы. Он делает все возможное, чтобы уменьшить их частоту, но в целом это невозможно, и проблема редко возникает с более сложными стратегиями, поэтому не стоит специально рассматривать те немногие случаи, когда это возможно.

Если набор возможных примеров достаточно мал, чтобы вы могли просто исчерпывающе перечислить его, и для вас действительно важно избегать дублирования, вы можете найти что-то вроде pytest.mark.parametrize более подходящим.

person DRMacIver    schedule 03.07.2019
comment
После внимательного изучения и разговора с пользователем гипотез на freenode, я вынужден согласиться с вами - так работает гипотеза. Я бы только добавил, что другие решения (помимо тех, которые вы опубликовали): а) использовать itertools.permutations, если пространство перестановок достаточно мало, чтобы его можно перечислить исчерпывающе, или б) другие пакеты (вы упомянули pytest, а также Ностесты или даже unittest.subTest). - person Jir; 03.07.2019