【问题标题】:Python coverage - skip or mock input methodPython 覆盖 - 跳过或模拟输入法
【发布时间】:2017-11-11 11:25:59
【问题描述】:

上下文

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

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

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


问题

Coverage 是一个用于覆盖报告的 Python 插件。我使用这个命令覆盖:

coverage run application.py

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

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


问题

我想在没有用户输入的情况下运行覆盖工具。在我的测试中,input 函数被模拟了。在没有覆盖的情况下运行我的所有测试都可以正常工作。如何防止覆盖需要用户输入?

【问题讨论】:

    标签: python bash unit-testing jenkins coverage.py


    【解决方案1】:

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

    coverage run tests.py
    

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

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

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

    最后,如果您的应用确实存在无法测试或合理模拟的部分(发生这种情况,例如您正在调用无法在测试中加载的第三方异常跟踪库/服务),您可以指示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

    【讨论】:

    • 很棒的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多