2016-10-10 12 views
1

私は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を使用してテストケースを実行すると、ブラウザが表示され、サーバがデータベースを起動してテーブルが作成されます。ただし、テストサーバーは、同じ設定ファイルを使用して初期化されていても、テストケースで作成された行にアクセスすることはできません。

私は両方DBSessionBase.metadata.bindは私のテストケースと私のビュー関数の両方でid()非常に同じを持っている私のmodels.pyviews.pyと、このようにDBSessionengineをからかっ試してみました。 (だから、私の理解では、非常に同じオブジェクトです)しかし、テストケースで作成された行を照会すると、ビューに[]が返され、テストは失敗します。私は、行を作成した後DBSession.flush()と呼ばれているとDBSessionは、このようなmodels.pyに定義されています。

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

は、どのように私はテストサーバーは、テストケースのコードで作成された行を参照するのですか?

答えて

1

これはトリックを行うようだ:

import trasaction 
transaction.commit() 

は、しかし、私は私の実装についての絶対確実ではないので、私はまだ答えを待っています。また、この方法では、各テストケースの前にDBSession.drop_allにする必要があります。

+0

私は機能テストを行うときにこれが回避されるのではないかと心配しています。機能テストWebサーバーはメインのテストコードとは異なるスレッドで実行されなければならず、トランザクションはスレッド境界を越えることができません。 –

+0

データベースに応じて、データベースの特定の最適化を実現してテストを高速化することができます。 –

関連する問題