【问题标题】:How to put a module in a test harness with pytest?如何使用 pytest 将模块放入测试工具中?
【发布时间】:2019-02-07 01:14:32
【问题描述】:

假设我有一个名为boop.py的文件

上面写着:

import module_a
import sys

def boop(value):
    val = module_a.boop_it(value)
    # ...
    return val

我的问题是:

  • 当我为此做测试时,我怎样才能让module_a 成为一个虚拟模块? 我知道我需要隔离依赖项。我只是不明白它的机制

  • 是否需要完全隔离?如果我不这样做,它会来咬我吗?

请注意,这都是遗留代码,已经存在并且有多年的历史

【问题讨论】:

  • 为什么要模拟/存根模块?在您的示例中,模拟 module_a.boop_it 函数将是正确的方法。
  • 正确。我该怎么做?

标签: python-2.7 unit-testing pytest


【解决方案1】:

要回答您的第二个问题“是否有必要完全隔离它?”:这取决于。即使您正在进行单元测试,您通常也不必将代码与所有依赖项隔离开来。例如,您不会将您的代码与math.sin() 隔离开来。我什至会说,除非有原因,否则应该避免创建测试替身。然而,在实践中,往往是有原因的。

这里有一些标准可以帮助您确定 module_a 在单元测试时依赖项是否困扰您。它们都与依赖组件(“DOC”,在您的情况下为 module_a)的属性有关,包括它的传递依赖和您的测试目标:

  • 您能否将 DOC 带入所有需要的状态/您能否确保使用 DOC 您可以实际执行所有有趣的测试场景?如果没有,最好隔离,这样您就可以以所有需要的方式测试您的代码。
  • 调用 DOC 是否会导致任何非确定性行为(日期/时间、随机性、网络连接)?然后更好地隔离您的代码以使测试具有确定性。
  • 调用 DOC 是否会导致无法接受的长时间测试执行?如果是这样,请隔离以确保可接受的测试执行时间。
  • DOC 稳定性(成熟度)问题是否导致您的组件的测试不可靠,或者更糟糕的是,DOC 是否还没有可用(不适用于您的具体示例)?如果是这样,您最好隔离(甚至必须隔离)只是为了让您的测试可执行并为您自己的代码提供值得信赖的结果。

但是,即使上述标准表明依赖项正在困扰您:请记住,对代码进行一些重新设计可能比创建测试替身更可取。例如,通过将计算与交互分离开来,将计算与交互放入不同的函数中,可以避免一些嘲笑:使用单元测试来测试计算,使用集成测试来测试交互。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多