You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask单元测试误用开发数据库,需切换至内存SQLite配置

问题:单元测试误操作开发数据库,无法切换至内存SQLite

测试时本想使用内存SQLite数据库,结果却操作了开发环境的dev.db,导致数据被删除。以下是问题分析和解决步骤:

问题根源

你的create_app()函数在创建Flask应用时,固定加载了DevelopmentConfig,之后在测试用例里再通过self.app.config.from_object('config.TestConfig')修改配置时,db已经通过db.init_app(app)绑定了开发环境的数据库连接,配置修改不会生效,导致测试仍使用dev.db。

解决步骤

1. 重构create_app函数,支持传入自定义配置

修改app/__init__.py中的create_app函数,让它可以接收配置类参数,默认使用开发配置:

def create_app(config_class=None):
    app = Flask(__name__)
    ma = Marshmallow(app)
    
    # 优先使用传入的配置,否则默认用开发配置
    if config_class is None:
        app.config.from_object('config.DevelopmentConfig')
    else:
        app.config.from_object(config_class)

    db.init_app(app)

    Migrate(app, db)
    JWTManager(app)
    CORS(app)

    api = Api(app, title='Authentication API', doc='/')
    api.add_namespace(auth_namespace, path='/api/auth')
    api.add_namespace(reset_password_namespace, path='/api/')
    api.add_namespace(task_namespace, path='/api/task')

    @app.shell_context_processor
    def make_shell_context():
        return { 'db': db, 'User': User }

    return app

2. 修改测试用例,直接传入测试配置

修改tests/BaseCase.py的setUp方法,调用create_app时直接传入TestConfig,确保应用从一开始就使用内存数据库:

def setUp(self):
    # 直接传入测试配置创建应用
    self.app = create_app(config.TestConfig)
    self.client = self.app.test_client(self)

    self.app_ctxt = self.app.app_context()
    self.app_ctxt.push()        
    db.create_all()

额外验证点

  • 确认config.py中的TestConfig配置无误:
    class TestConfig(BaseConfig):
        TESTING = True
        SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    
  • 测试运行时,检查是否有dev.db的读写操作,确认内存数据库生效。

这样修改后,测试用例会独立使用内存SQLite,不会再影响开发环境的数据库。

内容的提问来源于stack exchange,提问作者Echchama Nayak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:07:10