Python 如果我的测试用例需要数据库中的数据,而不是空数据库中的数据,该怎么办?

Python 如果我的测试用例需要数据库中的数据,而不是空数据库中的数据,该怎么办?,python,database,testing,pytest,testcase,Python,Database,Testing,Pytest,Testcase,我最近开始编写测试代码,我对为测试设置数据库感到好奇 假设我的web服务器有一个功能,可以计算来自用户的所有数据并验证输出 在这种情况下,我需要在数据库中保存大量原始(剩余)数据 但在另一种情况下,我需要检查我的web服务器是否根据特定数据的存在将用户重定向到正确的页面 这是我的测试夹具代码,如您所见,在db.teardown中,它会删除所有数据 @pytest.fixture(scope='session', autouse=True) def app(request): settin

我最近开始编写测试代码,我对为测试设置数据库感到好奇

假设我的web服务器有一个功能,可以计算来自用户的所有数据并验证输出

在这种情况下,我需要在数据库中保存大量原始(剩余)数据

但在另一种情况下,我需要检查我的web服务器是否根据特定数据的存在将用户重定向到正确的页面

这是我的测试夹具代码,如您所见,在
db.teardown
中,它会删除所有数据

@pytest.fixture(scope='session', autouse=True)
def app(request):
    settings_override = {
        'DEBUG': False,
        'TESTING': True,
        'SQLALCHEMY_DATABASE_URI': f'{DB_CONFIG["VENDOR"]}://{DB_CONFIG["USER_NAME"]}:{DB_CONFIG["PWD"]}@{DB_CONFIG["HOST"]}/{DB_CONFIG["SCHEMA"]}'
    }
    app = _app
    app.config.update(settings_override)
    ctx = app.app_context()
    ctx.push()

    def teardown():
        ctx.pop()

    request.addfinalizer(teardown)
    return app


@pytest.fixture(scope='session', autouse=True)
def db(app, request):
    _db.app = app
    _db.create_all()

    def teardown():
        _db.drop_all()

    request.addfinalizer(teardown)
    return _db


@pytest.fixture(scope='session', autouse=True)
def client(app):
    _client = app.test_client()

    def get_user_config():
        conf = {
            'user_imin': USER_CONFIG['user_imin'],
            'user_token': encrypt_imin_random(USER_CONFIG['user_imin']),
        }
        return conf

    _client.application.config.update(get_user_config())
    return _client


@pytest.fixture(scope='function', autouse=True)
def session(db, request):
    conn = db.engine.connect()
    transaction = conn.begin()
    options = dict(bind=conn, binds={})
    session = db.create_scoped_session(options=options)
    db.session = session

    def teardown():
        transaction.rollback()
        conn.close()
        session.remove()

    request.addfinalizer(teardown)
    return session
如果我注释掉这一行,我的数据仍然存在,但是我不能测试一些需要使用空数据集完成的情况

我想先设置更多的固定装置,这样我就可以

我认为,如果测试用例有一个选项来决定它是否在数据集为空的情况下执行其工作,那就太好了


如果没有,在我的情况下设置测试套件的最佳情况是什么?

您可以使用空数据库启动每个测试。这样,您的测试都是相互独立的。对于需要数据的测试,通过使用数据填充数据库来设置测试。您可能希望重用代码来实现这一点。您可以将生产数据库中的一些数据转储到存储在测试中,作为标准测试集使用。

我认为您所说的通常是人们所做的。但是我害怕这样做,因为一些测试需要如此多的数据,比如200000行,而这些行也依赖于其他数据,这意味着我必须生成其他数据所依赖的另一个数据。我想这是我最后的选择了。我一直在寻找更方便、更好的方法。有没有办法把测试分解成需要更少数据的部分?你在测试中迭代了所有200000行吗?在一些测试中,我会。我已经决定不在会话级别删除数据库,但是在需要空的测试用例中清除。对于那些还遇到这个问题的人,考虑在测试用例中清除数据,并在拆卸阶段回滚。我在拆卸阶段删除了整个数据库,但在案例中删除并在拆卸阶段回滚似乎更合理。