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