Sou iniciante mas a idéia do JUnit é COMPROVAR que o seu trabalho esta sendo bem feito e as suas classes estão funcionando bem…
E mas uma prova para o empregador (Cliente) de que o código o sistema que ele esta pegando esta funcionando bem todo o desenvolvedor deveria testar os seus códigos + realmente não da tempo xD
Me falaram um pouco sobre test driven development e, me corrijam se eu estiver errado, a ideia dela é testar os metodos enquanto os criamos mas isso acho que já é implicito, afinal como vou usar um metodo que nao funciona?
Quando se tem poucos métodos, é fácil verificar o funcionamento. Mas em um sistema com centenas ou milhares de classes, uma alteração simples pode gerar consequências enormes. Com testes automatizados, os problemas podem ser rastreados rapidamente, reduzindo a quantidade de bugs no produto final.
Tenho ainda algumas perguntas em relação ao JUnit.
desculpem fazer tantas perguntas, ja li varios artigos e achei bastante confusa a ideia.
Por exemplo, tenho a seguinte situação:
Tenho um metodo com retorno nulo e que tem um parametro que cadastra uma pessoa em um banco, salvarPessoa(Pessoa pessoa) por exemplo, e quero testa-lo, como fazer? até porque preciso da conexao entao nao poderia testa-lo individualmente.
1 * A)Como vou construir a pessoa sem passar parametros no testCadastroPessoa()???
B) E como poderia funcionar esse metodo se eu nao tenho uma conexao com o banco, pois ele vai ter que cadastar em algum lugar para realizar o teste ne?
C) E memso se eu tivesse a conexao, a cada teste vou passar o mesma pessoa sempre que eu for testar isso??? nao vai causar probemas no banco isso?
Achei confuso…
D)Tenho que fazer um metodo forçando um erro? e se sim porque?? nao me parece util
Então, diversos frameworks disponibilizam extensões para pode rodar testes unitários. O Spring, por exemplo, possui extensões para pode rodar seus testes inicializando um ApplicationContext, o JBoss possui projetos para testar EJBs, JSF, etc, em testes unitários.
A) Vc pode construir a pessoa manualmente, tipo new Pessoa() e depois usar os métodos set para definir os atributos ou usar um framework para criar objetos mock, como o JMock.
B) Sobre a questão da conexão, do meu ponto de vista, não deveria ser o cliente que cria uma conexão com o banco e sim sua classe responsável por gravar os dados. Nos métodos vc pode colocar umas anotações para o método rodar antes do seu teste, ai neste ponto vc poderia inicializar as configurações de sua aplicação(conexão com o banco, propriedades, etc).
C) Ai depende da situação, mas provavelmente em cada chamada passará um conjunto de dados diferente, afinal vc deseja testar seu projeto em diferentes situações.
bem sobre a questao a vc falou dar um new Pessoa() e setar os atributos, mas dessa maneira como posso ter varias pessoas diferentes pois toda vez que esse metodo for chamado vai cirar o mesmo objeto. como posso ter casos diferentes dessa maneira?
Vc pode ter vários testes em uma mesma classe, como coloquei no 1 exemplo:
[code]void testSalvarErro() {
Pessoa p = new Pessoa();
p.set…;
xyz.salvar§; // Se neste ponto não der erro algo esta errado
}
void testSalvarOK() {
Pessoa p = new Pessoa();
p.set…;
xyz.salvar§; // Se neste ponto der erro algo esta errado
}
// E por ai vai
…
void testExcluirOK();
void testExcluirErro();
…
// Ou usando mock
void testSalvarMock() {
Pessoa p = …criaMock(); // cria o mock, depende da implementação
xyz.salvar§; // Dependendo de como seu mock foi criado, vc pode esperar um erro ou não
}[/code]
Por que no teste unitário vc passa um valor e espera um determinado retorno. Por exemplo se somar 1 + 1 eu espero 2, se não vier 2 algo está errado. Da mesma forma posso somar 1 +1, esperar 3 e o método me retornar 2, nesse caso não é o método que esta errado e sim meu teste.
Independente de qualquer metodologia de desenvolvimento(TDD, BDD, etc…) o objetivo dos testes unitario é grarantir que determinada funcionalidade do seu sistema esta realmente funcionando. Como você citou, ninguem coloca metodos que não funcionem, porem como vc garante que em “n” situações o resultado será o esperado. Para grandes empresas, testes unitarios são obrigatorios, ele geram grande parte das evidencias de teste.
Não necessariamente você precisa testar metodo a metodo, e sim funcionalidades.
Seu testes deve funcionar independentemente de recursos externos, por exemplo, Banco de Dados ou qualuqe operação I/O.
Você pode garantir isso com Mocks que simulam essas informações, entaum existem algumas regras para implementar isso.
No caso de testar um metodo void como vc citou, msm ele sendo void ele executou alguma tarefa sendo assim vc pode verificar se o que ele executou resultou no esperado.