Как импортировать функции и классы в conftest.py? Или как импортировать фикстуры и классы в conftest.py?

Я начинаю со всего кода в 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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

Как было сказано ранее, как мне это исправить?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сосредоточившись на примере 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)

В фикстурах я использую подфункции для параметров, потому что кажется, что вы не можете использовать параметры, как обычные функции в фикстурах (см. здесь).

Примечание: ваш тест завершится ошибкой, если база данных правильно добавит «Боба» в качестве нового пользователя. Я не знаю, это ли вы имели в виду.

Я добавил некоторый код, чтобы уточнить мой первоначальный вопрос. Ошибка была вызвана from tests.test_function import test_username_db, что должно быть from .test_function import test_username_db. Почему это вызвало ошибку? Mycode начинается с flaskblog2, а весь код pytest находится в flaskblog2\app\tests path. Я также получаю вторую незначительную ошибку, но я сделаю новый пост об этом.

trewbth 08.04.2023 04:20

Я думаю, вы получаете ошибку из-за того, как Pytest компилирует модули. Когда я попытался сделать что-то подобное, Pytest загружает Conftest.py в память ДО вашего тестового модуля. Таким образом, он не «видит» ваш тестовый модуль, когда вы его запускаете. Это имеет смысл, поскольку Conftest.py используется для настройки тестовой среды перед тестированием. Я бы предложил написать отдельный код для создания экземпляра вашей базы данных в файле Conftest.py.

jwill 10.04.2023 13:56

Вы правы, ваш ответ также блестящий. Хотя, как сказано, вам нужно from .test_function import test_username_db Не возражаете, если отредактируете свой ответ, чтобы он был более подробным?

trewbth 13.04.2023 07:43

Другие вопросы по теме