В Django, когда я должен использовать doctests вместо юнит-тестирования? - PullRequest
4 голосов
/ 23 ноября 2010

Из Django docs :

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

Откровенно говоря, 90% моих тестов в настоящее время проводится в докутах.Мой коллега думал, что это было странно.Честно говоря, я провожу очень мало тестов, поэтому я не претендую на звание мастера этого поля.

У кого-нибудь есть эмпирическое правило, которое они используют при принятии решения о том, как тестировать?-SO ответ

Мой коллега предложил протестировать функции и ограничения модели в виде тестов и представлений с помощью модульных тестов.Как это звучит для эмпирического правила?

Ответы [ 2 ]

15 голосов
/ 23 ноября 2010

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

Сам проект Django находится в процессе преобразования всех тестов в юнит-тесты (мы будем выполнять1.3 выпуск).Причина, по которой мы это делаем, заключается в том, что до этого преобразования порядок выполнения в тестовом наборе иногда приводил к трудным воспроизведению ошибок.Иногда немного кода случайно зависел от ранее выполненного кода doctest.Кроме того, переключение на юнит-тесты ускоряет общее время тестирования, поскольку мы можем быть более осмотрительными в отношении того, как и когда мы очищаем базу данных.

Другое преимущество юнит-тестов состоит в том, что их НАМНОГО проще поддерживать.Поскольку весь тестовый набор является автономным, вы либо пишете другой тестовый пример, либо модифицируете небольшую целевую тестовую функцию, чтобы она подходила.

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

Вы не хотите делать все это переписывание, поэтому вы добавляете новый тест в конце.Затем вы добавляете еще один, и через некоторое время ваши тесты настолько безнадежно перемешиваются, что вы не можете понять, тестируется ли конкретная функция или нет!С юнит-тестами, поскольку каждый тест воплощает определенную, конкретную и ограниченную идею, намного проще переупорядочить тесты логически и добавить новый тест, который не зависит от всех предыдущих.Кроме того, если вы измените способ работы add_green_fur(), вам не нужно изменять десятки результатов тестовых примеров.

Другое преимущество состоит в том, что юнит-тесты (если они написаны хорошо) точно сообщают вам, где произошел сбой вашего кода.Failed: MyWidget.tests.test_green_fur() намного проще отладить, чем «проверка виджета не удалась в строке 384», которая часто находится на расстоянии от десятков до сотен строк от фактической точки отказа.

В общем, тесты юнитов - лучший способtest.

Редактировать:

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

Кроме того, не смешивайте типы тестов, если у вас нет ОЧЕНЬ веских причин для этого.Если вы это сделаете, вы очень быстро удвоите количество тестов или предположите, что функция тестируется в том наборе тестов, который вам не нужен.

Документы часто называют "предоставлением документации"."за то, как ваш код должен работать.Это хорошо, но это не замена написания читабельного кода с хорошо читаемыми встроенными комментариями.Если вам нужна дополнительная документация, напишите ее отдельно!

Вы не можете написать хорошие тесты, которые также функционируют как хорошая документация.

1 голос
/ 23 ноября 2010

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

Короче говоря, используйте юнит-тесты для тестирования кода и doctests для тестирования документации.

...