这更像是一个过程问题,但我现在用 Python 编程已经有一段时间了,我试图理解单元测试、功能测试之间的区别,以及何时适本地使用模拟以便测试功能。我有以下安排:
@classmethod
def get_value(cls, key):
if cls._definitionsDict is None:
cls.load_definitions()
if not key in cls._definitionsDict:
return None
else:
return cls._definitionsDict[key]
基本上,现在我想为此功能编写一些测试。我正在考虑三种方法,但我真的不确定哪种方法是正确的(阅读:最广泛接受的)做事方式。
- 编写一个模拟
load_definitions
函数的测试,确保当cls._definitionsDict
为None
时,load_definitions
被调用时没有参数。 (我假设这是一个“严格的单元测试”) - 编写一个不模拟
load_definitions
函数的测试,而只是确保在给定特定输入的情况下输出符合预期。 (我假设这是一个“严格的功能测试”) - 两者都执行以测试代码流是否正常工作以及功能是否按预期工作。这对我来说似乎非常多余。
我希望您对此有想法和意见。我想,从某种意义上说,这个问题是在询问在何处与 mock 划清界限。真正应该被 mock 的是什么?单元测试是测试代码流,还是只是测试函数的输入/输出?
作为附加说明,选项 1 似乎符合“单元”测试的想法;但是,源代码的任何更改也需要更新测试。这是单元测试的目标吗?
最佳答案
看来您对测试分类的各种方法有点困惑。让我试着澄清一下。
单元测试是最低级别的测试,较高级别是模块、集成和系统测试。
功能测试是仅查看代码的“功能”方面而不是“非功能”方面的测试。可以在每个级别执行功能测试。
问题 1 和 2 之间的区别是 1 是“白盒”测试,2 是“黑盒”测试。黑盒测试仅在单元/模块/系统的公共(public)接口(interface)上运行,白盒测试也会查看被测试代码的内部。
我个人对测试的想法如下:
- 尝试以最少的努力测试最多的代码——这意味着我更喜欢系统测试而不是单元测试,更喜欢黑盒测试而不是白盒测试。
- 对于复杂的算法,我使用白盒单元测试来确保算法在所有极端情况下都是正确的。
- 一旦项目达到一定的成熟度(最好之前将其发布给客户;-)我让测试由 Jenkins 等持续集成框架自动运行。
- 查看测试覆盖率并力争达到 100%!
关于Python 单元测试 - 是否应该模拟其他 ClassMethods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32622040/