仅在 Python 中定义用于测试的变量

Define variable for testing only in Python

这可能是一个相对简单的问题,但我很难找到其他答案。

我正在做一个小的 Python 项目,我想以测试驱动的方式进行。用户主目录中定义的文件夹中的文件操作对于程序来说非常重要,但我希望这些操作发生在单独的临时文件夹中以进行测试。

有没有办法在我的应用程序中设置一个变量,如果该应用程序意识到它是 运行 作为测试环境的一部分,该变量会有所不同?我目前的解决方法(def some_function(self, test=False) 或包括很多 @patch 装饰器)不是很优雅...

我正在考虑以下内容:

def return_home_folder():
    if testing:
        home = os.getcwd() + '/testrun'
    else:
        home = os.path.expanduser('~')
    returnvalue = home + '/appname/'
    return returnvalue

恕我直言,让函数在测试和生产中表现不同并不是一个好主意。测试的全部意义在于预测程序在生产中的行为,而改变行为有点失败。

(单元测试不同于 "dry run",但这是一个单独的问题。)

我会选择这样的东西:

def get_app_folder():
    return os.path.join(os.path.expanduser("~"), "appname")

def test_get_app_folder():
    assert get_app_folder().startswith(os.path.expanduser("~"))
    assert get_app_folder().endswith("appname")

单元测试本身并没有太大的指导意义,但它们展示了如何解决对 "testing mode" 的需求。

您可以在环境变量中定义您的环境:

$ export MY_APP_ENVIRONMENT=test

settings.py 模块中阅读:

import os

ENVIRONMENT = os.environ['MY_APP_ENVIRONMENT']

_base_dir_map = {
    'test': os.path.join(os.getcwd(), 'testrun'),
    'prod': os.path.expanduser('~'),
}

HOME_DIR = os.path.join(_base_dir_map[ENVIRONMENT], 'appname')

然后,在所有地方(测试和应用程序代码),您将使用 settings.HOME_DIR:

import os
from my_app import settings

file_path = os.path.join(settings.HOME_DIR, 'filename')

...

希望这对你有用,或者让你走上正轨。