Windowsでは、サブフォルダーにいくつかの単体テスト(unittest
に基づく)を含むPythonコードベースがあります。
Windowsコマンドプロンプトを使用してフォルダーに移動し、python -m unittest subfolder/tests.py
を使用してすべてのテストを実行します。次に、ファイル内のテストが検出され、実行されます。
Windows Subsystem for Linux bash Shellで同じことを行おうとすると、スタックトレースで次のエラーが発生します。
Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
main(module=None)
File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
self.parseArgs(argv)
File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
self.createTests()
File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
self.module)
File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
File "/usr/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName
module = __import__('.'.join(parts_copy))
ImportError: Import by filename is not supported.
このエラーがWSL bashで発生するのに、cmdでは発生しないのはなぜですか?両方で機能するようにこれを修正するにはどうすればよいですか?
PS-上記のtests.py
の例を次に示します。
import unittest
from target import target
class tests(unittest.TestCase):
def test_pi(self):
expected = 3.1415926
actual = truncate(target.pi(), 7)
self.assertEqual(actual, expected)
def truncate(num, digits):
return int(num * 10**digits) / 10**digits
if __name__ == '__main__':
unittest.main()
最初にディレクトリを<test_cases_dir>
に変更してから、.pyサフィックスなしでコマンドを実行してみてください
から python docs
python -m unittest test_module.TestClass
あなたの例では:
cd subfolder
python -m unittest tests.tests
(愛好家のみ)unittest実装から、相対パスをインポートできません:
def loadTestsFromName(self, name, module=None):
"""Return a suite of all tests cases given a string specifier.
The name may resolve either to a module, a test case class, a
test method within a test case class, or a callable object which
returns a TestCase or TestSuite instance.
The method optionally resolves the names relative to a given module.
"""
parts = name.split('.')
if module is None:
parts_copy = parts[:]
while parts_copy:
try:
module = __import__('.'.join(parts_copy))
break
except ImportError:
. . .