Spec-Zone.ru › Python 3.12

тест — Пакет регрессионных тестов для 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 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/test.html

Spec-Zone.ru

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