假设我有以下文件夹结构,用于组织项目仓库中的测试:
project/
app.py
tests/
test.py
app.py
有一个简单的添加功能:
def add(x, y):
return x + y
test.py
测试此功能:
from app import add
import unittest
class TestCase(unittest.TestCase):
def test_add(self):
print('Running the test!')
self.assertEqual(add(3, 4), 7)
if __name__ == '__main__':
unittest.main()
当我使用nose2时,一切正常:
mac:project $ nose2
Running the test!
Ran 1 test in 0.000s
Ok
问题是当我尝试直接运行test.py
时出现以下错误:
mac:project $ python tests/test.py
ModuleNotFound: No module named 'app'
我该如何解决这个问题?原因是我想使用coverage包来衡量代码覆盖率,我得到了同样的错误:
mac:project $ coverage run tests/test.py
ModuleNotFound: No module named 'app'
我已尝试from ..app import app
,但我收到此错误:ValueError: attempted relative import beyond top-level package
答案 0 :(得分:0)
运行python tests/test.py
时,tests
目录位于Python路径上,但父目录不在,因此您无法导入应用程序。
您可以通过在project
中的导入之前添加test.py
目录来使导入正常工作:
import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
答案 1 :(得分:0)
感谢Alasdair有正确的想法。我需要在test.py
的顶部添加以下内容,告诉python在project
中查找导入:
import os, sys
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(parent_dir)