测试使用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"