【问题标题】:Python unit test that nothing was executed没有执行任何操作的 Python 单元测试
【发布时间】:2022-01-20 15:51:33
【问题描述】:

在一个看起来像这样的方法中:

def my_method(p):
    if p == 5:
        return
    elif p == 6:
        do_something()
        return
    else:
        do_something_different()
        return

如何使用 Python 单元测试来检查当我调用 my_method(5) 时,在 my_method 之外没有执行或更改任何额外内容?我知道我可以模拟 do_somethingdo_something_different 并使用 assert_not_called 但是,有没有办法只考虑 if p == 5: 部分?

【问题讨论】:

  • 如果不检查该方法可能影响的所有内存,你怎么能知道呢?如果您将其作为黑盒进行测试,则不能。如果你有一个白盒子,请使用你的常识。
  • 如果您将问题限制在更合理的范围内,例如do*() 都会影响状态的某些有限部分,您可以验证该部分不会改变。但要令人满意地证明“完全没有副作用”是一项艰巨的任务。
  • 您是否真的想测试 everything 是否被执行?在这种情况下,请查看coverage。在任何情况下:通过代码覆盖,您将看到未执行的内容。
  • 在 Haskell 社区中有一个笑话,返回 IO 值的函数可以做任何事情,包括发射核导弹。在这里,您有一个仅因其副作用而被调用的函数;有太多事情my_method 可以不做检查所有的事情。

标签: python unit-testing python-unittest python-mock


【解决方案1】:

"没有额外的执行.."

使用coverage,您可以查看已执行的内容,因此还可以查看未执行的内容

您将获得一份报告并查看您的测试未涵盖的内容。例如:

$ coverage report -m
Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      4    80%   33-35, 39
my_other_module.py           56      6    89%   17-23
-------------------------------------------------------
TOTAL                        76     10    87%

它还支持 HTML 文件的生成,因此您也可以在需要时获得可视化。在文档中找到this example

如果您运行my_method(5)coverage 将因此向您显示程序的哪些部分未执行。

".. 或在 my_method 之外更改"

我从来没有做过这样的事情,我不确定这是否可行,但我发现this question 指的是tracemalloc。也许这个模块可以帮助你。

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多