Как протестировать базу данных Flask SQLAlchemy с разными данными

Я новичок в веб-тестировании. Я хотел бы протестировать свой веб-интерфейс Flask и API, который использует SQLAlchemy, с помощью pytest.

Я хотел бы проверить поведение сервера Flask, когда база данных пуста и когда база данных заполнена.

Пустая база данных и заполнение ее значениями для каждого теста неэффективны, поскольку я считываю данные из файла Excel.

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

...
AssertionError: Popped wrong app context. (<flask.ctx.AppContext object at 0x000001D896BD6F00> instead of <flask.ctx.AppContext object at 0x000001D8980EE090>)
...
AssertionError: Popped wrong request context. (<RequestContext 'http://localhost/' [GET] of project> instead of <RequestContext 'http://localhost/filters/edit/1' [GET] of project>

Мой pytest настроен:

from unittest import TestCase
from paint_filter_manager import create_app


class BaseTestCase(TestCase):
    def setUp(self):
        self.app = create_app("test")
        self.app_context = self.app.app_context()
        self.app_context.push()
        self.client = self.app.test_client()

    def tearDown(self):
        self.app_context.pop()
        self.app = None
        self.app_context = None
        self.client = None

Могу ли я иметь для этой цели две или более базы данных sqlite в памяти? Есть ли эффективное решение?

Заполнение базы данных в памяти должно быть достаточно эффективным для большинства задач тестирования. Можете ли вы уточнить, какие недостатки вы видите? Насколько эффективным вам нужно, чтобы это было? Пример вашего текущего подхода может оказаться полезным.

snakecharmerb 06.06.2024 20:19

Я не уверен, что вы используете pytest при импорте из unittest, но в pytest вы можете использовать фикстуры для каждого теста приложения вместо использования setUp и tearDown - поскольку фикстуры можно параметризовать, вы можете запускать их каждый раз. протестируйте каждое приложение и получите соответствующие отчеты: docs.pytest.org/en/stable/how-to/…

MatsLindh 13.06.2024 14:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Почему бы просто не создать собственный скрипт Python для взаимодействия с базой данных и активного изменения приращения или уменьшения данных в течение заданного интервала и запуска теста параллельно со сценарием? Вы также можете использовать psutils для мониторинга. Я не использовал flask, поэтому не уверен насчет каких-либо встроенных опций мониторинга/

Здравствуйте и добро пожаловать в StackOverflow, спасибо за ваш вклад. Это не совсем ответ на вопрос. Когда у вас будет достаточно репутации, чтобы писать комментарии, предпочтите это сделать.

Maxime Charrière 18.06.2024 11:36
Ответ принят как подходящий

Вы не должны (и не можете) создавать два разных экземпляра приложения Flask в одном проекте. У вас есть как минимум два возможных способа достижения результата: один более простой, а второй более «хакерский». Во-первых, прочтите документ (например, https://flask.palletsprojects.com/en/3.0.x/testing/), правильно используйте pytest, клиенты Flask и приспособления. По сути, они позволят вам создать временный экземпляр базы данных «в памяти», который умрет после запуска тестов, не запутывая вашу производственную/текущую базу данных. Доктора много, и он объяснит все лучше, чем я когда-либо мог бы сделать. Во-вторых, если вам ДЕЙСТВИТЕЛЬНО нужно иметь два экземпляра базы данных по какой-то причине (но я не думаю, что это ваш случай), есть способ. Вы можете поместить условные операторы в свой код перед тем, как указать app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' и перед настройкой механизма базы данных, что обычно делается в models.py или чем-то вроде это (по сути, файл, в котором вы расширяете декларативный базовый класс алхимии SQL или что-то еще, что вы используете). Вы можете связать это с правильно настроенной переменной среды в вашем файле .env, поэтому, например, если переменная TEST в файле .env равна 0, вы используете тестовую базу данных, если она равна 1, вы используете производственную базу данных. Насколько я знаю, это не стандартно и не соответствует рекомендациям. Это просто то, что я придумал, когда мне по каким-то причинам нужно было использовать две разные базы данных в одном экземпляре приложения Flask. Обратите внимание: насколько я знаю, невозможно одновременно записывать/читать данные из двух разных баз данных в одном приложении Flask. SQL Alchemy просто не поддерживает это.

Другие вопросы по теме