python: 为单元测试设置不同的配置文件

python: setup different config files for unit testing

我正在使用 python 进行个人项目。目前我正在使用 nose 进行单元测试,并且有一个 python 文件用于存储所有设置,如文件路径、数据库配置等。

因为应用程序会连接到数据库,所以我希望在进行单元测试时,应用程序使用的数据库和文件 reads/writes 不是存储所有真实数据的文件。

我认为我可以做的一个好方法是设置几个阶段,但是因为我使用的是纯 python 而没有使用 Django 等任何框架,所以我不确定该怎么做。

我也可以写一个简单的脚本之类的东西在运行单元tests/real工作之前在不同的配置文件之间切换,但我认为这种方式不如设置不同的阶段。

您可以通过此处的不同途径来帮助实现您的目标。

首先,我强烈建议您查看这两个模块。我一直使用这些进行单元测试。

Mock & flexmock

如果你真的想针对数据库进行测试,你可以使用上下文管理器来设置一个临时数据库来进行你的测试,一旦完成它就会自行销毁。有关上下文管理器的信息,请先查看以下内容:

使用模拟,在这种情况下,您可以做的只是模拟您最初导入设置的位置,并使用单元测试版本进行设置。

或者,您也可以查看 fixtures,这将帮助您预先设置一些数据对象,您可以进行相应的测试:Fixtures

将上下文切换到测试上下文的一种有效方法是将配置存储在文件中,以便可以使用 ConfigArgParse 访问它们。当您在生产模式下启动代码时,您可以使用默认配置文件位置,除非使用环境变量重新定义默认位置:

import configargparse
import os 
config_location = os.getenv("MY_PROJECT_CONFIG_LOCATION", default="configs/production.yaml")
parser = configargparse.ArgParser(default_config_files=[config_location], ignore_unknown_config_file_keys=True)

当您在测试模式下启动代码时,您可以使用系统环境变量重新定义默认配置文件位置:

class SomeTestCase(unittest.TestCase):
    def someTestMethod(self):
        os.environ['MY_PROJECT_CONFIG_LOCATION'] = 'configs/test.yaml'
        #any test code here