Что, если моим тестам нужны данные из базы данных, а не пустая база? - PullRequest
0 голосов
/ 14 февраля 2020

Я недавно начал писать тестовые коды, и мне стало любопытно настроить базу данных для тестирования.

Допустим, у моего веб-сервера есть функция, которая вычисляет все данные от пользователей и проверяет вывод.

В этом случае мне потребуется много исходных (оставшихся) данных в моей базе данных.

Но в другом случае мне нужно проверить, перенаправляет ли мой веб-сервер пользователя на нужную страницу в соответствии с к существованию указанных данных c.

Это мой код тестового прибора, и, как вы можете видеть, в 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

Мои данные все равно будут если я закомментирую строку, но не смогу проверить некоторые случаи, которые необходимо выполнить с пустым набором данных.

Я подумал, что для начала нужно настроить больше приборов, чтобы я мог

Я думаю, было бы неплохо, если бы у тестового примера была возможность решить, выполняет ли он свою работу так, как будто набор данных пуст или нет.

Если нет, то каков наилучший вариант для настройки теста? Люкс в моем случае?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете начать каждый тест с пустой базы данных. Таким образом, ваши тесты не зависят друг от друга. Для тестов, которым нужны данные, настройте тесты, заполнив базу данных данными. Вы, вероятно, хотите повторно использовать код, чтобы сделать это. Вы можете выгрузить некоторые данные из производственной базы данных для хранения вместе со своими тестами для использования в качестве стандартного набора тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...