仅为单元测试启用Python代码?

Jos*_*ian 1 python unit-testing

假设我有以下功能:

def f():
    if TESTING:
        # Run expensive sanity check code
    ...
Run Code Online (Sandbox Code Playgroud)

只有在我们运行unittest时运行TESTING代码块的正确方法是什么?

[编辑:是否有一些"全局"变量我可以访问以查明单元测试是否已启用?]

Ada*_*ner 8

一般来说,我建议不要这样做.您的生产代码确实不应该意识到单元测试存在.这样做的一个原因是,您可以在if TESTING块中使代码使测试通过(意外),并且由于代码的生产运行不会运行这些位,即使测试通过,也可能使生产失败.

但是,如果你坚持这样做,有两种可能的方式(我能想到)可以做到这一点.

首先,您可以使用TESTING在测试用例中设置的模块级别var True.例如:

生产代码:

TESTING = False    # This is false until overridden in tests

def foo():
    if TESTING:
        print "expensive stuff..."
Run Code Online (Sandbox Code Playgroud)

单元测试代码:

import production

def test_foo():
    production.TESTING = True
    production.foo()    # Prints "expensive stuff..."
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用python的builtin assert关键字.当运行python时-O,解释器将剥离(或忽略)代码中的所有断言语句,允许您在整个过程中使用这些昂贵的gem,并知道如果在优化模式下执行它们将无法运行.只需确保在没有-O标志的情况下运行测试.

示例(生产代码):

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

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

foo()
Run Code Online (Sandbox Code Playgroud)

输出(运行python mycode.py)

normal, speedy stuff.
expensive stuff...
Run Code Online (Sandbox Code Playgroud)

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

normal, speedy stuff.
Run Code Online (Sandbox Code Playgroud)

关于断言语句的一个注意事项......如果断言语句没有评估为真值,AssertionError则会引发一个.