Python 覆盖率 - 跳过或模拟输入法

Python coverage - skip or mock input method

上下文

我有一个正在单元测试的 python 应用程序。一半的应用程序在运行,我的测试准确率非常高。

该应用程序需要用户一次性输入才能安装。

这意味着,如果您 运行 代码,则必须与用户进行交互。


问题

Coverage 是一个 Python 覆盖率报告插件。我使用此命令覆盖:

coverage run application.py

覆盖率 运行我的应用程序经过我的测试,并提供覆盖率报告。

问题是 运行 这些测试的命令执行我的应用程序,我必须提供输入。这没什么大不了的,但我不能在我的 CI 服务器上使用 Jenkins 做到这一点(或者我可以吗?)。


问题

我想 运行 无需用户输入的覆盖工具。在我的测试中,input 函数被模拟出来了。 运行 我所有没有覆盖的测试都工作正常。如何防止覆盖范围要求用户输入?

您可能应该有 2 种不同的代码路径,一种用于 运行 测试,一种用于 运行 应用程序:

coverage run tests.py

tests.py 导入 application.py,根据需要模拟方法,然后 运行 实际应用程序。

或者您可以允许用户通过命令行参数输入:

coverage run application.py --user=input --other="etc."

最后,如果您的应用确实存在无法测试或无法合理模拟的部分(发生这种情况,假设您正在调出无法加载的第三方异常跟踪 library/service您的测试),您可以指示 coverage 忽略这些行以计算覆盖率,方法是在您不会完全测试的指令末尾添加 # pragma: no cover

my = "code"
goes = "here"

if debug:  # pragma: no cover
    call_untestable(code=True)
    this_portion(ignored_for_coverage=True)

covered_code = "yes, again!"

在此处查看更多内容:

http://coverage.readthedocs.io/en/coverage-4.2/excluding.html