Можно ли использовать гипотезу для получения данных определенного типа (например, почтовых индексов или телефонных номеров)?

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

Например, я могу определить тест для генерации целых чисел, но я ожидаю, что этот тест будет соответствовать действительным почтовым индексам. Я могу сделать это? Или, возможно, более сложное соответствие неамериканским почтовым индексам, которые все являются целыми числами, а другие (скажем, Канада) нет?

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

Прямо сейчас у меня есть тестовые случаи, которые оформлены следующим образом:

from hypothesis import given, strategies as st
@given(st.integers())

В этом конкретном случае я бы хотел, чтобы он также соответствовал правилам почтового индекса США.

@given(st.text())

Для этого я бы хотел, чтобы он генерировал шаблоны в формате, похожем на электронную почту.

Может ли гипотеза создать такой тип генерации?


person NewGuy    schedule 21.06.2017    source источник


Ответы (1)


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

Для конкретных случаев электронной почты есть некоторая текущая работа по обеспечению хорошей встроенной реализации. но это, вероятно, не прибудет так скоро.

Я не знаю ничего, что делало бы почтовые индексы, и правильное выполнение этого выглядит сложно, но глядя на то, что делают другие генераторы случайных чисел, вы, вероятно, можете просто обойтись без st.integers(501, 99950).map(lambda i: "%05d" % (i,)), который просто берет целое число от 501 до 99950 включительно и форматирует его как 5-значный код.

person DRMacIver    schedule 22.06.2017