如何构建 python 项目以便与 coverage.py 一起使用?

How to structure python project for use with coverage.py?

我有一个布局如下的包裹:

tiny-py-interpreter/
|-- setup.py
|-- .coveragerc
|-- tinypy/
    | -- foo/
    | -- bar/
    | -- tests/
    | -- tinypyapp.py
    | -- run_tests.py

以下是 setup.py 中的一些行:

setup(
    ...
    packages=find_packages(),
    entry_points = {
        'console_scripts' : [ 'tinypy = tinypy.tinypyapp:main']
    },
    test_suite = 'tinypy.run_tests.get_suite',
)

安装包后,安装了一个名为 tinypy 的控制台脚本:

pip3 install .

那我运行报道:

coverage run setup.py test
coverage combine
coverage report

我所有的测试都是以这样的方式实现的,即每个测试都会启动 tinypy 的子进程,所以我在 .coveragerc 中使用 parallel = True 来捕获 .coveragerc 的结果覆盖率 运行.

基本上,我的布局与 coverage itself 相同,其中 coveragecmdline.pytinypy 和 [=24 相同=] 就我而言。

问题:当执行控制台脚本tinypy (tinypyapp.py)时,它使用了安装版本的tinypy包,它位于 /usr/local/lib/python3.5/site-packages/tinypy/。报道忽略 ./tinypy 中的来源(因为它们未被使用)。如果省略 source 参数,则可以从 site-packages/tinypy 查看代码的覆盖率。

问题:如何正确构建项目?当 tinypyapp.py 作为脚本安装时,它安装在与 tinypy 文件夹相同的级别(更高一级,不在内部)。我无法将 tinypyapp.py 放在 tinypy 文件夹之外,因为 setup.py 无法找到它。因此我不能使用 tinypyapp.py 并且必须使用脚本的名称(即 tinypy)。

我目前的解决方法是在根文件夹中创建 test_entry_point.py

tiny-py-interpreter/
|-- setup.py
|-- test_entry_point.py
|-- ...

内容如下:

import sys
from tinypy.tinypyapp import main

if __name__ == '__main__':
    main()

并在测试中启动子进程时使用以下文件名:

tinypy_binary = sys.executable + ' ' + os.getcwd() + '/test_entryp.py'
subprocess.run(tinypy_binary, ...)

我认为最简单的方法是不将您正在处理的代码安装到站点包中,而是使用开发安装:

pip install -e .