A03ki / uecbbs

@uec_bbsを支えるPythonパッケージTwissifyの管理
https://twitter.com/uec_bbs
MIT License
0 stars 0 forks source link

テスト関数内でのインポートの仕方について #26

Closed A03ki closed 4 years ago

A03ki commented 4 years ago

前提

あとでstorages.pyとtest_storages.pyのファイルを追加する。 このtest_storages.pyにおいて、test_tablesに記述されているtest_idsinsert_test_dbを使いたい。

from test_tables import test_ids, insert_test_db

しかしながら、この記述方法だと全てのテストを実行する際にエラーになってしまう。

python setup.py test

出力:

ModuleNotFoundError: No module named 'test_tables'

解決策1

相対インポートを使う。

from .test_tables import test_ids, insert_test_db

こうすることでpython setup.py testはエラーなく実行できる。

問題点

相対インポートにしたため、テストファイルごとに実行するとエラーになってしまう。

python tests/test_storages.py

出力:

ModuleNotFoundError: No module named '__main__.test_tables'; '__main__' is not a package

解決策2

絶対インポートを使う。

import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), '.'))

from test_tables import test_ids, insert_test_db

python setup.py testpython tests/test_storages.pyで実行できる。

問題点

PEP8 E402に怒られる。

E402 module level import not at top of file

参考文献

Pythonの相対インポートで上位ディレクトリ・サブディレクトリを指定 | note.nkmk.me

A03ki commented 4 years ago

tweepyを参考にすると相対インポートを使っている。 ちなみにinit.pyには何も記述されていない。

参考文献

https://github.com/tweepy/tweepy/tree/master/tests https://github.com/tweepy/tweepy/blob/master/tests/test_api.py#L8 https://github.com/tweepy/tweepy/blob/master/tests/test_auth.py#L8 https://github.com/tweepy/tweepy/blob/master/tests/test_cursors.py#L1 https://github.com/tweepy/tweepy/blob/master/tests/test_rate_limit.py#L4 https://github.com/tweepy/tweepy/blob/master/tests/test_resultset.py#L1 https://github.com/tweepy/tweepy/blob/master/tests/test_streaming.py#L9-L10

A03ki commented 4 years ago

解決策3

__init__.pyに絶対インポートの記述を行う。

import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), '.'))

test_storages.pyでは相対インポートを使わなくていい。

from test_tables import test_ids, insert_test_db

この方法は解決策1と2の問題点を克服した上、python setup.py testpython tests/test_storages.pyを問題なく実行できる。