如何分发 python 以单元测试作为可执行入口点的包?

how to distribute python packages with unittests as executable entry points?

我正在编写一个 python 程序包,其中将可执行脚本注册到 'setup.py' 作为入口点。当安装包时,这些被放置 进入 python 包安装的 "bin" 目录,不带“.py”扩展名。我希望能够 运行 包的单元测试 安装包后也可以作为可执行文件。单元测试在 "test_package.py" 中,它在 setup.py 的 "entry_points" 中: 运行 python 个包

setup(
  entry_points={
      'console_scripts': [
          'my_exec = mypackage.my_exec:main'
          'test_package = mypackage.test_package.main'],
  }
)

test_package.py 脚本从 "test-files":

读取一些文件
mypackage/
  setup.py
  mypackage/
    my_exec.py
    test_package.py
    # files needed to run tests
    test-files/
    # directory containing files written by 'test_package'
    test-results/

当我 运行 "test_package.py" 包中时它工作正常。但是当我安装它并且 "test_package" 在 "bin" 中创建为可执行文件时,然后 运行ning:

$ test_package

从命令行找不到测试。它说 "ran 0 tests"。这个目录结构有什么问题?以某种方式分发单元测试的正确方法是什么 他们可以从命令行 运行 即使他们创建文件?如果软件包是为使用 sudo 权限的人安装的,那么我希望没有 sudo 权限的用户能够 运行 这些而不需要对软件包安装位置的写入权限。

test_package.py的结构是:

class TestPackage(unittest.Test):
  def setUp():
     ...
  def test_foo():
     # read stuff from 'test-files/'
     # ...
     # output stuff to 'test-results/'
     # ...

def main():
    unittest.main()


if __name__ == '__main__':
    main()

默认情况下 unittest.main 尝试在 __main__ 模块中查找测试。因为您尝试从入口点 运行 进行测试,所以该模块不再 __main__

可能如果您尝试将 module 参数传递给 unittest.main 函数,即 mypackage.test_package 它可能会起作用。

有关详细信息,请参阅 unittest.main 的文档: