Доступ к тестовой базе данных в функциональных тестах (на основе Selenium) для приложения Pyramid sqlalchemy

#python #selenium #sqlalchemy #pyramid #functional-testing

#python #селен #sqlalchemy #пирамида #функциональное тестирование

Вопрос:

Мне удалось создать функциональные тесты с использованием Splinter (Selenium) и StoppableWSGIServer . Вот мой код:

 ...

engine = engine_from_config(settings, prefix='sqlalchemy.')
DBSession.configure(bind=engine)
Base.metadata.create_all(engine)

...

class FunctionalTest(...):
    ...

    def setUp(self):
        ...
        self.server = http.StopableWSGIServer.create(app)
        self.server.wait()
        self.browser = splinter.Browser("chrome")

    def tearDown(self):
        ...
        self.browser.quit()
        self.server.shutdown()
  

Где app создается с помощью Configurator.make_wsgi_app .

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

Я пробовал издеваться DBSession и engine в моем models.py и views.py , и таким образом, оба DBSession и Base.metadata.bind имеют одинаковое id() значение как в моих тестовых примерах, так и в моих функциях просмотра. (Итак, насколько я понимаю, это те же самые объекты) Тем не менее, запрос строк, созданных в тестовых примерах, возвращается [] в представлении, и тесты завершаются неудачей. Я вызвал DBSession.flush() после создания строк и DBSession определен следующим models.py образом:

 DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
  

Как мне заставить тестовый сервер видеть строки, созданные в коде тестового примера?

Ответ №1:

Кажется, это помогает:

 import trasaction
transaction.commit()
  

Однако я не совсем уверен в своей реализации, поэтому я все еще жду ответов. Кроме того, таким образом, я должен DBSession.drop_all перед каждым тестовым примером.

Комментарии:

1. Боюсь, что при выполнении функционального тестирования нет никакого способа обойти это. Поскольку веб-сервер функционального тестирования должен выполняться в потоке, отличном от вашего основного тестового кода, и транзакции не могут пересекать границы потоков.

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