Voltei ao livro do Beck (Programação eXtrema explicada), mas não achei a resposta nele de forma clara.
Quais testes verificam a integração dos códigos?
Estou realmente tendo muitas dúvidas para responder essa pergunta.
1- Espero que a resposta não seja os testes de unidade. Pois, sempre achei que os testes de unidade testam as classes de forma isoladas utilizando mocks. Ou será que o teste de unidade não precisa testar as classes de forma isolada? Desta forma nunca escreverei um mock no meu projeto já que eu estou visando a integração e terei que escolher escrever testes deforma ascendente para localizar de forma mais prática onde ocorreu um erro.
2- Se a resposta for os testes funcionais tem algo de estranho no livro. Pois, na página 103 ele diz: que após a integração os testes tem que executar a 100%; e na página 121 ele diz: Os testes funcionais não executam necessariamente a 100%.
Não li o livro mas, aqui na empresa, chamamos esse tipo de teste de ‘teste de integração’, que tem um escopo maior do que os testes funcionais.
Um teste unitario verifica que eu posso colocar um item no meu carrinho, calcular desconto, etc - tudo separado.
Um teste funcional verifica que uma compra tem valor X, verifica que o usuario A pode logar, etc
Um teste de integração vai fazer o login com o usuario A, vai adicionar o item no carrinho e devo gerar boleto com o valor X.
Creio que, quando ele diz que os testes funcionais não precisam passar 100%, isso pode ser algo
Temporario (esta em processo de desenvolvimento e algumas partes do codigo não estão prontas)
Definitivo (chega, to sem tempo, são duas e meia da manhã, vai pra cliente amanhã e a tela X, que vai ser usada só uma vez e nunca mais tem um errinho quando alguem tenta cadastrar um XXX com ç)
OK. Mas, no livro Beck só menciona testes de unidade e testes funcionais. Quais dos dois seriam executados n integração contínua?
Este também não seria um teste funcional? Ele reflete justamente o que o usuário que fazer: ele quer se logar no sistema, quer adicionar itens no carrinho e quer gerar o boleto.
Eu diria olhando um pouco por alto que:
Teste de integração visa a integração dos componentes em detalhe maior que o objetivo do usuário;
Teste funcional visa a integração dos componentes em detalhe do objetivo do usuário.
Ambos os testes possuem um nível de integração.
Beck fala que os testes funcionais não precisam sempre estar em 100%, só que isso faz com que eu não possa usar esses testes para integração continua, pois os testes da integração continua tem que sempre executar 100%.
Tem se falado bastante que os testes unitários testam as classes de forma isoladas utilizando mocks. Mas, se eles testam as classes de forma isolada não posso utiliza-los na integração contínua, pois eles são isolado não testam integração.
Acho que essa visão de se ter que isolar uma classe utilizando mocks uma abordagem um tanto quanto equivocada.
Exemplo:
A classe X usa a Y
Na abordagem do isolamento eu teria que criar um mock de Y para testar de forma isolada X.
Na abordagem da “confiança” eu testaria a classe Y e depois testaria a classe X utilizando a classe Y real, não precisaria criar um mock de Y, pois eu já testei Y e sei que ele funciona (confio no Y). Essa abordagem seria um teste de unidade e integração acesdente ao mesmo tempo. Só vejo beneficios de usar essa abordagem: Os testes de integração evoluem ao mesmo tempo que os testes unitarios evoluem e não precisamos ficar criando mocks para tudo. Sera que essa é a abordagem para testes unitarios na XP? Me parece ser pois posso uza-los na integração continua.
Fowler no seu livro de refatoração disse: Testes de unidade são bastante localizados. Cada classe de teste trabalha dentro de um único pacote. Ela testa a interface com outros pacotes, mas assume que esses pacotes funcionem.
Acho esse lance de isolar classes com mocks para executar testes unitarios total exagero, não é nada agil e não te permite utiliza-los na integração continua.
Ai entra a pergunta: se um teste funcional está falhando, qual é o motivo?
É motivo para ‘quebrar’ o build (ou pelo menos dar um warning legal)?
Sobre testes funcionais e de integração: de certa forma é questão de interpretação. No fundo eles podem fazer a mesma coisa, porem vc deve concordar que um teste funcional pode ser feito num pedaço do código, enquanto um teste “super” funcional ou de integração precisa da aplicação como um todo.