Python 单元测试 - 是否应该模拟其他 ClassMethods?

Python Unit Testing - Should Other ClassMethods be Mocked?

这更像是一个过程问题,但我已经在 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]

基本上,现在我想为此功能编写一些测试。我正在考虑三种方法,我真的不确定哪种方法是正确的(阅读:最广泛接受的)做事方式。

  1. 编写一个模拟 load_definitions 函数的测试,确保当 cls._definitionsDictNone 时,调用 load_definitions 时不带任何参数。 (我假设这是 "strict unit test")
  2. 编写一个不模拟 load_definitions 函数的测试,而只是确保在给定特定输入的情况下输出符合预期。 (我假设这是 "strict functional test")
  3. 两者都执行以测试代码流是否正常工作以及函数是否按预期工作。这对我来说似乎非常多余。

我很想知道你对此的想法和意见。我想,从某种意义上说,这个问题是在询问在何处与 mock 划清界限。真正应该被嘲笑的是什么?单元测试是测试代码流,还是只是函数的 input/output?

作为附加说明,选项 1 似乎符合 "unit" 测试的想法;但是,源代码的任何更改也需要更新测试。这是单元测试的目标吗?

看来您对测试的各种分类方法有点困惑。让我试着澄清一下。

单元测试是最低级别的测试,较高级别是模块、集成和系统测试。

功能测试是只查看 'functional' 方面而不是代码的 'non-functional' 方面的测试。可以在每个级别执行功能测试。

你的问题1和2的区别是1是'white-box'测试,2是'black-box'测试。黑盒测试仅在 unit/module/system 的 public 接口上运行,白盒测试也会查看被测代码的内部。

个人关于测试的想法如下:

  • 尝试用最少的精力测试最多的代码——这意味着我更喜欢系统测试而不是单元测试,更喜欢黑盒测试而不是白盒测试。
  • 对于复杂的算法,我使用白盒单元测试来确保算法在所有极端情况下都是正确的。
  • 一旦项目达到一定的成熟度(最好是之前将其发布给客户;-)我让测试运行通过持续集成框架自动进行,例如詹金斯。
  • 看测试覆盖率,力争100%!