2009-08-09 4 views
0

내 webapp의 테스트 용 메모리 (": memory :") DB에 SQLite를 사용하고 싶습니다. 나는 테스트를 위해 nosetests를 사용하고, 프레임 워크는 webpy를 사용하고있다.SQLite : memory : unittesting을위한 webpy 데이터베이스

setup() 함수에서 DB를 채우고 모든 테스트를 실행하고 싶습니다. 내 문제는 webpy가 각 요청 후에 열려있는 모든 DB 연결을 닫고 SQLite : memory : DB가 연결을 닫을 때까지만 지속되므로 첫 번째 테스트 만 실제로 올바르게 실행되고 나머지는 모두 실패한다는 것입니다.

내 선택은 디스크 백업 DB에서 테스트를 실행하거나 개별 테스트가 시작될 때 전체 DB를 메모리에 다시 생성하는 것입니다.

각 요청 후에 webpy가 DB 연결을 닫지 못하도록 방지하려면 어떻게해야합니까? webpy를 사용하는 둘 이상의 요청에 대해 지속되는 메모리 내 SQLite DB를 얻는 다른 방법은 없습니까?

답변

2

아마도 디스크에 저장된 DB에서 테스트를 실행할 수 있지만 RAM disk을 사용하면됩니다. Windows에서 드라이버를 설치하여 RAM 디스크 (some instructions here)를 설정할 수 있습니다. Linux에서는 tmpfs을 설정하려고합니다.

램 디스크는 하드 디스크와 똑같이 작동하지만 메모리에서 완전히 작동하므로 하드 디스크에서 파일을로드하는 오버 헤드가 줄어 듭니다. 테스트되지 않은

+0

그것은 좋은 제안이지만 랜덤 테스터에 대한 설정을 복잡하게 만듭니다. 제 경우에는 그럴 가치가 없습니다. –

2

: 당신은 단지 하나의 운영 체제 프로세스를 사용하는 방법으로 web.py를 실행하는 경우에만 동작 할 수

class NoCloseDB(web.db.SqliteDB): 
    def _unload_context(self): 
    pass # this keeps the _ctx.db attribute alive 
web.db.register_database('sqlite',NoCloseDB) # overrides the previous registration 

알 수 있습니다. 요청이 여러 프로세스에 디스패치되면 각 요청은 여전히 ​​자체 데이터베이스를 갖게됩니다.

+1

작동하지 않습니다. _unload_context는 명시 적으로 커밋 또는 롤백 한 후에 만 ​​요청이 끝날 때 명시 적으로 호출되지 않습니다. 조금 더 살펴보면 _ctl 객체 전체가이 스레드에 연결된 ThreadedDict와 함께 실제로 web.application._cleanup에서 삭제됩니다. 지금이 문제를 해결하는 가장 좋은 방법은 DBUtils를 설치하고 1 개의 연결 풀을 사용하여 연결하는 것입니다. –