python - unittest,在本地工作,但不在远程服务器上,没有名为 x.__main__ 的模块; 'x'是一个包,不能直接执行

标签 python unit-testing jenkins module python-unittest

我正在为我的 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__ 中使用的 os.chdirsys.path.append hack .py。至少,python unittest 工作不需要它们。
  • 使用 documentation 中所示的模式创建单元测试(通过子类化unittest.TestCase)
  • 通过以下方式运行单元测试
python -m unittest

关于python - unittest,在本地工作,但不在远程服务器上,没有名为 x.__main__ 的模块; 'x'是一个包,不能直接执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62707250/

相关文章:

python - 如何使用ctypes查看python中的指针值更改

python - 如何在 numpy/scipy 中实现像素数学

python - 属性错误 : 'module' object has no attribute 'TwilioRestClient'

unit-testing - 具有提供者依赖性的 Angular2 测试组件

jenkins - 如何在 Jenkins 作业之间共享脚本?

python - 异步 + 多处理 + unix

unit-testing - 有没有办法动态设置测试超时值

java - 验证方法体中是否使用了方法参数

git - 测试成功如何使用Jenkins推送到Github?

python - 导入错误 : PyCapsule_Import could not import module "pyexpat"