Spec-Zone.ru › Python 3.14

test — Пакет регрессионных тестов для Python

Примечание

Пакет test предназначен только для внутреннего использования в Python. Документация к нему приведена для разработчиков ядра Python. Использование этого пакета за пределами стандартной библиотеки Python не рекомендуется, поскольку описанный здесь код может измениться или быть удалён без предупреждения в новых выпусках Python.

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

Каждый модуль в пакете test, имя которого начинается с test_, представляет собой набор тестов для определённого модуля или функциональности. Все новые тесты следует писать с использованием модуля unittest или doctest. Некоторые старые тесты написаны в «традиционном» стиле тестирования, который сравнивает вывод, напечатанный в sys.stdout; этот стиль тестирования считается устаревшим.

См. также

Module unittest

Написание регрессионных тестов PyUnit.

Module doctest

Тесты, встроенные в строки документации.

Написание модульных тестов для пакета 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API