我正在尝试从单独的测试脚本运行针对python模块的单元测试。这是我的文件结构
- root
|- modules
|- a_module.py
|- test
|- test_a_module.py
|- main.py
main.py
看起来像这样:
import unittest
loader = unittest.TestLoader()
suite = loader.discover(start_dir='./test', pattern='test_*.py')
runner = unittest.TextTestRunner()
runner.run(suite)
这是a_module.py
和test_a_module.py
:
# a_module.py
def something():
return True
# test_a_module.py
import unittest
from ..modules.a_module import something
class TestSomething(unittest.TestCase):
def test_something(self):
self.assertTrue(something)
运行python3 main.py
时出现以下错误。
======================================================================
ERROR: test_a_module (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_a_module
Traceback (most recent call last):
File "/usr/lib/python3.7/unittest/loader.py", line 436, in _find_test_path
module = self._get_module_from_name(name)
File "/usr/lib/python3.7/unittest/loader.py", line 377, in _get_module_from_name
__import__(name)
File "/home/schu_max/root/test/test_a_module.py", line 3, in <module>
from ..modules.a_module import something
ImportError: attempted relative import with no known parent package
----------------------------------------------------------------------
我是python的新手,对如何解决此问题一无所知。 SO的其他问题/答案也没有帮助。那我该如何工作呢?
答案 0 :(得分:0)
有几种方法可以运行测试。现在它们是导入包,请尝试
从python -m unittest -v
的相对导入路径中删除两个点后,在根软件包文件夹中 test/test_a_module.py
。也将与同一文件夹中的python main.py
一起使用。如果您在python -m unittest -v
之外发出root
,并且在相对路径前面加上root
,它也会起作用。可能还有其他方法。
请注意,测试文件中的相对导入路径会受到运行测试脚本的文件夹的影响。
要保持连贯性,请始终从同一位置运行测试,并将所有测试放入test/
中,您可以在其中通过相对路径引用所有root子软件包,而无需提及`root *软件包名称,这很好,因为您将来可能要重命名。