2024-05-12 21:55:09 发布
网友
假设我有以下功能:
def f(): if TESTING: # Run expensive sanity check code ...
只有在运行unittest时才运行测试代码块的正确方法是什么?你知道吗
[编辑:是否有一些“全局”变量可供我访问,以确定是否启用了unittests?]你知道吗
一般来说,我建议不要这样做。你的产品代码真的不应该意识到单元测试的存在。其中一个原因是,您的if TESTING块中可能存在使测试通过的代码(意外),而且由于代码的生产运行不会运行这些位,因此即使测试通过,也可能使您暴露在生产失败中。你知道吗
if TESTING
然而,如果你坚持这样做,有两种可能的方法(我能想到)。你知道吗
首先,可以使用在测试用例中设置为True的模块级TESTING变量。例如:
True
TESTING
生产代码:
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一起运行时,解释器将剥离(或忽略)代码中的所有assert语句,从而允许您将这些昂贵的宝石撒到整个代码中,并且知道如果以优化模式执行,它们将不会运行。只需确保在没有-O标志的情况下运行测试。你知道吗
assert
-O
示例(生产代码):
def expensive_checks(): print "expensive stuff..." return True def foo(): print "normal, speedy stuff." assert expensive_checks() foo()
输出(与python mycode.py一起运行)
python mycode.py
normal, speedy stuff. expensive stuff...
输出(与python -O mycode.py一起运行)
python -O mycode.py
normal, speedy stuff.
关于assert语句的一个警告。。。如果assert语句的计算结果不是真值,则将引发AssertionError。你知道吗
AssertionError
一般来说,我建议不要这样做。你的产品代码真的不应该意识到单元测试的存在。其中一个原因是,您的
if TESTING
块中可能存在使测试通过的代码(意外),而且由于代码的生产运行不会运行这些位,因此即使测试通过,也可能使您暴露在生产失败中。你知道吗然而,如果你坚持这样做,有两种可能的方法(我能想到)。你知道吗
首先,可以使用在测试用例中设置为
True
的模块级TESTING
变量。例如:生产代码:
单元测试代码:
第二种方法是使用python的内置
assert
关键字。当python与-O
一起运行时,解释器将剥离(或忽略)代码中的所有assert语句,从而允许您将这些昂贵的宝石撒到整个代码中,并且知道如果以优化模式执行,它们将不会运行。只需确保在没有-O
标志的情况下运行测试。你知道吗示例(生产代码):
输出(与
python mycode.py
一起运行)输出(与
python -O mycode.py
一起运行)关于assert语句的一个警告。。。如果assert语句的计算结果不是真值,则将引发
AssertionError
。你知道吗相关问题 更多 >
编程相关推荐