如何使用pytest将模块放入测试工具中?

时间:2019-02-07 01:14:33

标签: python-2.7 unit-testing pytest

假设我有一个名为boop.py

的文件

显示为:

import module_a
import sys

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

我的问题是:

  • 在为此进行测试时,如何使module_a成为虚拟模块? 我知道我需要隔离依赖项。我只是不了解它的机制

  • 是否有必要将其完全隔离?如果我不这样做,它会咬我吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

  • 您能否将DOC置于所有期望的状态/是否可以确保使用DOC实际上可以执行所有有趣的测试方案?如果没有,请更好地隔离,以便您可以以所有所需的方式测试代码。
  • 调用DOC是否会引起任何非专业行为(日期/时间,随机性,网络连接)?然后更好地隔离您的代码以使测试具有确定性。
  • 调用DOC是否会导致无法接受的长时间测试执行?如果是这样,请隔离以确保可接受的测试执行时间。
  • 是否存在使测试相对于您的组件不可靠的DOC稳定性(成熟度)问题,或者甚至更糟糕的是,DOC尚不可用(不适用于您的特定示例)?如果是这样,您最好隔离(甚至只是必须)以使测试可执行并提供有关您自己的代码的可信赖结果。

但是,即使以上条件表明依赖性使您感到困扰:请记住,对代码进行一些重新设计可能比创建测试对偶更可取。例如,通过将计算与交互放到不同的函数中来将计算与交互分开,可以避免您受到嘲笑:您可以使用单元测试来测试计算,而通过集成测试来测试交互。