【发布时间】:2020-07-03 01:37:41
【问题描述】:
我正在为我的 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 tests.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 3.6.4) 上按预期工作(即,通过在项目目录顶部运行 python -m test.unit 来执行所有休息)。
但是,当我在远程 Jenkins 服务器(Python 3.6.4 也是)上使用相同的技巧时,我收到以下错误:
no module named test.unit.__main__; 'test.unit' is a package and cannot be directly executed
我已经研究过这个问题,但建议的解决方案似乎都不适用于我的情况。
如何修改我的代码以在 unittest 中创建一个测试套件,该套件将在本地和远程运行而不会出现任何问题?
编辑
我尝试修改PYTHONPATH 变量,但没有成功
【问题讨论】:
-
如果你使用 unittest,你可以运行
python -m unittest discover。您不需要__main__.py。请参阅docs。您也可以删除__init__.py的内容。 -
@mark_s 它确实有 init 文件,这个包是一个合法的 Python 包
-
我还不熟悉 Jenkins,问这个我觉得有点傻,但是远程服务器在运行你的代码时并没有默认使用 Python 2.7 是吗? Google 对您的错误消息的一些响应将其与 Python 2.x 版相关联。
-
@mark_s 两个系统中相同版本的 Python(3.6.4,本地和远程)
-
您确定问题不是由
python -m test.unit与python -m tests.unit错字引起的(注意单个字母的区别)?至少您的问题文本表明可能是这种情况。如果您的问题中有错字,请编辑它,我将删除我的评论。
标签: python unit-testing jenkins module python-unittest