Как использовать Coverage в Django
Когда вы разрабатываете большой проект, случайно можно забыть некоторые части кода, которые нужно протестировать. Coverage.py — это инструмент на python, который поможет вам в этом.
Установка
Используйте pip или easy_install, как вам по душе
pip install coverageЗапуск и удаление
Для запуска в проекте Django используйте команду:
overage run --source='.' manage.py test the-app-you-want-to-testЭта команда заполнит «.coverage», который расположен в COVERAGE_FILE, а затем вы можете увидеть результаты или отчет. Если вам нужно удалить полученные данные, воспользуйтесь командой:
coverage eraseДля одного файла
Если вы хотите проверить только код Python, то вам необходимо сделать:
coverage run your_program.py arg1 arg2 arg3Есть несколько дополнительных опций, которые вы можете посмотреть по ссылке .
О шаблонах можно узнать в разделе плагинов .Просмотр результата
Если вы хотите вывести результаты в командной строке:
coverage reportДля более понятных и удобных отчетов:
coverage htmlЧтобы точно знать, какая часть вашего кода покрыта тестами, используйте следующую команду:
coverage annotate -d directory-where-to-put-annotated-filesПрограмма сгенерирует тот же файл исходного кода с дополнительным синтаксисом:
- Строка с «>» означает, что она была выполнена.
- Строка, начинающаяся с «!», Означает, что она не была выполнена.
- Строка, начинающаяся с «-» означает, что строка была исключена из статистики покрытия.
Хороший уровень покрытия
Хорошее покрытие обычно приходится на 90%. Однако, если результат 100%, это может быть плохим сигналом, так как, возможно, дело с покрытием, а не с качеством тестов. Несколько советов:
- Будьте осторожны с качеством ваших тестов.
- Не замедляйте скорости своего разработчика ради покрытия.
- Используйте покрытие, чтобы найти непроверенный код и решить, заслуживает ли он покрытия.
Исключаем код
Иногда нам нужно исключить некоторый код, который не нуждается в покрытии. Существует несколько вариантов:
- Указание файлов для исключения и пропуска в .coveragerc.
- Написание в одной строке блока комментария.
# pragma: no coverНапример, если вы хотите исключить сгенерированный код из покрытия, потому что он должен поддерживаться инструментом генерации:
def generated_code(): # pragma: no cover do_something()Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
По статье задано0 вопрос(ов)
Подписка на обсуждение 2
Подписка на раздел 176Вам это нравится? Поделитесь в социальных сетях!
Покрытие кода тестами — Python: Автоматическое тестирование
С ростом проекта становится сложно определить, какой код уже протестирован, а какой — еще нет. При этом подобная потребность возникает регулярно. Обычно это происходит тогда, когда не все члены команды ответственно подходят к написанию тестов. В таком случае может страдать качество проекта.
Но есть решение — протестированность кода можно измерить. В этом уроке мы познакомимся с метрикой, которая помогает подсчитать количество тестов и качество тестирования.
Как работает покрытие тестами
В тестировании часто используют метрику code coverage — это покрытие кода тестами. Покрытие анализируется тестовыми фреймворками, которые считают отношения строчек, задействованных в тестах, ко всем строчкам исходного кода.
Например, если в коде есть условная конструкция, не проверенная тестами, то все строки кода в этой конструкции будут не покрытыми.
В Pytest покрытие измеряется крайне просто. Достаточно установить одну зависимость и запустить тесты с правильным флагом:
--cov # Примерный вывод tests/test_example.py .. [ 66%] tests/test_hexlet_pytest.py . [100%] Name Stmts Miss Cover ----------------------------------------------- hexlet_pytest/__init__.py 1 0 100% hexlet_pytest/example.py 4 1 75% ----------------------------------------------- TOTAL 5 1 80%
После всех тестов Pytest выводит сводную таблицу по каждому файлу. В ней показан процент покрытия кода тестами.
В примере выше видно, что в файле _init_.py покрыто 100% кода, а вот в файле example.py — только 75%. При этом общее покрытие кода 80%.
Обратите внимание, что покрытие сильно зависит от того, какие тесты выполнились. Если часть тестов упало с ошибкой, то Pytest покажет намного меньшее покрытие — тесты просто не доберутся до всего кода. Поэтому покрытие измеряют только тогда, когда все тесты зеленые.
Эта статистика помогает найти места, где тестов мало. Дальше по ситуации их можно добавлять. Если в проекте тестов не было вообще, то эта статистика начинает быстро расти. А вот дальше, ближе к 90 процентам, придется бороться за каждую строчку кода.
Каким должно быть покрытие
Само по себе покрытие не гарантирует, что код работает правильно во всех ситуациях. Логические ошибки в коде невозможно отследить только покрытием. Для этого нужны тесты на одну и ту же функциональность, но с разным набором данных.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Coverage.py
Coverage.py is a tool for measuring code coverage of Python programs. It monitors your program, noting which parts of the code have been executed, then analyzes the source to identify code that could have been executed but was not.
Coverage measurement is typically used to gauge the effectiveness of tests. It can show which parts of your code are being exercised by tests, and which are not.
The latest version is coverage.py 7.3.2, released October 2, 2023. It is supported on:
- Python versions 3.8 through 3.12.
- PyPy3 versions 3.8 through 3.10.
For Enterprise
Available as part of the Tidelift Subscription.
Coverage and thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use. If you want the flexibility of open source and the confidence of commercial-grade software, this is for you. Learn more.
Quick start
Getting started is easy:
$ python3 -m pip install coverage
Tip If your test runner command starts with “python”, just replace the initial “python” with “coverage run”. python something.py becomes coverage run something.py python -m amodule becomes coverage run -m amodule
Other instructions for specific test runners:
- pytest
- unittest
- nosetest
If you usually use:
$ pytest arg1 arg2 arg3
then you can run your tests under coverage with:
$ coverage run -m pytest arg1 arg2 arg3
Many people choose to use the pytest-cov plugin, but for most purposes, it is unnecessary.
Change “python” to “coverage run”, so this:
$ python3 -m unittest discover
$ coverage run -m unittest discover
Nose has been unmaintained since at least 2015. You should seriously consider using a different test runner.
$ nosetests arg1 arg2
$ coverage run -m nose arg1 arg2
To limit coverage measurement to code in the current directory, and also find files that weren’t executed at all, add the --source=. argument to your coverage command line.
$ coverage report -m Name Stmts Miss Cover Missing ------------------------------------------------------- my_program.py 20 4 80% 33-35, 39 my_other_module.py 56 6 89% 17-23 ------------------------------------------------------- TOTAL 76 10 87%
$ coverage html
Capabilities
Coverage.py can do a number of things:
- By default it will measure line (statement) coverage.
- It can also measure branch coverage .
- It can tell you what tests ran which lines .
- It can produce reports in a number of formats: text , HTML , XML , LCOV , and JSON .
- For advanced uses, there’s an API , and the result data is available in a SQLite database .
Using coverage.py
There are a few different ways to use coverage.py. The simplest is the command line , which lets you run your program and see the results. If you need more control over how your project is measured, you can use the API .
Some test runners provide coverage integration to make it easy to use coverage.py while running tests. For example, pytest has the pytest-cov plugin.
You can fine-tune coverage.py’s view of your code by directing it to ignore parts that you know aren’t interesting. See Specifying source files and Excluding code from coverage.py for details.
Getting help
If the FAQ doesn’t answer your question, you can discuss coverage.py or get help using it on the Python discussion forums. If you ping me ( @nedbat ), there’s a higher chance I’ll see the post.
Bug reports are gladly accepted at the GitHub issue tracker. GitHub also hosts the code repository.
Professional support for coverage.py is available as part of the Tidelift Subscription.
I can be reached in a number of ways. I’m happy to answer questions about using coverage.py.
For news and other chatter, follow the project on Mastodon: @coveragepy@hachyderm.io.
More information
- Installation
- For enterprise
- Command line usage
- Configuration reference
- Specifying source files
- Excluding code from coverage.py
- Branch coverage measurement
- Measuring sub-processes
- Measurement contexts
- Coverage.py API
- How coverage.py works
- Plug-ins
- Contributing to coverage.py
- Things that cause trouble
- FAQ and other help
- Change history
- Migrating between versions
- Sleepy Snake
© Copyright 2009–2023, Ned Batchelder. Revision 2a3bb838 .
Как узнать процент покрытия кода тестами?
Использую для тестов unittest. Запускаю через pytest. Каким способом можно узнать процент покрытия кода тестами? Вроде как-то coverage.py можно использовать?
Отслеживать
12.9k 10 10 золотых знаков 40 40 серебряных знаков 76 76 бронзовых знаков
задан 30 ноя 2019 в 14:55
744 6 6 серебряных знаков 19 19 бронзовых знаков
Либо pip install coverage и coverage run pytest && coverage report -m , либо pytest-cov , как в ответе.
30 ноя 2019 в 21:44
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Нужно установить плагин pytest-cov для pytest ( pip install pytest-cov ), при запуске pytest добавить ключ --cov=proj (где proj - имя директории, для файлов которой будет считаться покрытие).
После выполнения тестов создастся файл .coverage с информацией по покрытию. Также можно генерировать отчеты по покрытию, например, в виде html и других форматах (см. pytest-cov - Reporting)
Отслеживать
ответ дан 30 ноя 2019 в 15:11
47.5k 17 17 золотых знаков 56 56 серебряных знаков 99 99 бронзовых знаков
- python
- юнит-тесты
- pytest
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.