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. Если в качестве значения параметра -u указать all, будут доступны все возможные ресурсы: 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 запустит все регрессионные тесты.
Добавлено в версии 3.14: По умолчанию вывод выделяется цветом; это поведение можно настроить с помощью переменных окружения.
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/test.html