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
相关产品推荐
相关产品推荐

