测试使用SQLAlchemy的项目

目录

对使用 SQLAlchemy 连接数据库的项目进行单元测试,直接使用项目的数据库不利于测试,需要测试环境安装相应的数据库,很不方便。 python 集成的 sqlite 可以在内存中构建数据库,正好可以用来进行单元测试。 不过这样就必须考虑不同数据库SQL的兼容问题,无法使用特定数据库的独有 SQL 语句。

构建测试数据库

SQLAlchemy 中使用 sqlite:// 表示内存中的 SQLite 数据库。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine("sqlite://")
Session = sessionmaker(bind=self.engine)
session = Session()
Model.metadata.create_all(self.engine)
session.commit()

其中 Model 是整个数据库使用的 Declarative 类。

清空数据库

使用 Model.metadata 清空数据库。

Model.metadata.drop_all(self.engine)

示例

下面是我的一个项目中使用 pytest 做单元测试的示例。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from nwpc_log_model.rdbms_model.models import Model, User

class TestUserTable(object):
    def setup_method(self, method):
        self.engine = create_engine("sqlite://")
        Session = sessionmaker(bind=self.engine)
        self.session = Session()
        Model.metadata.create_all(self.engine)
        self.session.commit()
        
    def teardown_method(self):
        Model.metadata.drop_all(self.engine)

    def test_user_create(self):
        user = User()
        user.user_id = 1
        user.user_name = "my_user"
        self.session.add(user)
        self.session.commit()
        user_query = self.session.query(User).filter(User.user_id == 1)
        query_user = user_query.first()
        assert query_user.user_id == 1
        assert query_user.user_name == "my_user"