2016-10-10 1 views
1

나는 Splinter (Selenium) 및 StoppableWSGIServer을 사용하여 기능 테스트를 작성했습니다.Pyramid + sqlalchemy 응용 프로그램에 대한 (셀레늄 기반) 기능 테스트에서 데이터베이스에 액세스

... 

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 = scoped_session(sessionmaker(extension=ZopeTransactionExtension())) 

은 어떻게 테스트 서버는 테스트 케이스 코드에서 생성 된 행을 참조해야합니까 : 나는 행을 만들고 DBSession이 같은 models.py에 정의 된 후 DBSession.flush()를 불렀다?

답변

1

이 트릭 할 것 : 내 구현에 대한 절대적으로 확실하지 않다 그러나

import trasaction 
transaction.commit() 

을, 그래서 나는 아직 대답을 기다리고 있어요. 또한,이 방법은 각 테스트 케이스 전에 DBSession.drop_all해야합니다.

+0

기능 테스트를 수행 할 때이 문제가 발생하지 않을까 걱정됩니다. 기능 테스트 웹 서버가 기본 테스트 코드와 다른 스레드에서 실행되어야하고 트랜잭션이 스레드 경계를 넘을 수 없기 때문입니다. –

+0

데이터베이스에 따라 데이터베이스 최적화를 통해 테스트 속도를 높일 수 있습니다. –

관련 문제