test — пакет регрессионных тестов для Python
Примечание
Пакет test предназначен только для внутреннего использования Python. Документация к нему приведена для разработчиков ядра Python. Не рекомендуется использовать этот пакет за пределами стандартной библиотеки Python, поскольку упомянутый здесь код может измениться или быть удалён без предупреждения между выпусками Python.
Пакет test содержит все регрессионные тесты для Python, а также модули test.support и test.regrtest. Модуль test.support используется для расширения возможностей тестов, а test.regrtest управляет набором тестов.
Каждый модуль пакета test, имя которого начинается с test_, представляет собой набор тестов для определённого модуля или функциональности. Все новые тесты следует писать с использованием модуля unittest или doctest. Некоторые старые тесты написаны в «традиционном» стиле тестирования, при котором сравнивается вывод, напечатанный в sys.stdout; такой стиль тестирования считается устаревшим.
См. также
Написание модульных тестов для пакета test
При использовании модуля unittest желательно придерживаться нескольких рекомендаций. Одна из них — начинать имя модуля тестов с test_ и заканчивать его именем тестируемого модуля. Имена методов тестового модуля должны начинаться с test_ и заканчиваться описанием того, что именно проверяет метод. Это необходимо, чтобы исполнитель тестов распознавал эти методы как тестовые. Кроме того, к методам не следует добавлять строки документации. Для документирования методов тестов следует использовать комментарий (например, # Tests function returns only True or False). Это делается потому, что существующие строки документации выводятся на экран, и тогда не указывается, какой тест выполняется.
Часто используется следующий базовый шаблон:
import unittest
from test import support
class MyTestCase1(unittest.TestCase):
# Only use setUp() and tearDown() if necessary
def setUp(self):
... code to execute in preparation for tests ...
def tearDown(self):
... code to execute to clean up after tests ...
def test_feature_one(self):
# Test feature one.
... testing code ...
def test_feature_two(self):
# Test feature two.
... testing code ...
... more test methods ...
class MyTestCase2(unittest.TestCase):
... same structure as MyTestCase1 ...
... more test classes ...
if __name__ == '__main__':
unittest.main()
Этот шаблон кода позволяет запускать набор тестов с помощью test.regrtest, отдельно как скрипт с поддержкой интерфейса командной строки unittest или через интерфейс командной строки python -m unittest.
Цель регрессионного тестирования — попытаться сломать код. Поэтому следует придерживаться нескольких рекомендаций:
- Набор тестов должен проверять все классы, функции и константы. Это касается не только внешнего API, предназначенного для пользователей, но и «приватного» кода.
- Предпочтительно тестирование методом белого ящика (изучение тестируемого кода при написании тестов). Тестирования методом чёрного ящика (проверки только опубликованного пользовательского интерфейса) недостаточно, чтобы убедиться в проверке всех граничных и крайних случаев.
- Убедитесь, что проверяются все возможные значения, в том числе недопустимые. Это позволит удостовериться не только в том, что допустимы все корректные значения, но и в том, что некорректные значения обрабатываются правильно.
- Охватите как можно больше путей выполнения кода. Проверяйте места ветвления и подбирайте входные данные так, чтобы задействовать как можно больше различных путей выполнения кода.
- Добавляйте отдельный тест для каждой обнаруженной ошибки в тестируемом коде. Это позволит убедиться, что ошибка не появится снова при будущих изменениях кода.
- Не забывайте очищать всё после тестов (например, закрывать и удалять все временные файлы).
- Если тест зависит от определённого состояния операционной системы, перед его запуском убедитесь, что это условие уже выполнено.
- Импортируйте как можно меньше модулей и делайте это как можно раньше. Это сводит к минимуму внешние зависимости тестов и вероятность аномального поведения из-за побочных эффектов импорта модуля.
-
Старайтесь максимально повторно использовать код. Иногда тесты различаются лишь типом входных данных. Сокращайте дублирование кода, создавая подкласс базового тестового класса и задавая в нём входные данные:
class TestFuncAcceptsSequencesMixin: func = mySuperWhammyFunction def test_func(self): self.func(self.arg) class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase): arg = [1, 2, 3] class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase): arg = 'abc' class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase): arg = (1, 2, 3)При использовании этого шаблона помните, что все классы, наследующие от
unittest.TestCase, запускаются как тесты. КлассTestFuncAcceptsSequencesMixinиз приведённого выше примера не содержит никаких данных и поэтому не может запускаться самостоятельно; следовательно, он не наследует отunittest.TestCase.
См. также
- Разработка через тестирование
-
Книга Кента Бека о написании тестов до написания кода.
Запуск тестов с помощью интерфейса командной строки
Пакет test можно запустить как скрипт для управления набором регрессионных тестов Python благодаря параметру -m: python -m test. Внутри он использует test.regrtest; вызов python -m test.regrtest, использовавшийся в предыдущих версиях Python, по-прежнему работает. Самостоятельный запуск скрипта автоматически запускает все регрессионные тесты пакета test. Для этого скрипт находит в пакете все модули, имена которых начинаются с test_, импортирует их и выполняет функцию test_main(), если она есть, либо загружает тесты с помощью unittest.TestLoader.loadTestsFromModule, если test_main не существует. Скрипту также можно передать имена тестов для выполнения. Указание одного регрессионного теста (python -m test test_spam) позволит свести вывод к минимуму и печатать только сообщение об успешном или неудачном прохождении теста.
Непосредственный запуск test позволяет задавать ресурсы, доступные тестам. Для этого используется параметр командной строки -u. Указание all в качестве значения параметра -u включает все возможные ресурсы: python -m test -uall. Если нужны все ресурсы, кроме одного (что встречается чаще), после all можно перечислить через запятую ненужные ресурсы. Команда python -m test -uall,-audio,-largefile запустит test со всеми ресурсами, кроме ресурсов audio и largefile. Список всех ресурсов и дополнительные параметры командной строки можно посмотреть, выполнив команду python -m test -h.
Некоторые другие способы запуска регрессионных тестов зависят от платформы, на которой выполняются тесты. В Unix можно выполнить команду make test в каталоге верхнего уровня, где была собрана Python. В Windows запуск rt.bat из каталога PCbuild выполнит все регрессионные тесты.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/test.html