【问题标题】:Python Coverage Says Line A is Covered, Need to Know From WherePython Coverage 说 A 行被覆盖,需要知道从哪里
【发布时间】:2020-02-06 17:15:12
【问题描述】:

我有一份可能存在谎言或歪曲事实的报道。它说我覆盖了我的 Django 模型代码中的一行。我看不到那条线在哪里行使。我可以看到模块被导入,类被导入,但没有被调用/实例化。

因此,覆盖率报告说我覆盖了 A 线。大概这意味着 B 线,某处,正在行使它。我想知道B线在哪里。 有没有办法在我的测试中找到调用 Line A 的一组 Line-B 的(一个或多个)?

似乎这可能是覆盖报告中的注释以某种方式/某处。这绝对是可知的,因为覆盖必须跟踪正在使用的东西。

我没看到。

如果这没有实现,我想建议它。我知道,作为每行执行的完整堆栈跟踪,它可能太复杂了。但是,也许只是检查立即调用框架会是一个好的开始,而且很有帮助。

【问题讨论】:

  • 只需在有问题的行之前添加一个import traceback; traceback.print_stack() 并使用-s arg 运行测试。

标签: python unit-testing pytest code-coverage agile


【解决方案1】:

coverage.py 5.0 中的新功能是dynamic contexts,它可以告诉您每行代码运行了什么测试。它不会告诉您该线路的直接呼叫者,但这是一个开始。

【讨论】:

    【解决方案2】:

    这是一种有趣的方式来发现该行的内容:

    在该行中插入一个错误。

    如果您随后运行测试,真正覆盖该行的测试将失败。堆栈跟踪应包括 B 行。

    【讨论】:

    • 动态上下文的先前答案似乎是最好的,我将尝试。当然,我可以为一行添加错误(pdb set trace,也是),但我正在寻找覆盖一大组行的位置,而不仅仅是一个。不过,谢谢。
    猜你喜欢
    • 2011-11-30
    • 2019-02-07
    • 2022-01-21
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2017-12-28
    相关资源
    最近更新 更多