Я новичок в веб-тестировании. Я хотел бы протестировать свой веб-интерфейс 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 в памяти? Есть ли эффективное решение?
Я не уверен, что вы используете pytest при импорте из unittest, но в pytest вы можете использовать фикстуры для каждого теста приложения вместо использования setUp и tearDown - поскольку фикстуры можно параметризовать, вы можете запускать их каждый раз. протестируйте каждое приложение и получите соответствующие отчеты: docs.pytest.org/en/stable/how-to/…






Почему бы просто не создать собственный скрипт Python для взаимодействия с базой данных и активного изменения приращения или уменьшения данных в течение заданного интервала и запуска теста параллельно со сценарием? Вы также можете использовать psutils для мониторинга. Я не использовал flask, поэтому не уверен насчет каких-либо встроенных опций мониторинга/
Здравствуйте и добро пожаловать в StackOverflow, спасибо за ваш вклад. Это не совсем ответ на вопрос. Когда у вас будет достаточно репутации, чтобы писать комментарии, предпочтите это сделать.
Вы не должны (и не можете) создавать два разных экземпляра приложения 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 просто не поддерживает это.
Заполнение базы данных в памяти должно быть достаточно эффективным для большинства задач тестирования. Можете ли вы уточнить, какие недостатки вы видите? Насколько эффективным вам нужно, чтобы это было? Пример вашего текущего подхода может оказаться полезным.