1 год назад
ЧТО ТАКОЕ ФИКСТУРА В PYTEST
Фикстура(@pytest.fixture) - это подготовительная часть теста, которая инициализирует необходимые данные, ресурсы или окружение перед запуском самих тестов. Фикстуры в тестировании помогают создать стандартные условия для выполнения тестов, обеспечивая их независимость и повторяемость. Несколько причин, по которым фикстуры полезны в тестировании: В контексте тестирования с использованием библиотеки pytest в Python, фикстуры определяются с помощью декоратора @pytest...
🖥 Что такое фикстуры в Pytest? Какие фикстуры вы знаете ? Встроенные фикстуры — хороший инструмент, чтобы не создавать свои велосипеды и эффективно использовать мощь фреймворка, которую хотели передать авторы. Фикстуры помогают в разных случаях: при работе с выводом ошибок, логировании, создании отчетов и так далее. В статье разберем основные встроенные фикстуры и их применение в Pytest. Потоки ввода и вывода ошибок Когда нужно протестировать системные сообщения или перехватить ошибку, помогают фикстуры, которые умеют работать с потоками вывода. Capfd — фикстура для работы с потоками стандартного ввода и вывода ошибок на уровне операционной системы. Она позволяет перехватывать не только то, что происходит в python-коде, но и то, что происходит в операционной системе. Захваченный вывод доступен через вызов метода capfd.readouterr(), который возвращает named tuple с stderr и stdout в виде строк. def test_system_echo(capfd): os.system('echo "hello"') captured = capfd.readouterr() assert captured.out == "hello\n" Capfdbinary — тоже работает со стандартным выводом и ошибками, но возвращает именованный кортеж, где сообщения из stderr и stdout представлены в виде байтовых строк. def test_system_echo(capfdbinary): os.system('echo "hello"') captured = capfdbinary.readouterr() assert captured.out == b"hello\n" Capsys — фикстура для работы с потоками для стандартного вывода и вывода ошибок на уровне python-кода. Захватывает sys.stdout и sys.stderr из кода и возвращает в виде строк. def test_output(capsys): print("hello") captured = capsys.readouterr() assert captured.out == "hello\n" Capsysbinary — подходит для работы с потоками стандартного вывода на уровне python-кода. Захватывает sys.stdout и sys.stderr из кода и возвращает в виде байтовых строк. def test_output(capsysbinary): print("hello") captured = capsysbinary.readouterr() assert captured.out == b"hello\n" Логирование Логи — отличный инструмент для дебага, когда дело касается стабильной работы приложения. По ним можно понять, когда и из-за чего в работе системы возник сбой. Pytest имеет несколько фикстур для управления логами из тестов. Caplog — позволяет работать с логами в python-коде. Дает возможность изменять уровень логирования, перехватывать сообщения, модифицировать их и многое другое. # Задать уровень логирования def test_foo(caplog): caplog.set_level(logging.INFO) for message in caplog.messages: assert "for debug level" not in message # Пример проверки уровня логирования и текста в сообщении лога def test_baz(caplog): func_under_test() for record in caplog.records: assert record.levelname != "CRITICAL" assert "wally" not in caplog.text Recwarn — возвращает экземпляр класса WarningsRecorder, где будут храниться все warnings, которые были вызваны с помощью warnings.warn в тестовых функциях. import warnings def test_check_warnings(recwarn): warnings.warn("hello", UserWarning) assert len(recwarn) == 1 warn = recwarn.pop(UserWarning) assert issubclass(warn.category, UserWarning) assert str(warn.message) == "hello" assert warn.filename Отчеты и документация Pytest из коробки позволяет генерировать отчеты в формате JUnit XML, поэтому во фреймворке имеется ряд специальных фикстур для управления формированием отчета. Doctest_namespace — фикстура для работы со встроенной библиотекой doctest. Библиотека помогает сравнить поведение функции с тем, что описано в docstring как ее ожидаемое поведение. # Объявляем фикстуру в conftest.py import numpy @pytest.fixture(autouse=True) def add_np(doctest_namespace): doctest_namespace["np"] = numpy # Добавляет в namespace np ссылку на объект numpy # Вызываем namespace в numpy.py def arange(): """ >>> a = np.arange(10) >>> len(a) 10 """ pass Напишите фикстуры, которые вы используете в комментариях 👇 @machinelearning