私はSplinter(Selenium)とStoppableWSGIServer
を使って機能テストを作成しました。Pyramid + sqlalchemyアプリケーションの(Seleniumベースの)機能テストでのテストデータベースへのアクセス
...
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
を使用して:ここに私のコードです。
私のFunctionalTest
を使用してテストケースを実行すると、ブラウザが表示され、サーバがデータベースを起動してテーブルが作成されます。ただし、テストサーバーは、同じ設定ファイルを使用して初期化されていても、テストケースで作成された行にアクセスすることはできません。
私は両方DBSession
とBase.metadata.bind
は私のテストケースと私のビュー関数の両方でid()
非常に同じを持っている私のmodels.py
とviews.py
と、このようにDBSession
とengine
をからかっ試してみました。 (だから、私の理解では、非常に同じオブジェクトです)しかし、テストケースで作成された行を照会すると、ビューに[]
が返され、テストは失敗します。私は、行を作成した後DBSession.flush()
と呼ばれているとDBSession
は、このようなmodels.py
に定義されています。
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
は、どのように私はテストサーバーは、テストケースのコードで作成された行を参照するのですか?
私は機能テストを行うときにこれが回避されるのではないかと心配しています。機能テストWebサーバーはメインのテストコードとは異なるスレッドで実行されなければならず、トランザクションはスレッド境界を越えることができません。 –
データベースに応じて、データベースの特定の最適化を実現してテストを高速化することができます。 –