【问题标题】:Python Unit Testing - Should Other ClassMethods be Mocked?Python 单元测试 - 是否应该模拟其他 ClassMethods?
【发布时间】:2015-09-17 16:22:38
【问题描述】:

这更像是一个过程问题,但我已经用 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 被调用且不带参数。 (我假设这是一个“严格的单元测试”)
  2. 编写一个不模拟load_definitions 函数的测试,而只是确保在给定特定输入的情况下输出符合预期。 (我假设这是一个“严格的功能测试”)
  3. 为了测试代码流是否正常工作以及功能是否按预期工作,请同时执行这两项操作。这对我来说似乎非常多余。

我很想听听您对此的想法和意见。我想,从某种意义上说,这个问题是在询问在哪里与模拟划清界限。真正应该嘲笑什么?是单元测试测试代码流,还是仅仅是函数的输入/输出?

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

【问题讨论】:

    标签: python unit-testing testing mocking


    【解决方案1】:

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

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

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

    您的问题中 1 和 2 之间的区别在于 1 是“白盒”测试,2 是“黑盒”测试。黑盒测试仅在单元/模块/系统的公共接口上运行,白盒测试还查看被测试代码的内部。

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

    • 尝试以最少的工作量测试最多的代码 - 这意味着我更喜欢系统测试而不是单元测试,以及黑盒测试而不是白盒测试。
    • 对于复杂的算法,我使用白盒单元测试来确保算法在所有极端情况下都是正确的。
    • 一旦项目达到一定的成熟度(最好它发布给客户;-) 我让测试由像 Jenkins 这样的持续集成框架自动运行。
    • 看测试覆盖率,争取100%!

    【讨论】:

    • 非常感谢您提供这一见解。根据您的评论和我一直在做的其他研究 - 这就是我的理解:开发人员可以编写白盒测试来测试代码流。这些可以在开发时编写。然而,黑盒测试通常由其他人编写,用作验收测试,也就是功能测试。因此,在原始问题的代码中,白盒单元测试可以作为我可以做的事情,以确保代码可靠,而黑盒测试是我应该 b> 做。
    • 如果你可以用黑盒测试充分测试你的代码,你可以跳过白盒测试。没有法律阻止你编写黑盒测试,尽管我同意在完美的世界中,应该由其他人编写它们。许多测试部门没有能力编写测试(在代码中):他们只能针对用户界面执行手动测试。但也许你可以和一所大学结对,为彼此的代码编写测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2018-07-17
    • 2020-03-19
    • 2022-11-29
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多