【问题标题】:Integrity error in pytest Flask-SQLAlchemy sessionpytest Flask-SQLAlchemy 会话中的完整性错误
【发布时间】:2018-06-08 23:16:37
【问题描述】:

我正在将 Flask 应用程序的测试从 unittest 移植到 pytest。对于需要数据库的测试,我添加了一个返回数据库会话的夹具

DB 是一个运行 PostgreSQL 数据库的 SQLAlchemy 对象

import pytest
from app import create_app, db
from app.models import Project, Client

@pytest.fixture(scope='function')
def db_session():
    app = create_app('testing')

    app_context = app.app_context()
    app_context.push()

    db.create_all()

    yield db.session

    db.session.remove()
    db.drop_all()
    app_context.pop()

def test_getJson_withOneProjectSet_returnsBasicClientJson(db_session):
    testClient = Client()
    db_session.add(testClient)

    testProject = Project()
    db_session.add(testProject)

    testClient.projects.append(testProject)

    db_session.commit()

    clientJson = testClient.getJson()

    assert len(clientJson['projects']) == 1


def test_getJson_withThreeProjectsSet_returnsBasicClientJson(db_session):
    testClient = Client()
    db_session.add(testClient)

    testProject1 = Project()
    db_session.add(testProject1)

    testProject2 = Project()
    db_session.add(testProject2)

    testProject3 = Project()
    db_session.add(testProject3)

    testClient.projects.append(testProject1)
    testClient.projects.append(testProject2)
    testClient.projects.append(testProject3)

    db_session.commit()

    clientJson = testClient.getJson()

    assert len(clientJson['projects']) == 3

运行测试时,第一个通过但第二个返回完整性错误:sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) duplicate key value violates unique constraint "project_code_key"

显然在完成测试功能后数据库没有清理

fixture 是来自工作单元测试设置/拆卸功能的端口,没有完整性错误问题:

# def setUp(self):
#     self.app = create_app('testing')
#     self.app_context = self.app.app_context()
#     self.app_context.push()
#     db.create_all()
#
# def tearDown(self):
#     db.session.remove()
#     db.drop_all()
#     self.app_context.pop()

【问题讨论】:

    标签: python postgresql flask flask-sqlalchemy pytest


    【解决方案1】:

    尝试使用范围=“模块”而不是函数,范围模块意味着将这个数据库用于所有测试然后删除它

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 2016-02-24
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 2015-05-16
      • 2021-02-19
      • 1970-01-01
      相关资源
      最近更新 更多