仅在单元测试中启用Python代码?

3 投票
1 回答
764 浏览
提问于 2025-04-17 05:04

假设我有以下这个函数:

def f():
    if TESTING:
        # Run expensive sanity check code
    ...

那么,怎样才能确保只有在运行单元测试的时候,才执行TESTING这段代码呢?

[补充:有没有什么“全局”变量可以用来判断当前是否在运行单元测试?]

1 个回答

9

一般来说,我建议不要这样做。你的生产代码其实不应该知道单元测试的存在。这样做的一个原因是,你可能在 if TESTING 这个代码块里写了一些代码,让测试意外通过,而生产环境下的代码不会执行这些部分,这样即使你的测试通过了,生产环境也可能会出现问题。

不过,如果你坚持要这样做,我能想到两种可能的方法。

首先,你可以在模块级别使用一个 TESTING 变量,在你的测试案例中把它设置为 True。比如:

生产代码:

TESTING = False    # This is false until overridden in tests

def foo():
    if TESTING:
        print "expensive stuff..."

单元测试代码:

import production

def test_foo():
    production.TESTING = True
    production.foo()    # Prints "expensive stuff..."

第二种方法是使用 Python 内置的 assert 关键字。当你用 -O 参数运行 Python 时,解释器会忽略你代码中的所有 assert 语句,这样你就可以在代码中随意放置这些比较耗费资源的检查,而知道在优化模式下它们不会被执行。只要确保在没有 -O 参数的情况下运行你的测试。

示例(生产代码):

def expensive_checks():
    print "expensive stuff..."
    return True

def foo():
    print "normal, speedy stuff."
    assert expensive_checks()

foo()

输出(用 python mycode.py 运行)

normal, speedy stuff.
expensive stuff...

输出(用 python -O mycode.py 运行)

normal, speedy stuff.

关于 assert 语句有一点需要注意……如果 assert 语句的结果不是一个真值,就会引发一个 AssertionError 错误。

撰写回答