如果在单元测试中,则跳过python中的代码

时间:2018-07-11 07:40:54

标签: python unit-testing python-unittest

我当前的脚本调用一个外部脚本来执行某些任务。我想在单元测试中检查到目前为止的代码,但实际上不运行外部脚本。如果代码是作为单元测试的一部分运行的,我是否可以通过某种方式告诉脚本有效跳过以下代码块?

2 个答案:

答案 0 :(得分:2)

unittest软件包对“模拟”功能和方法提供了广泛的支持。将对外部程序的调用封装在一个简单的函数中,您的单元测试可以覆盖该外部函数(“模拟”),而无需修改程序的结构。示例:

这是程序的一部分,位于模块realcode.py

def internal_function_calling_exec(arg1):
    """The real thing"""
    print("I am executing an external program")


def bigger_function_being_tested(arg1, arg2):
    """
    A complex function with one or more calls to `internal_function_calling_exec`
    """
    print("I will now call `internal_function_calling_exec()`")
    internal_function_calling_exec(42)

您的单元测试将如下所示:

import unittest
from unittest.mock import patch
import realcode

class MyTest(unittest.TestCase):

    @patch("realcode.internal_function_calling_exec")
    def test_something(self, mocked_func):
        realcode.bigger_function_being_tested(1, 2)
        mocked_func.assert_called_with(42)

这将永远不会称为原始internal_function_calling_exec()。相反,这将触发对模拟对象的调用。然后,您的测试可以查询该对象以确认它已被正确调用。

有一些模拟类方法的方法,等等,例如,您可以模拟subprocess.call。但是我认为以上是更好的模式。

答案 1 :(得分:1)

一种可能的方法是在单元测试中设置一个环境变量,然后在要测试的脚本中检查该环境变量。

例如,在unittest.py中:

os.environ["testing"] = "1"

script-to-be-tested.py中:

testing = os.environ["testing"]
... do stuff based on the testing variable

由于将从script-to-be-tested.py调用unittest.py,因此它应该继承环境变量。

可能不是最干净的解决方案,但它应该可以工作。