假设我有以下功能:
def f():
if TESTING:
# Run expensive sanity check code
...
仅当我们运行单元测试时,运行TESTING代码块的正确方法是什么?
[编辑:我可以访问一些“全局”变量来查明单元测试是否已启用?]
答案 0 :(得分:8)
一般来说,我建议不要这样做。您的生产代码确实不应该意识到单元测试存在。其中一个原因是,您的if TESTING
块中的代码可能会导致测试通过(意外),并且由于代码的生产运行不会运行这些位,可能会使您在生产中遇到故障即使你的考试通过了。
然而,如果你坚持这样做,有两种可能的方式(我能想到)可以做到这一点。
首先,您可以将在测试用例中设置的模块级TESTING
var用于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
关键字。当python与-O
一起运行时,解释器将剥离(或忽略)代码中的所有断言语句,允许您在整个过程中使用这些昂贵的gem,并且知道如果在优化模式下执行它们将不会运行它们。确保在没有-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.
关于断言语句的一个注意事项......如果断言语句没有评估为真值,则会引发AssertionError
。