Я начинаю со всего кода в conftest.py. Это в примере 1. В примере 2 я хочу переместить такие функции, как def test_username_db():
, в отдельный файл с именем test_function.py. Затем я хочу импортировать из test_function.py в conftest.py. Проблема в том, что я получаю ошибку. Как это исправить?
пример 1
conftest.py
Также я написал здесь класс базы данных.
@pytest.fixture
def test_username_db():
# assume bob exists
user_db = User.query.filter_by(username='Bob').first()
assert user_db != 'Bob'
# other fixtures...
@pytest.fixture()
def create_db(new_user, test_username_db):
bind_key = "testing_app_db"
# Create the database and the database table
db.create_all(bind_key)
db.session.add(new_user)
db.session.commit()
# yield unlike return doesn't stop when called.
yield test_username_db()
yield other fixtures
db.drop_all(bind_key)
test_fixture.py
test_fixture.py(create_db)
create_db()
Пример 2
Теперь представьте, что я хочу разделить дополнительные фикстуры на функции в файле с именем test_function.py.
test_function.py
Also I wrote the database class here.
def test_username_db():
# assume bob exists
user_db = User.query.filter_by(username='Bob').first()
assert user_db != 'Bob'
# other fixtures...
conftest.py
from tests.test_function import test_username_db ...
@pytest.fixture()
def create_db(new_user):
bind_key = "testing_app_db"
# Create the database and the database table
db.create_all(bind_key)
db.session.add(new_user)
db.session.commit()
# yield unlike return doesn't stop when called.
yield test_username_db()
yield # other functions
db.drop_all(bind_key)
test_fixture.py
test_fixture.py(create_db)
create_db()
Это кажется нормальным, но проблема в том, что когда я запускаю код из примера 2, я получаю сообщение об ошибке.
Вот ошибка
python -m pytest
========================================================================================= test session starts ==========================================================================================
platform win32 -- Python 3.10.8, pytest-7.1.2, pluggy-1.0.0
rootdir: C:\Users\user\OneDrive\Desktop\flaskcodeusethis\flaskblog2
collected 0 items / 1 error
================================================================================================ ERRORS ================================================================================================
____________________________________________________________________________________ ERROR collecting test session _____________________________________________________________________________________
..\..\..\..\Anaconda3\envs\py\lib\importlib\__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
<frozen importlib._bootstrap>:1050: in _gcd_import
???
<frozen importlib._bootstrap>:1027: in _find_and_load
???
<frozen importlib._bootstrap>:1006: in _find_and_load_unlocked
???
<frozen importlib._bootstrap>:688: in _load_unlocked
???
..\..\..\..\Anaconda3\envs\py\lib\site-packages\_pytest\assertion\rewrite.py:168: in exec_module
exec(co, module.__dict__)
app\tests\conftest.py:13: in <module>
from tests.test_password_function import app, db, UserTest, email_token_and_registration_confirmation_email
E ModuleNotFoundError: No module named 'tests'
======================================================================================= short test summary info ========================================================================================
ERROR - ModuleNotFoundError: No module named 'tests'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Моя папка для тестирования выглядит так папка с тестами и файлы . Почему возникает эта ошибка?
Также ошибка, которую я опубликовал, я использую функцию def email_token_and_registration_confirmation_email():
вместо def test_username_db():
.
Также ошибка, которую я опубликовал, я использую файл test_functions_use_db.py
вместо test_function.py
.
Вот что я пробовал.
Я попытался изменить функции test_functions_use_db.py на functions_use_db.py. Я получаю тот же эффект.
Я также нашел эту ссылку Использование conftest.py вместо импорта фикстур из специализированных модулей. Я попытался добавить некоторые функции и приспособление test_email_token_and_registration_confirmation_email()
в один файл, и я все еще получаю очень похожую ошибку.
пример 3
В примере 3 вместо функции для def test_username_db():
я использую фикстуру
test_function.py
Also I wrote the database class here.
import fixture
@pytest.fixture
def test_username_db():
# assume bob exists
user_db = User.query.filter_by(username='Bob').first()
assert user_db != 'Bob'
# other fixtures...
conftest.py
from tests.test_function import test_username_db ...
__all__ = ['test_username_db']
@pytest.fixture()
def create_db(new_user, test_username_db):
bind_key = "testing_app_db"
# Create the database and the database table
db.create_all(bind_key)
db.session.add(new_user)
db.session.commit()
# yield unlike return doesn't stop when called.
yield test_username_db()
yield # other functions
db.drop_all(bind_key)
test_fixture.py
test_fixture.py(create_db)
create_db()
Вот точная ошибка для примера 3.
python -m pytest
================================================================= test session starts ==================================================================
platform win32 -- Python 3.10.8, pytest-7.1.2, pluggy-1.0.0
rootdir: C:\Users\nmyle\OneDrive\Desktop\flaskcodeusethis\flaskblog2
collected 0 items / 1 error
======================================================================== ERRORS ========================================================================
____________________________________________________________ ERROR collecting test session _____________________________________________________________
..\..\..\..\Anaconda3\envs\py\lib\importlib\__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
<frozen importlib._bootstrap>:1050: in _gcd_import
???
<frozen importlib._bootstrap>:1027: in _find_and_load
???
<frozen importlib._bootstrap>:1006: in _find_and_load_unlocked
???
<frozen importlib._bootstrap>:688: in _load_unlocked
???
..\..\..\..\Anaconda3\envs\py\lib\site-packages\_pytest\assertion\rewrite.py:168: in exec_module
exec(co, module.__dict__)
app\tests\conftest.py:5: in <module>
from tests.functions_use_db import app, db, UserTest , email_token_and_registration_confirmation_email
E ModuleNotFoundError: No module named 'tests'
=============================================================== short test summary info ================================================================
ERROR - ModuleNotFoundError: No module named 'tests'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Как было сказано ранее, как мне это исправить?
Сосредоточившись на примере 3, он может иметь какое-то отношение к тому, как Pytest загружает модули. Когда я ссылаюсь на свой тестовый модуль в файле conftest.py, я столкнулся с ошибками. Я бы предложил написать код для создания экземпляра вашей базы данных в другом модуле, отличном от тестового модуля (возможно, в вашем модуле Competition.py). Кроме того, я поместил все свои приборы в модуль conftest. Таким образом, ваш код будет выглядеть примерно так.
test_functions.py
#pass your fixture name as a parameter
def test_username_db(create_db):
#reference your fixture in this function to call it
db_usr_name = create_db("Bob")
assert db_usr_name != 'Bob'
conftest.py
import pytest
@pytest.fixture()
def create_db():
def _subfunc(new_user):
#code to create your db here
return db.user_name
yield
#do your tear down functions here (don't reference any functions in your test_functions.py module)
В фикстурах я использую подфункции для параметров, потому что кажется, что вы не можете использовать параметры, как обычные функции в фикстурах (см. здесь).
Примечание: ваш тест завершится ошибкой, если база данных правильно добавит «Боба» в качестве нового пользователя. Я не знаю, это ли вы имели в виду.
Я думаю, вы получаете ошибку из-за того, как Pytest компилирует модули. Когда я попытался сделать что-то подобное, Pytest загружает Conftest.py в память ДО вашего тестового модуля. Таким образом, он не «видит» ваш тестовый модуль, когда вы его запускаете. Это имеет смысл, поскольку Conftest.py используется для настройки тестовой среды перед тестированием. Я бы предложил написать отдельный код для создания экземпляра вашей базы данных в файле Conftest.py.
Вы правы, ваш ответ также блестящий. Хотя, как сказано, вам нужно from .test_function import test_username_db
Не возражаете, если отредактируете свой ответ, чтобы он был более подробным?
Я добавил некоторый код, чтобы уточнить мой первоначальный вопрос. Ошибка была вызвана
from tests.test_function import test_username_db
, что должно бытьfrom .test_function import test_username_db
. Почему это вызвало ошибку? Mycode начинается сflaskblog2
, а весь код pytest находится вflaskblog2\app\tests path
. Я также получаю вторую незначительную ошибку, но я сделаю новый пост об этом.