Как запустить pytest изнутри модуля
Как запустить pytest изнутри модуля

существовать Python середина,pytest — это мощная среда тестирования для написания и выполнения тестовых случаев. Обычно мы запускаем существующую командную строку pytest,Но иногда вам может потребоваться запустить программу из модуля или скрипта. pytest,Например, для автоматизации тестирования или интеграции в рабочий процесс.

1. Предыстория проблемы Когда вы запускаете из модуля Pytest Когда, Пайтест Похоже, что тесты кэшируются. Любые изменения в модулях или тестах будут игнорироваться. В связи с существованием iPad написано на Python и поэтому его нельзя запустить из командной строки. Pytest, можно использовать только pytest.main() для запуска тестов. Этот вопрос тщательно искали, но удалось найти только один похожий вопрос, в котором предлагалось запустить его из командной строки. Pytest。

2. Решение Pytest Ничего не будет кэшироваться. каждый Python Экземпляр интерпретатора читает файл только один раз. Хотя есть встроенный перезагрузите компьютер, но он почти никогда не делает то, что вы хотите. Итак, если вы запустите следующий код:

Язык кода:javascript
копировать
import pytest
...
while True:
    import my_nifty_app
    my_nifty_app.be_nifty()
    pytest.main()

Несмотря на то, что my_nifty_app.py существуют изменения на диске, он также будет прочитан только один раз. На самом деле нужен такой код:

Язык кода:javascript
копировать
exit_code = pytest.main()
sys.exit(exit_code)

Это завершит работу этого экземпляра интерпретатора и является единственным способом гарантировать, что исходный файл будет перечитан.

Пример кода:

Язык кода:javascript
копировать
import pytest
​
# Определить тестовую функцию
def test_function():
    assert True
​
# Определите модуль, содержащий тестовые функции
module = """
def test_function():
    assert True
"""
​
# запускать изнутри модуля Pytest
exec(module)
pytest.main()
​
# Внести изменения в модуль
module = """
def test_function():
    assert False
"""
​
# сновазапускать изнутри модуля Pytest
exec(module)
pytest.main()
​
# Теперь существуют, тест должен провалиться

Запуск из модуля pytest,Можно использовать pytest.main() метод. это Python Интерфейс, позволяющий запускать тесты программно.

шаг:

  1. Установить pytest: убеждатьсяуже Установить pytest。если не Установить,Это можно сделать с помощью следующей команды: pip установить pytest
  2. Вызывается из модуля pytest.main(): Позвонив pytest.main(),ты можешь начать с Python Запустите тест в скрипте. Вы можете передать параметры командной строки pytest.main() Для управления тестовыми файлами или параметрами, которые выполняются. Пример 1: Запуск изнутри модуля pytest Создайте простой тестовый файл test_sample.py,и напишите тестовые примеры: # test_sample.py ​ def test_addition(): assert 1 + 1 == 2 ​ def test_subtraction(): assert 2 - 1 == 1 Затем запустите другой модуль или скрипт. pytest.main() Чтобы выполнить тест: # run_tests.py ​ import pytest ​ def run_tests(): # Запустить все тесты pytest.main() ​ if __name__ == "__main__": run_tests() Когда ты бежишь run_tests.py , он будет выполнен изнутри pytest,и автоматически запускать все тестовые файлы в текущем каталоге (начиная с test_ Начинается с или начинается с _test файл в конце). python run_tests.py В выводе будут показаны результаты теста, как если бы вы запускали его из командной строки. pytest Такой же.
  3. Укажите тестовый файл или каталог: Вы можете указать тестовый файл или каталог для запуска, передав параметры. Например, чтобы указать конкретный тестовый файл для запуска: # run_tests.py ​ import pytest ​ def run_tests(): # Запускать только указанные тестовые файлы pytest.main(["test_sample.py"]) ​ if __name__ == "__main__": run_tests()
  4. Передать параметры pytestpytest.main() Поддерживает принятие командной строки Параметрыкак параметр。Например,если ты хочешь Включить подробный режим(-v)Или просто показать информацию об ошибке(--maxfail=1),Параметр, который может быть передан. # run_tests.py import pytest def run_tests(): # Запускайте тесты, используя параметры командной строки: включите подробный режим и установите максимальное количество ошибок. pytest.main(["-v", "--maxfail=1", "test_sample.py"]) if __name__ == "__main__": run_tests()
  5. иметь дело с pytest.main() возвращаемое значениеpytest.main() Возвращает целое число, представляющее результат выполнения теста:
    • 0:Все тесты пройдены。
    • 1:Тест не пройден。
    • 2:Выполнение тестасерединаперерыв。
    • 3:Внутренняя ошибка。
    • 4:Ошибка использования командной строки。

    Вы можете выполнить дальнейшую обработку на основе этого возвращаемого значения: # run_tests.py import pytest def run_tests(): result = pytest.main(["-v", "test_sample.py"]) if result == 0: print("Все тесты пройдены.") else: print(f «Тест не пройден с кодом {result}»), если __name__ == «__main__»: run_tests()

Полный пример

Вот полный пример, показывающий, как запустить его изнутри модуля. pytest,И пользовательские параметры передачи:

Язык кода:javascript
копировать
# run_tests.py

import pytest

def run_tests():
    # Запустите тест, включите подробный режим и укажите «только для выполнения». test_sample.py
    result = pytest.main(["-v", "test_sample.py"])
    if result == 0:
        print("All tests passed.")
    else:
        print(f"Tests failed with code {result}")

if __name__ == "__main__":
    run_tests()

Другие вещи, на которые стоит обратить внимание

  • Избегайте рекурсивных вызовов:когдазапускать изнутри модуля pytest При этом избегайте вызова его непосредственно в тестовом файле. pytest.main(),В противном случае это может привести к рекурсивным вызовам.,потому что pytest Тестовые файлы также загружаются во время выполнения.
  • Виртуальная среда и управление зависимостями:убеждатьсясуществовать Правильная виртуальная средасерединабегать pytest,чтобы избежать конфликтов зависимостей.

С помощью этих шагов вы сможете существовать Python Удобно вызывать и управлять в скриптах pytest,Для достижения потребностей в автоматизированном тестировании или интеграционном тестировании.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.