2011-02-06 3 views
1

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

Однако, конечно, насмехаясь над httplib2 - модулем, который я использую для запроса данных - я привязываю модульные тесты к конкретной реализации моей библиотеки и удаляю их способность функционировать после рефакторинга (что, очевидно, является одним из основных преимущества модульного тестирования в удобном месте).

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

ответ

1

Вы правы, что если вы реорганизуете свою библиотеку, чтобы использовать что-то другое, кроме httplib2, тогда ваши юнит-тесты будут ломаться. Это не такая ужасная зависимость, поскольку, когда придет время, будет просто изменить ваши тесты, чтобы издеваться над новой библиотекой.

Если вы хотите этого избежать, напишите минимальную обертку вокруг httplib2, и ваши тесты могут издеваться над этим. Затем, если вы когда-либо переходите от httplib2, вам нужно только изменить свою обертку. Но обратите внимание, что количество строк, которые вы должны изменить, одинаково в любом случае, все, что меняется, зависит от того, находятся ли они в «тестовом коде» или «не-тестовом коде».

+0

Я думаю, что оболочка может (по крайней мере теоретически) уменьшить размер изменений, необходимых для замены httplib2 на что-то еще. Без обертки вам нужно изменить тестируемые классы * и * объект макета. С оберткой вы меняете оболочку (старый макет все равно должен работать.) Это, конечно, предполагает, что API-интерфейс обложки достаточно общий, чтобы не меняться после замены библиотеки. –

1

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

Смежные вопросы