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

2024-05-12 21:55:09 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下功能:

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

只有在运行unittest时才运行测试代码块的正确方法是什么?你知道吗

[编辑:是否有一些“全局”变量可供我访问,以确定是否启用了unittests?]你知道吗


Tags: 方法run功能编辑ifdefcheckcode
1条回答
网友
1楼 · 发布于 2024-05-12 21:55:09

一般来说,我建议不要这样做。你的产品代码真的不应该意识到单元测试的存在。其中一个原因是,您的if 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标志的情况下运行测试。你知道吗

示例(生产代码):

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。你知道吗

相关问题 更多 >