#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. В зависимости от вашей базы данных вы, вероятно, можете добиться некоторой специфичной для базы данных оптимизации для ускорения тестов.