Как определить стратегию в гипотезе для генерации пары похожих рекурсивных объектов - PullRequest
0 голосов
/ 27 января 2019

Я новичок в гипотезе и ищу способ генерировать пару похожих рекурсивных объектов.

Моя стратегия для одного объекта похожа на этот пример в документации по гипотезе.

Я хочу протестировать функцию, которая принимает пару рекурсивных объектов A и B, и побочным эффектом этой функции должно быть то, что A==B.

Мой первый подход заключается в написании теста, который получает два независимых объекта, например:

@given(my_objects(), my_objects())
def test_is_equal(a, b):
    my_function(a, b)
    assert a == b

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

Но я также хочу протестировать сложные рекурсивные объекты, которые немного отличаются друг от друга.

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

1 Ответ

0 голосов
/ 29 января 2019

Это сложно - честно говоря, я бы начал с того же теста, который у вас уже был, и просто включил настройку max_examples.Тогда я, вероятно, написал бы несколько традиционных модульных тестов, потому что получение определенных распределений данных из гипотезы явно не поддерживается (т.е. мы пытаемся разбить все, что предполагает конкретное распределение, используя некоторую комбинацию эвристики и небольшую обратную связь).

Как бы я на самом деле генерировал подобные рекурсивные структуры?Я бы использовал стратегию @composite, чтобы построить их одновременно, и для каждого элемента или поддерева я бы нарисовал логическое значение (или integers(0, 255).map(lambda n: n == 0)), а если True, то нарисовал бы другой элемент или поддерево для использования во втором объекте.,Обратите внимание, что это даст вам стратегию для кортежа из двух объектов, и вам нужно будет распаковать его внутри теста;это неизбежно, если вы хотите, чтобы они были связаны.

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

...