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

标签 python unit-testing

假设我有以下功能:

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

仅当我们运行单元测试时运行测试代码块的正确方法是什么?

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

最佳答案

一般来说,我建议不要这样做。您的生产代码真的不应该意识到单元测试的存在。这样做的一个原因是,您可能在 if TESTING block 中包含使测试(意外)通过的代码,并且由于代码的生产运行不会运行这些位,可能会让您暴露在外即使您的测试通过了,也会导致生产失败。

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

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

生产代码:

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 语句,允许您在整个过程中散布这些昂贵的 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.

关于 assert 语句的警告...如果 assert 语句的计算结果不是真值,将引发 AssertionError

关于python - 只为单元测试启用 Python 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911098/

相关文章:

java - Junit 贯穿还是冗余测试? (基本的)

python - Python 列表中的二进制搜索

unit-testing - 如何测试以文件夹为输入的 HTTP 函数?

java - 使用 'this' 关键字调用 Mockito stub 方法

python - 使用 sqlalchemy 进行连接压缩

.net - 模拟文件系统

c# - 对返回集合的方法进行单元测试

python - 从文件 : how would you make this better? 中找到 N 最大的行

python - 访问自定义损失函数中的特定元素?

python - 更改变量时公式无法正确翻译