Spec-Zone.ru › Python 3.11

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, выполняются как тесты. Класс Mixin в примере выше не имеет данных и поэтому не может выполняться самостоятельно, следовательно, он не наследуется от unittest.TestCase.

См. также

Test Driven Development

Книга Кента Бека о написании тестов до кода.

Выполнение тестов с помощью командной строки

Пакет 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/test.html

Spec-Zone.ru

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