файловая структура для pytest, ModuleNotFound - PullRequest
0 голосов
/ 18 июня 2020

Как мне организовать мои файлы, чтобы python -m pytest находил в них классы?


У меня есть следующая структура (в соответствии с соглашением pytest docs ) и несколько сообщения stackoverflow ( this или this , например):

├─ testapp
│   ├─ module
│   │   ├─ __init__.py
│   │   ├─ app.py
│   ├─ test
│   │   ├─ test_app.py

Файлы содержат следующее:

# __init__.py

from .app import App
# app.py

class App:
    def __init__(self):
        pass

    def add(self, a, b):
        return a + b
# test_app.py

import sys
import pytest

# sys.path.insert(0, '../') # doesn't make any difference
# sys.path.insert(0, '../module') # doesn't make any difference
# print(sys.path) # shows that testapp/ is in the path no matter if the two lines above are included or not

import module.App # doesn't work

class TestApp:
    def test_add():
        app = module.App()
        assert app.add(1, 2) == 3

Когда я запускаю python -m pytest в testapp/ (даже сказано, что он выполняется с root на testapp/), я получаю сообщение об ошибке: ModuleNotFoundError: Нет модуля с именем 'module.App' .

Я пробовал module.app.App с удалением кода в __init__.py и без него. Я пробовал вставить . и .. и ../module в путь перед импортом. Я пытался добавить __init__.py s в testapp/ и / или в testapp/test. Я пробовал добавить conftest.py. Ничего не работает. Но это «Хорошие методы интеграции» ( цитата из pytest ), так что это должно работать.

Что я делаю не так? Что мне нужно сделать, чтобы он заработал?

1 Ответ

2 голосов
/ 18 июня 2020

Получаю ошибку: ModuleNotFoundError: No module named 'module.App'.

Вы получаете сообщение об ошибке, что нет модуля module.App, потому что module.App не модуль, это класс.

Просто import module, и он будет работать нормально, используя python -mpytest. Вам понадобится conftest.py в root каталога, если вы также хотите, чтобы прямой pytest (без python -m) работал, , как указано в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...