【问题标题】:Project directory structure so I can import package for unittest项目目录结构,因此我可以为 unittest 导入包
【发布时间】:2016-03-27 14:07:39
【问题描述】:

我很困惑如何构建一个包含包和单元测试的项目。

我有这个目录结构:

TestProject/
├── package
│   ├── constants.py
│   ├── __init__.py
│   ├── package.py
│   └── tests
│       └── test_package.py
└── usage.py

constants.py

A = 1

__init__.py

from .package import give_A

package.py

from .constants import *

def give_A():
    return A

usage.py

from package import give_A

print(give_A())

test_package.py

import unittest
from package import give_A

class Test_package(unittest.TestCase):
    def test_simple(self):
        self.assertEqual(give_A(), 1)

if __name__ == '__main__':
    unittest.main()

在我尝试运行 test_package.py 模块之前一切正常,这是可以理解的,它无法导入包:

~/Python/TestProject/package/tests $ python3 test_package.py 
Traceback (most recent call last):
  File "test_package.py", line 3, in <module>
    from package import give_A
ImportError: No module named 'package'

但是,这似乎是包/测试的首选结构。我怎样才能让它工作?还是我应该完全不同(结构、目录、导入、测试执行......)?

【问题讨论】:

  • 试试from package.package import give_A?
  • ImportError: No module named package.package。它没有理由工作,因为包不在 PYTHONPATH 中,对吧?
  • 你想从哪里运行脚本?
  • 尝试从包目录python3 tests/test_package.py运行它
  • from .constants import * ... SystemError: Parent module '' not loaded, cannot perform relative import

标签: python python-import python-unittest


【解决方案1】:

要么:

  1. 设置您的PYTHONPATH,使TestProject 在其中。

  2. 像这样使用 unittest 运行测试:

    ~/Python/TestProject $ python3 -m package.tests.test_package

  3. 使用 unittest 命令行界面:

    ~/Python/TestProject $ python3 -m unittest package/tests/test_package.py

欲了解更多信息,请参阅:https://docs.python.org/3/library/unittest.html#command-line-interface

【讨论】:

  • 如果我尝试相对导入,我会得到 SystemError: Parent module '' not loaded, cannot perform relative import。添加到PYTHONPATH 有效,但这是常见的做法吗?
  • 查看stackoverflow.com/questions/16981921/… 要么设置 PYTHONPATH,要么需要使用 python -m package.tests.test_package 运行。
  • 那行得通。人们期望运行这样的测试吗?或者人们是否包含 shell 脚本来运行测试?
  • 文档建议使用 unittest 命令行界面运行测试:docs.python.org/3/library/unittest.html#command-line-interface。不确定这是否适用并且无需进一步调整即可与您的示例一起使用。
  • 酷!我错过了。
猜你喜欢
  • 1970-01-01
  • 2013-07-11
  • 2018-01-19
  • 1970-01-01
  • 2013-11-10
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多