Це правильне використання conftest.py?
Так. Світильники є потенційним і поширеним використанням conftest.py
. Світильники, які ви визначите, поділяться між усіма тестами у вашому тестовому наборі. Однак визначення світильників у корені conftest.py
може бути марним, і це уповільнить тестування, якщо такі світильники використовуються не у всіх тестах.
Чи є це в інших сферах використання?
Так.
Світильники : Визначте кріплення для статичних даних, використовуваних тестами. До цих даних можна отримати доступ до всіх тестів у наборі, якщо не вказано інше. Це можуть бути як дані, так і помічники модулів, які будуть здані на всі тести.
Завантаження зовнішніх плагінів : conftest.py
використовується для імпорту зовнішніх плагінів або модулів. Визначивши наступну глобальну змінну, pytest завантажить модуль і зробить його доступним для його тестування. Плагіни - це, як правило, файли, визначені у вашому проекті або в інших модулях, які можуть знадобитися у ваших тестах. Ви також можете завантажити набір заданих плагінів, як пояснено тут .
pytest_plugins = "someapp.someplugin"
Гачки : Ви можете вказати гачки, такі як методи встановлення та вилучення та багато іншого для покращення тестів. Про набір доступних гачків читайте тут . Приклад:
def pytest_runtest_setup(item):
""" called before ``pytest_runtest_call(item). """
#do some stuff`
Шлях коріння тесту : це трохи прихована функція. Визначившись conftest.py
з вашим кореневим шляхом, ви будете pytest
розпізнавати свої додатки без уточнення PYTHONPATH
. У фоновому режимі py.test модифікує ваш sys.path
, включаючи всі підмодулі, що знаходяться з кореневого шляху.
Чи можу я мати кілька файлів conftest.py?
Так, ви можете, і настійно рекомендується, якщо ваша структура тесту є дещо складною. conftest.py
Файли мають область каталогу. Тому створення цільових світильників та помічників є хорошою практикою.
Коли я хотів би це зробити? Приклади будуть оцінені.
Кілька випадків можуть відповідати:
Створення набору інструментів або гачків для певної групи тестів.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
test root/mod2/test.py will NOT produce "I am mod"
Завантаження набору світильників для одних тестів, але не для інших.
root / mod / conftest.py
@pytest.fixture()
def fixture():
return "some stuff"
root / mod2 / conftest.py
@pytest.fixture()
def fixture():
return "some other stuff"
root / mod2 / test.py
def test(fixture):
print(fixture)
Буде надруковано "деякі інші речі".
Переважаючі гачки, успадковані від кореня conftest.py
.
root / mod / conftest.py
def pytest_runtest_setup(item):
print("I am mod")
#do some stuff
root / conftest.py
def pytest_runtest_setup(item):
print("I am root")
#do some stuff
Запустивши будь-який тест всередині root/mod
, друкується лише "Я мод".
Більше про це можна прочитати conftest.py
тут .
Редагувати:
Що робити, якщо мені потрібно викликати звичайні допоміжні функції з ряду тестів у різних модулях - чи вони мені будуть доступні, якщо я поміщу їх у conftest.py? Або я повинен просто помістити їх у модуль helpers.py та імпортувати та використовувати його у своїх тестових модулях?
Ви можете використовувати conftest.py
для визначення своїх помічників. Однак слід дотримуватися загальної практики. Помічники можна використовувати як світильники принаймні в pytest
. Наприклад, в моїх тестах у мене є помічник з макетом Redis, який я ввожу в свої тести таким чином.
root / helper / redis / redis.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / тести / речі / conftest.py
pytest_plugin="helper.redis.redis"
root / тести / речі / test.py
def test(mock_redis):
print(mock_redis.get('stuff'))
Це буде тестовий модуль, який ви можете вільно імпортувати у своїх тестах. Зверніть увагу, що ви потенційно можете назвати redis.py
так, conftest.py
ніби ваш модуль redis
містить більше тестів. Однак ця практика не рекомендується через неоднозначність.
Якщо ви хочете скористатися conftest.py
, ви можете просто покласти цей помічник у свій корінь conftest.py
та ввести його, коли потрібно.
root / тести / conftest.py
@pytest.fixture
def mock_redis():
return MockRedis()
root / тести / речі / test.py
def test(mock_redis):
print(mock_redis.get(stuff))
Ще одна річ, яку ви можете зробити, це написати плагін, який можна встановити. У такому випадку ваш помічник може бути записаний де завгодно, але для цього потрібно визначити точку входу, яку слід встановити у вашій та інших потенційних тестових рамках. Дивіться це .
Якщо ви не хочете використовувати світильники, ви, звичайно, можете визначити просту помічницю і просто використовувати звичайний старий імпорт там, де це потрібно.
корінь / тести / помічник / redis.py
class MockRedis():
# stuff
root / тести / речі / test.py
from helper.redis import MockRedis
def test():
print(MockRedis().get(stuff))
Однак тут можуть виникнути проблеми з контуром, оскільки модуль не знаходиться в дочірній папці тесту. Ви повинні мати можливість подолати це (не перевірено), додавши __init__.py
свого помічника
root / тести / помічник / __ init__.py
from .redis import MockRedis
Або просто додати допоміжний модуль до свого PYTHONPATH
.
It seems great. However, I feel the documentation could be better.