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

标签 python unit-testing testing mocking

这更像是一个过程问题,但我现在用 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. 两者都执行以测试代码流是否正常工作以及功能是否按预期工作。这对我来说似乎非常多余。

我希望您对此有想法和意见。我想,从某种意义上说,这个问题是在询问在何处与 mock 划清界限。真正应该被 mock 的是什么?单元测试是测试代码流,还是只是测试函数的输入/输出?

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

最佳答案

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

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

功能测试是仅查看代码的“功能”方面而不是“非功能”方面的测试。可以在每个级别执行功能测试。

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

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

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

关于Python 单元测试 - 是否应该模拟其他 ClassMethods?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32622040/

相关文章:

ruby - Watir:如何检索与属性匹配的所有 HTML 元素? (类、ID、标题等)

Python 3 : Why are loops faster than recursions?

python - 将 PySpark DataFrame 列中的负值替换为零的最有效方法是什么?

Android/Python 如何验证签名 SHA256withRSA 和 PKCS1 填充

unit-testing - Clojure 中 with-test 的共享定义

java - 如何断言对一个模拟的调用顺序?

python - 将args线程化到给定错误的许多参数?

ios - 在 iOS 单元测试中模拟 NSHTTPURLRequest 和 NSHTTPURLResponse

django - 通过设置的默认语言在测试期间不受尊重

testing - 如何将测试移动到 Rust 的 Cargo 二进制文件的单独文件中?