即使在创建临时数据库进行测试之后,Flask 单元测试也会使用/访问开发数据库

问题描述 投票:0回答:1

我创建了一个烧瓶应用程序 这是

app.py
文件

from flask_migrate import Migrate
from dotenv import load_dotenv
import os
from src.app import create_app, db


load_dotenv()

app = create_app()

Migrate(app, db)

if __name__ == '__main__':
    app.run()

现在

app.py
文件夹内还有另一个
src
文件,其中定义了函数
create_app

from flask import Flask
from flask_restx import Api
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from dotenv import load_dotenv
import os


load_dotenv()

db = SQLAlchemy()
api = Api(prefix="/api")

def register_extensions(app):
    db.init_app(app)
    api.init_app(app)
    with app.app_context():
        db.create_all()


def register_blueprints(app):
    from src.apis import register_urls
    for route in register_urls.URL_CONFIG.urls:
        api.add_resource(route.view, route.get_url_prefix())

def configure_databse(app):
    @app.teardown_request
    def shutdown_session(exception=None):
        db.session.remove()

db_name = os.environ.get('DB_NAME')
db_user = os.environ.get('DB_USERNAME')
db_pass = os.environ.get('DB_PASSWORD')
db_port = os.environ.get('DB_PORT')
db_host = os.environ.get('DB_HOST')

def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['DEBUG'] = True
    register_extensions(app)
    from src.apis import register_models
    register_blueprints(app)
    configure_databse(app)
    return app

现在在测试文件夹中我创建了一个公共文件夹和一个名为

conftest.py

的文件
import unittest
from app import app as _app
from src.app import db as _db
import json

class BaseTest(unittest.TestCase):
    @classmethod
    def setUp(cls) -> None:
        with _app.app_context():
            _app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///:memory:"
            _db.drop_all()
            _db.create_all()
            cls.client = _app.test_client()

现在即使指定了

"sqlite:///:memory:"
当我
print(_db)
我得到的输出为
f'mysql+pymysql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}'

每当我运行测试用例时,都会在开发数据库中观察到变化。

我在这里做错了什么?

python flask python-unittest flask-restx
1个回答
0
投票

最简单的方法是在运行测试之前准备

env
变量。这是一个例子:

app.py:

import os

from flask import Flask


def create_app():
    _app = Flask(__name__)
    # let's say we have some settings
    _app.config['MODE'] = os.environ.get('MODE') or 'PRODUCTION'
    _app.config['TESTING'] = bool(os.environ.get('TESTING'))  # default = False
    # configure_database(_app)
    # blablabla...
    return _app


app = create_app()

测试.py:

from unittest import TestCase

from app import app


class ExampleTest(TestCase):
    def test_config(self):
        self.assertEqual(app.config['MODE'], 'TEST')
        self.assertTrue(app.config['TESTING'])

覆盖设置并运行测试

export MODE=TEST TESTING=1 && python -m unittest test
:

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

或者您可以在测试前生成

.env.tests
配置并加载所有变量:

source .env.tests && python -m unittest 测试

© www.soinside.com 2019 - 2024. All rights reserved.