Когда в Django следует использовать doctests вместо модульного тестирования?

Из документов Django:

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

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

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

Ответ, не относящийся к SO

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


person Belmin Fernandez    schedule 22.11.2010    source источник


Ответы (2)


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

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

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

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

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

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

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

Изменить:

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

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

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

Нельзя писать хорошие тесты, которые одновременно работают как хорошая документация.

person Paul McMillan    schedule 22.11.2010
comment
Хорошее понимание. Когда вы сказали «Дополнительно», переход на doctests ускоряет общее время тестирования ... вы имели в виду переход на unittests? Или я что-то упускаю? - person Belmin Fernandez; 23.11.2010
comment
+1 за юнит-тестирование. На этот вопрос есть один фантастический ответ: stackoverflow.com/ вопросы / 361675 / python-doctest-vs-unittest / - person None-da; 23.11.2010
comment
@ Нимми: да, переход на юнит-тесты ускорил работу набора тестов, в первую очередь потому, что мы устранили кучу полных сбросов базы данных. - person Paul McMillan; 23.11.2010
comment
Еще раз спасибо, мистер Макмиллан. Ваш ответ очень информативный! - person Belmin Fernandez; 23.11.2010

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

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

person Jason Baker    schedule 23.11.2010
comment
Я считаю, что тесты в строках документации особенно подходят для небольших библиотек. Он просто так красиво течет и хорошо служит своей цели. Кроме того, когда дело доходит до внешней документации, если вы используете Sphinx, вы можете заставить его запускать любые найденные документы. У вас может быть раздел, посвященный тестированию - также документирование тестов по мере их выполнения. - person Chris Morgan; 23.11.2010