Como usar SQLite: memória: banco de dados em pay web para testes de unidade
-
12-09-2019 - |
Pergunta
Eu quero usar um SQLite na memória ( ": memória:") DB para os testes no meu webapp. Estou usando nosetests para os testes, e webpy como quadro.
Quero preencher o DB na função setup (), e depois executar todos os meus testes. Meu problema é que webpy fecha todas as conexões abertas DB após cada pedido, eo SQLite: memória:. DB só dura até que você fechar a ligação, portanto, apenas o primeiro teste é realmente executado corretamente e todos os outros falham
As minhas escolhas são ou para executar os testes em um disco apoiado DB, ou recriar todo o DB na memória no início de cada teste individual.
Você sabe como posso evitar webpy de fechar conexões de banco de dados depois de cada pedido? Você pode pensar em qualquer outra forma de obter um na memória SQLite DB que dura mais de uma solicitação usando webpy?
Solução
Talvez você possa executar os testes em um DB armazenados no disco, mas usando um RAM disco . No Windows, você pode instalar um driver para configurar um disco RAM ( algumas instruções aqui ). No Linux, eu acredito que você deseja configurar tmpfs .
Um disco de RAM vai agir exatamente como um disco rígido, mas vai operar completamente de memória, de modo que você vai perder alguma da sobrecarga de carregamento de arquivos de / para o disco rígido.
Outras dicas
Não testado:
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
Observe que isso só pode funcionar se você executar web.py de uma forma que usa apenas processo de um sistema operacional. Se um pedido é enviado através de múltiplos processos, cada um ainda vai ter o seu próprio banco de dados.