仅在单元测试中启用Python代码?
假设我有以下这个函数:
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
错误。