Um problema que acho que vou encontrar nos meus testes de integração é ter vários testes acessando o mesmo banco de dados. Embora isso não seja um problema agora, eu sei que temos vários aplicativos aqui que acessam o mesmo banco de dados e só estou tentando pensar em uma maneira de evitar esse problema antes que ele aconteça.
Uma ideia que tenho visto muito é usar transações. Na inicialização, você inicia uma transação e, na desmontagem, reverte a transação. Isso significa que vários testes acessam as mesmas tabelas do banco de dados e não afetam um ao outro, o que é ótimo. O problema que tenho é que, no meu caso, 85-95% das tabelas com as quais estou trabalhando no MySQL são MyISAM, que não suportam transações.
Existem maneiras de contornar os mecanismos de armazenamento que não suportam transações, mas ainda permitem que vários testes acessem as mesmas tabelas sem que afetem um ao outro? Pelo que ouvi dizer, a estrutura de teste do ruby on rails usa transações dessa maneira, como eles resolvem esse problema (ou eles)?
fonte
Respostas:
Na minha empresa, houve esse debate: persistência é um grande problema para testes.
Existem alguns hacks que o levarão a meio caminho. Decidimos não perder nosso tempo com eles:
does
e o teste queundoes
. Assim que a correspondência não for perfeita, os sintomas não ficarem claros, um teste poderá falhar enquanto estiver algumas centenas de linhas depois; ou um teste que deve falhar pode passar erroneamente.Então, mudamos para uma política que sabíamos que era válida:
fonte
Mesmo que você não tenha "transações", no sentido T-SQL, você ainda deve se esforçar para tornar suas transações (no sentido geral do termo) atômicas. Os testes não devem depender um do outro e devem ser reversíveis. Se você não possui nenhum escopo oficial de reversão ou transação, convém criar seu próprio. Por exemplo, você pode fazer com que seus testes de unidade executem uma limpeza, onde eles excluem todos os registros que foram criados no teste.
fonte
Apenas peça que cada usuário ou cada execução substitua o banco de dados usado. É o que fazemos no trabalho. Você nunca terá problemas com dois testes simultâneos que interferem entre si.
Cada execução de teste cria o banco de dados com migrações, preenche o banco de dados com acessórios e, em seguida, desativa-os novamente no final.
Se o DBMS suportar transações, usamos isso como uma otimização para a configuração inicial e desmontagem. Eles são opcionais, embora seu teste possa demorar um pouco sem ele. Como sempre YYMV.
Sem confusão, sem confusão.
fonte