python unittestを実行してテストを行い、discover関数を使用してテストをスイートにパックします。ただし、unittestでテストを実行しようとすると、次のエラーが発生します。
Traceback (most recent call last):
File "D:/Project/run_tests.py", line 12, in <module>
suite2 = unittest.defaultTestLoader.discover(dir2, pattern='test*.py')
File "C:\Python\Python36-32\lib\unittest\loader.py", line 338, in discover
raise ImportError('Start directory is not importable: %r' % start_dir)
ImportError: Start directory is not importable: 'D:\\Project\\dir2'
Run_tests.pyは次のようになります。
import unittest
if __name__ == "__main__":
dir1 = "./test1"
suite1 = unittest.defaultTestLoader.discover(dir1, pattern='test*.py')
runner1 = unittest.TextTestRunner()
runner1.run(suite1)
dir2 = "./tes2"
suite2 = unittest.defaultTestLoader.discover(dir2, pattern='test*.py')
runner2 = unittest.TextTestRunner()
runner2.run(suite2)
非常によく似たエラーがありましたが、シンボリックリンクは関係していません。
これは私のディレクトリレイアウトです。
- project root
- foo
- bar
- test
fooとbarは最上位のパッケージと見なされ、testはすべてのテストケースをライブで実行します。
Intellijでunittestを実行するとき、次のパラメーターを使用しました。
test
フォルダーに設定されたスクリプトパスこの設定でStart directory is not importable
エラーが発生しました。
私はunittest.loader.pyでソースをトレースしましたが、__init__.py
のテストフォルダーをチェックしていることに気付きました。したがって、解決策はtest
フォルダに__init__.py
を追加することです。これが誰かを助けることを願っています。
-編集-
python 3.6、mac osx
CIパイプラインで非常によく似た問題テストを行いました。私の場合、間接フォルダ/トップレベルディレクトリ/テストのレベルがありました
だから私は私のユニットテストコマンドに-sを追加しました:
python -m unittest discover -s folder/topleveldirectory/tests
ここに役立つ答えがある同様の質問 があります。
ただし、これは、LinuxでPyCharmのようにIDEを使用していて、ファイルを soft-linked ディレクトリで開いている場合に発生する可能性があります。テストは、同じモジュールへの2つのパスについて混乱し、1つは存在しないと言います。ソフトリンクなしですべてを1つの場所に配置すると、これが修正されます。
その問題は常にpython PyCharm/IntelliJを使用するプロジェクトで定期的に発生します。そのため、プラットフォーム(通常はLinux)で実行するには、上記の両方のヒントを組み合わせる必要がありました。次の手順で実行します。
__init__.py
_を作成します。シンボリックリンクされたディレクトリを参照するときに、単体テストを実行しようとしたときに次のエラーが発生しました。
トレースバック(最新の呼び出しは最後): ファイル "/home/z003yb2k/.IntelliJIdea2019.2/config/plugins/python/helpers/pycharm/_jb_unittest_runner.py"、35行目、 main(argv = args、module = None、testRunner = unittestpy.TeamcityTestRunner、buffer = not JB_DISABLE_BUFFERING) ファイル "/usr/lib/python3.7/unittest/main.py"、行100 、__ init __ self.parseArgs(argv) ファイル「/usr/lib/python3.7/unittest/main.py」の124行目、parseArgs self._do_discovery内(argv [2:]) _do_discovery 内のファイル "/usr/lib/python3.7/unittest/main.py"、244行目、self.createTests(from_discovery = True、Loader = Loader) createTests 内のファイル "/usr/lib/python3.7/unittest/main.py"、154行目、self.test = loader.discover(self.start、self.pattern 、self.top) discover のファイル「/usr/lib/python3.7/unittest/loader.py」、349行、tests = list(self._find_tests(start_dir、pattern) ) ファイル "/usr/lib/python3.7/unittest/loader.py"、387行、_find_tests name = self._get_name_from_path(start_dir) ファイル"/usr/lib/python3.7/unittest/loader.py "、371行目、_get_name_from_path でアサートしない_relpath.startswith( '..')をアサートしない、「パスはプロジェクト内にある必要がある」 AssertionError:パスが必要プロジェクト内にいる