Python单元测试——是否应该模拟其他类方法?

Python单元测试——是否应该模拟其他类方法?,python,unit-testing,testing,mocking,Python,Unit Testing,Testing,Mocking,这更像是一个过程问题,但我已经用Python编程一段时间了,我试图理解单元测试、函数测试之间的区别,以及何时适当地使用mock来测试函数。我有以下安排: @classmethod def get_value(cls, key): if cls._definitionsDict is None: cls.load_definitions() if not key in cls._definitionsDict: return None el

这更像是一个过程问题,但我已经用Python编程一段时间了,我试图理解单元测试、函数测试之间的区别,以及何时适当地使用mock来测试函数。我有以下安排:

@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\u definitions
    函数的测试,确保当
    cls.\u definitionsDict
    None
    时,调用
    load\u definitions
    时不带任何参数。(我假设这是一个“严格的单元测试”)
  • 编写一个测试,该测试不模拟
    load\u definitions
    函数,而只是确保在给定特定输入的情况下,输出符合预期。(我假设这是一个“严格的功能测试”)
  • 为了测试代码流是否正常工作以及功能是否按预期工作,请执行这两项操作。这对我来说似乎是极其多余的
  • 我喜欢你对这件事的想法和意见。我想,从某种意义上说,这个问题是关于在哪里用嘲弄划清界限。什么才是真正应该嘲笑的?单元测试是测试代码流,还是仅仅是函数的输入/输出


    作为补充说明,选项1似乎与“单元”测试的理念相符;但是,源代码中的任何更改也需要更新测试。这是单元测试的目标吗?

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

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

    功能测试是只关注代码的“功能”方面,而不是“非功能”方面的测试。功能测试可以在每个级别进行

    你的问题中1和2的区别在于1是“白盒”测试,2是“黑盒”测试。黑盒测试只在单元/模块/系统的公共接口上运行,白盒测试也会查看正在测试的代码内部

    我个人对测试的看法如下:

    • 尽量用最少的工作量测试最多的代码——这意味着我更喜欢系统测试而不是单元测试,更喜欢黑盒测试而不是白盒测试
    • 对于复杂的算法,我使用白盒单元测试来确保算法在所有情况下都是正确的
    • 一旦项目达到一定的成熟度(最好是在发布给客户之前;-)我就让测试由像Jenkins这样的持续集成框架自动运行
    • 看看测试覆盖率,争取100%
    非常感谢您提供这一见解。从您的评论和我一直在做的其他研究中,我了解到:开发人员可以编写白盒测试来测试代码流。这些可以在开发时编写。然而,黑盒测试通常由其他人编写,并作为验收测试,即功能测试。因此,在原始问题的代码中,白盒单元测试可以作为我可以做的事情,以确保可靠的代码,而黑盒测试是我应该做的事情。如果你可以用黑盒测试充分测试你的代码,你可以跳过白盒测试。没有法律阻止你写黑盒测试,尽管我同意在一个完美的世界里,应该有人写黑盒测试。许多测试部门无法编写测试(代码):他们只能对用户界面执行手动测试。但也许你可以和一所大学配对,为彼此的代码编写测试。