No trabalho, um dos meus projetos trata principalmente de pegar dados passados de um cliente externo e persistir em um banco de dados. É um aplicativo corporativo Java usando JPA e a maior parte de nossa lógica gira em torno das operações CRUD.
A maioria dos nossos erros envolve JPA de uma maneira ou de outra.
- Exemplo 1: Se você clicar no botão Salvar duas vezes, o JPA poderá tentar inserir a mesma entidade no banco de dados uma segunda vez, causando uma violação da chave primária.
- Exemplo 2: você recupera uma entidade do banco de dados, edita-a e tenta atualizar seus dados. A JPA pode tentar criar uma nova instância em vez de atualizar a antiga.
Muitas vezes, a solução precisa adicionar / remover / alterar uma anotação JPA. Outras vezes, tem a ver com a modificação da lógica do DAO.
Não consigo descobrir como obter confiança em nosso código usando testes de unidade e TDD. Não tenho certeza se é porque os testes de unidade e o TDD são inadequados ou se estou abordando o problema errado.
Os testes de unidade parecem um ajuste inadequado porque só consigo descobrir esses problemas em tempo de execução e preciso implantar em um servidor de aplicativos para reproduzir os problemas. Geralmente, o banco de dados precisa estar envolvido, o que considero estar fora da definição de um teste de unidade: estes são testes de integração.
O TDD parece um ajuste inadequado, porque o loop de feedback de implantação e teste é tão lento que me deixa muito improdutivo. O ciclo de feedback deploy + test leva mais de 3 minutos, e é apenas se eu executar os testes especificamente sobre o código que estou escrevendo. Para executar todos os testes de integração, leva mais de 30 minutos.
Há código fora deste molde e eu sempre teste unitário sempre que posso. Mas a maioria dos nossos bugs e os maiores sumidouros de tempo sempre envolvem o JPA ou o banco de dados.
Há outra pergunta semelhante , mas se eu seguisse o conselho, estaria agrupando a parte mais instável do meu código (o JPA) e testando tudo, menos ele. No contexto da minha pergunta, eu estaria na mesma situação ruim. Qual é o próximo passo após agrupar o JPA? A IMO que pergunta é (talvez) um passo para responder à minha pergunta, mas não uma resposta para ela.
unit testing != TDD
)