我正在为我的 Python 包开发 Jenkins CI/CD 管道。我的项目文件层次结构如下:
project/
- package_name
- file1.py
- file2.py
- etc...
- tests
- unit
- __main__.py
- __init__.py
- test1.py
- test2.py
所有单元测试(我正在使用unittest
)都使用单个命令运行
python -m test.unit
通过添加以下内容的__init__.py
:
内容
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
和 __main__.py
看起来像这样
内容
import unittest
import sys
sys.path.append('../..')
loader = unittest.TestLoader()
start_dir = '.'
suite = loader.discover(start_dir)
runner = unittest.TextTestRunner(verbosity=2).run(suite)
首先,路径更改为./tests/unit
。之后,将顶级目录添加到导入路径中,以便在测试中导入该包。这按预期工作(即,所有其余部分都是通过在项目目录顶部运行 python -m test.unit
来执行的)在我的个人笔记本电脑 (Python 3.6.4) 上。
但是,当我在远程 Jenkins 服务器(以及 Python 3.6.4)上使用相同的技巧时,我收到以下错误:
no module named test.unit.__main__; 'test.unit' is a package and cannot be directly executed
我已经研究了这个问题,但所提出的解决方案似乎都不适合我的情况。
如何修改代码以在 unittest
中创建一个可以在本地和远程运行而不会出现任何问题的测试套件?
编辑
我尝试修改 PYTHONPATH
变量,但没有成功
最佳答案
1。为什么它不起作用?
1.1。关于python -m
和__main__.py
当您运行python -mtests.unit
时,Python解释器将按此顺序运行什么代码
tests.__init__.py
tests.unit.__init__.py
tests.unit.__main__.py
1.2。重现错误
现在,如果删除__main__.py
,您将收到以下错误:
No module named tests.unit.__main__; 'tests.unit' is a package and cannot be directly executed
这与您收到的消息几乎相同。如果您的 sys.path
中有一个文件夹,其中包含名为 test
的文件夹,其结构如下(注意:test
文件夹不在prular,并且没有 __main__.py!)
test
├── __init__.py
└── unit
└── __init__.py
并运行命令
python -m test.unit
Python 解释器尝试运行的内容(按此顺序)
test.__init__.py
test.unit.__init__.py
test.unit.__main__.py <-- missing!
由于 test.unit.__main__.py
丢失,您将收到错误消息
No module named test.unit.__main__; 'test.unit' is a package and cannot be directly executed
这是您收到的错误消息。因此,您的错误消息的原因很可能是您的 sys.path
目录中的某个位置有一个名为 test
的目录,其结构如上所示,并且您正在尝试调用 python -m test.unit
而不是 python -m test.unit
。
2。如何让它发挥作用?
- 删除您在
__init__.py
和__main__ 中使用的
。至少,python unittest 工作不需要它们。os.chdir
和sys.path.append
hack .py - 使用 documentation 中所示的模式创建单元测试(通过子类化unittest.TestCase)
- 通过以下方式运行单元测试
python -m unittest
关于python - unittest,在本地工作,但不在远程服务器上,没有名为 x.__main__ 的模块; 'x'是一个包,不能直接执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62707250/