【发布时间】:2018-10-09 04:11:16
【问题描述】:
我正在使用 click 开发一个 CLI 程序,我想开始使用 coverage.py 添加一些带有代码覆盖率分析的测试。
我认为实现测试的一个好方法是使用子进程运行 CLI 本身。但是,coverage.py 报告零代码覆盖率,可能是因为子进程生成的 Python 实例没有 coverage.py 检测。
我发现 this link 说我可以在我的 PYTHONPATH 中删除一个 sitecustomize.py 文件以始终强制 Python 开始覆盖率测量,但我正在使用 Tox 创建一个 venv 并运行测试。我找不到任何处理此问题的 Tox 设置。
我发现 this answer 说我应该通过 coverage run 运行我的 CLI,但它看起来只有在给出 Python 脚本的路径时才有效,并且我正在尝试通过入口点运行我的 CLI在setup.py 中定义。即我必须将测试代码中的所有命令行从myprogram 更改为coverage run myprogram/cli/cli.py。我宁愿不这样做,因为这不是我期望用户运行程序的方式。
所以看起来这两个选项是:
想办法让
sitecustomize.py在Tox 环境中工作,或者测试代码中的所有命令行都使用脚本路径而不是入口点(从长远来看可能更容易,但会使测试更脆弱且更难理解)。想知道我是否还缺少其他任何东西。
【问题讨论】:
-
FWIW 当我编写类似的程序时,我总是编写测试,其中我的程序与测试代码在同一进程中运行。测试只是按预期设置了
os.environ和sys.argv,然后直接调用myprogram.main()。这种方法适用于tox、coverage和我使用过的其他工具。 -
这很好,我没想过要更改
sys.argv。如果需要,您可以将其添加为答案。 This answer 说你应该用unittest.mock模拟sys.argv,但这感觉有点矫枉过正,不知道为什么...... -
另外,看起来click.testing.CliRunner 应该做正确的事情来在单元测试中调用 CLI。我没有找到,因为我正在寻找看起来像
argparse.ArgumentParser:parse_args()的东西。
标签: python code-coverage coverage.py python-click