Как кто-то, кто использовал Python профессионально в младшем прошлом, я нашел несколько лучших практик в отношении проверки и установки проекта, которые хорошо работают для меня. Сегодня я хотел бы поделиться с ними с вами.
TL; DR : Репо, содержащий демокрасный код: Maddosaurus/Pteest – практика Отказ
Настройка проекта
Настройка проекта основана на Кеннет Ретце « Руководство автостопщика к Python Отказ Отсюда следует идею отдельного модуля, сопровождаемого тестами и поддерживающей информацией на том же уровне (то есть не содержится в самом модуле). Это держит модуль наклониться и маленьким.
# Module containing the code pytdemo/pytdemo.py pytdemo/util.py # Testsuite tests/conftest.py tests/test_pytdemo.py tests/test_util.py # Supporting information .gitignore LICENSE README.md requirements.txt setup.py
Как видно, сам модуль содержит только голые необходимые. Тестовый набор организован для примерно в соответствии с подмодулями, но это идея, которую я использую только для меньших модулей. Если подмодули становятся все больше и сложнее, я склонен к групповым тестам по поведению или логическим группам.
Испытательная установка
Лично я использую дикую смесь питиш , Unittest.Mock. MagicMock и Запрос-макет – Последний только если модуль использует Запросы
непосредственно взаимодействовать с API для отдыха. В качестве общей рекомендации вы должны следить за своим тестовым покрытием. Для этого я люблю использовать Pytest-Cov , который является мощным инструментом, который может генерировать приятные отчеты с - Сообщить о HTML
вариант. Слово осторожно: нацеливание на 100% покрытие – это отличное, но не пытайтесь заставить его принять. Это может в конечном итоге быть чрезвычайно утомительным и иногда невозможным. Старайтесь найти умные цели вместо этого, то есть согласование покрытия всех функционально важных частей вашего проекта.
Конфуст файл
Возможно, вы заметили, что есть Conftest.py
жить в тесты
папка. Этот файл используется для хранения совместно используемых Питистые светильники Это можно использовать во всех тестовых файлах. Это настоятельно рекомендуется, особенно для вспомогательных функций и источников данных. В примерном коде вы найдете прибор здесь, что создает пользовательский экземпляр основного модуля, который содержит URL, который указывает на localhost. Это необходимо, чтобы даже если ваши издеватели конечных точек не поймают каждый звонок, вы будете первыми, кто знает (а также, мы избегаем ударов на реальную услугу с помощью просьбы на тесте).
Исправления обезьян
При написании тестов есть одна проблема: вы хотите проверить как можно меньшее и свободное от побочных эффектов. Это может быть достигнуто за счет издевания всех вызовов на другие функции, необходимые в тесте (SUT). Pytest делает это, предоставляя несколько механизмов Орнаптер
Быть моим любимым за его баланс между читаемости и явностью. Например:
def test_get_all_URL(crt_mock, monkeypatch): # Set up a mock that will replace the requests module in CrtSh and use it # The MagicMock class comes in handy as it does a lot in the background for us. requests_mock = MagicMock() monkeypatch.setattr(pytdemo.requests, "get", requests_mock) crt_mock.get_all("testhost.domain") # Check it the requests module was called with the correct URL requests_mock.assert_called_once_with( "https://test.local/", params={"Identity": "testhost.domain", "output": "json"} )
В примере Получить Функция Запросы
заменяется на обычай MagicMock
объект, который сэкономит каждый звонок к нему. Как видите, тест разделен на три части:
- Организовать – настроить все необходимые варианты, данные и издевательства
- Акт – позвоните в сат
- Assert – проверка результата для правильности
Эта тройная структура улучшает читабельность – конвенции часто помогают облегчить вашу работу в команде. На самом деле это хорошо известная картина, называемая AAA – договориться, акт, утверждает И я рекомендую читать немного больше об этом, если вы заинтересованы в написании лучших тестов подразделения.
Как видите, сочетание различных инструментов Python для тестирования может дать очень мощную настройку, которая позволяет вам построить ваши тесты быстро и легко.
Последние мысли
Я просто царапаю поверхность этим постом. Есть еще много модулей и лучших практик, которые я хотел бы поделиться с течением времени, что упрощает вашу жизнь в качестве Python Dev. На данный момент имейте в виду, что тестирование может чувствовать, что это замедляет вас Но на самом деле гарантирует, что вы сохраняете свою текущую скорость. Написание хороших модульных тестов гарантирует, что все детали в вашем модуле работают как предназначены и продолжают работать как предполагаемое – даже когда вы меняете и рекакторируете код. Это также означает, что вы часто запускаете свои тесты, поэтому, пожалуйста, убедитесь, что они выполняют как можно быстрее. Наконец, может быть, самые важные тесты, которые вы напишите, – это те, которые создаются в контексте билета ошибка: попробуйте воспроизвести ошибку с помощью теста на единицу, прежде чем пытаться его исправить. С помощью этого порядка операций вы гарантируете, что ошибка исправлена и что она не вернется на более позднем этапе, так что получите тестирование!
Оригинал: “https://dev.to/mat_zilla/my-python-testing-best-practices-2ef9”