web-dev-qa-db-ja.com

pytestでのModuleNotFoundError

testsフォルダーを個別に をアプリケーションコードに追加します。私のプロジェクト構造はそうです

myproject/
  myproject/
    myproject.py
    moduleone.py
  tests/
    myproject_test.py

myproject.py

from moduleone import ModuleOne

class MyProject(object)
....

myproject_test.py

from myproject.myproject import MyProject
import pytest

...

コマンドを使用するため、myproject.myprojectを使用します

python -m pytest

プロジェクトのルートディレクトリから./myproject/

ただし、これらのモジュール内のインポートは失敗します

E ModuleNotFoundError: 'moduleone'という名前のモジュールはありません

私はPython 3.7を実行していて、3.3以降それを読んだので、空の__init__ファイルは不要になりました。つまり、私のプロジェクトは 暗黙の名前空間パッケージ)になります

ただし、__init__.pymyproject/myproject/ファイルを追加しようとしました。また、conftest.pymyproject/ファイルを追加しようとしましたが、どちらも機能しません

私は 回答を読む と言う パスを混乱させる があり、次に しない と言っている他の質問にコメントを賛成しました。

正しい方法は何ですか、何が欠けていますか?

編集;

おそらく関連しているので、requirements.txtを使用して、pipを使用してpytestをインストールしました。これは関係がありますか?もしそうなら、この場合pytestをインストールする正しい方法は何ですか?

編集2:

sys.pathのパスの1つは/usr/src/app/で、これは/my/local/path/myproject/に沿って並べられたドッキングボリュームです。

代わりにボリュームを/my/local/path/myproject/myproject/にする必要がありますか?

5
myol

したがって、sys.pathには、アプリケーションディレクトリとテストディレクトリを含むプロジェクトルートフォルダではなく、アプリケーションディレクトリを含める必要があるようです。

したがって、私の場合、/my/local/path/myproject/myproject/sys.pathではなく/my/local/path/myproject/である必要がありました。

次に、/my/local/path/myproject/pytestを実行できます(python -m pytestは必要ありませんでした)。つまり、/myproject/myproject/内のモジュールは、名前空間を入れ子にすることなく、お互いとテストを見つけることができます。

だから私のテストは

 from moduleone import ModuleOne
 import pytest

 def test_fun():
     assert ModuleOne.example_func() == True

そうは言っても、 多くの問題 があるようですので、これが正しいかどうかはわかりません。

0
myol