質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3716閲覧

unittestにてModuleNotFoundErrorが発生する

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/07/05 08:04

問題のあるコード

aaa.py

python

1import bbb 2 3def a_method(): 4 bbb.b_method()

test_aaa.py

python

1from project import aaa 2def test_a_method(): 3 aaa.a_method() 4 # unittestしていく

問題あるディレクトリ

.(workspacefolder) /project /aaa.py /bbb.py /tests /test_aaa.py

発生した問題

ModuleNotFoundError: No module named 'bbb'

わからないこと

  • __init__.pyは必要なのか?projectにもtestsにも必要なのか?
  • Python3になって__init__.pyの何が変わったのか?
  • 問題を解決するにはどうすればよいのか?
  • test_aaa.pyに直接sys.path.append()と書かないで解決できる方法はないのか?

回答よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

cd (some)/project python aaa.py

として実行するつもりのプロジェクトなのだとしたら、想定されているディレクトリ構造は

project/ aaa.py bbb.py tests/ test_aaa.py

だと思います。

https://docs.python.org/ja/3/library/unittest.html#command-line-interface

python -m unittest tests/test_something.py

そのため、テストモジュールを指定するのにシェルのファイル名補完が使えます。指定されたファイルはやはりモジュールとしてインポート可能でなければなりません。パスから '.py' を取り除き、パスセパレータを '.' に置き換えることでモジュール名に変換されます。


あるいは質問の構造であれば、

https://docs.python.org/ja/3/library/unittest.html#test-discovery

-t, --top-level-directory directory
プロジェクトの最上位のディスカバリのディレクトリ (デフォルトは開始のディレクトリ)

cd (some)/workspacefolder python -m unittest discover -t project -s tests

でunittestを起動するのではないでしょうか。(試していませんが)

追記
想定されていないディクレトリ構成なのでしょう。AssertionError: Path must be within the projectが出て停止するようです。


__init__.pyは必須ではなくなりました。
https://docs.python.org/ja/3/reference/import.html#module-path

もはや名前空間パッケージは、 path を操作するコードだけを含む init.py ファイルを提供する必要がなくなりました

投稿2019/07/05 08:23

編集2019/07/08 07:33
quickquip

総合スコア11029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/05 12:08

cd (some)/workspacefolder python -m unittest discover -t project tests こちらのやり方を試しました。しかし、 ImportError: Start directory is not importable: '(some)/workspacefolder/tests' というエラーが発生します。StartDirectoryとTopLevelDirectoryの関係に問題があるのでしょうか?
quickquip

2019/07/08 07:31

python -m unittest discover -t project -s tests で "Path must be within the project" と怒られるっぽいですね。 やはり想定されていないディレクトリ構成なのですね。
guest

0

__init__.pyは必要なのか?projectにもtestsにも必要なのか?
Python3になって__init__.pyの何が変わったのか?

__init__.pyの役割自体は変わっていませんが、
Python3.3以降それを置かなくともディレクトリがパッケージと見做されるようになっています。

参考: What's New In Python 3.3 - 暗黙的な名前空間パッケージ

問題を解決するにはどうすればよいのか?
test_aaa.pyに直接sys.path.append()と書かないで解決できる方法はないのか?

from . import bbbのように、相対的にインポートしてやって下さい。

投稿2019/07/05 08:17

LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/05 12:10

>Python3.3以降それを置かなくともディレクトリがパッケージと見做されるようになっています。 つまり、__init__.pyはPython3.3以降不要であるということですか? 相対的にインポートすると、bbbのすべてにアクセスできてしまいますよね。この問題を起こさずにインポートできないでしょうか?
LouiS0616

2019/07/08 09:34

すみません、通知見落としていました。 --- > __init__.pyはPython3.3以降不要であるということですか? 少なくとも名前空間としてのパッケージを作る目的では。 > 相対的にインポートすると、bbbのすべてにアクセスできてしまいますよね。この問題を起こさずにインポートできないでしょうか? ちょっとイメージが付きません。 import bbb でも全ての要素にアクセスできるのでは。 --- unittestについては詳しくないので、あまり有益なコメントはできなさそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問