O documento descreve as vantagens do TestNG sobre o JUnit para testes unitários em Java. O TestNG fornece recursos adicionais como execução de métodos de teste individualmente, configuração flexível com XML, relatórios detalhados e integração com outros frameworks.
2. Introdução Testes de Software Ajudam a medir a qualidade do software baseando-se nos defeitos(bugs) encontrados. Reduzem o nível de risco* de um sistema como um todo Risco: um fator que pode resultar em futuras consequências negativas; usualmente expressado como impacto e probabilidade Contribuem para o cumprimento de itens contratuais ou requisitos legais acordados com o cliente Como? Encontrando e corrigindo defeitos ANTES do sistema ser implantado em ambiente operacional.
4. Testes Unitários O teste unitário se concentra na verificação da menor unidade do projeto de software. Em sistemas construídos com uso de linguagens orientadas a objetos, como Java , essa unidade pode ser identificada como um método, uma classe ou mesmo um objeto. A partir de cada uma dessas unidades pode ser definido um conjunto de dados de entrada e saída. Entrada: parâmetros Saída: valor de retorno, exceções ou o estado do objeto. Ferramentas de Teste Unitário simulam dados de entrada e verificam se os dados de saída/retorno refletem realmente o comportamento esperado
5. TestNG Ferramenta Open-Source criada para superar as limitações da ferramenta JUnit e prover features adicionais necessárias para testar a última geração de aplicações Java. (by Cedric Beust)
6. TestNG Executa métodos individualmente (não precisa executar toda a classe como no JUnit) É possível habilitar/desabilitar métodos Configuração flexível, com o uso de XML Contém conversor de métodos de JUnit para TestNG (JUnitConverter) Obs: ocorrem alguns erros quando converte métodos de teste com exceção. Até 2008 o Testng não convertia os testes de exceção e Junit para TestNG. Plugin para Eclipse Reports JUnitmode Default HTML reports JUnitReport HTML plug-in
7. Estruturação dos Testes Unitários TestNG cobre diversas estratégias de testes unitários: Agrupamento por cenário, para quem usa casos de uso. Agrupamento por feature, para quem usa FDD, p.ex. Agrupamento por requisitos, no caso de uma metodologia tradicional como o RUP. Agrupamento por caso de teste ou por roteiro de testes. Além disso, ele permite todas ao mesmo tempo se for utilizado o conceito de grupos.
8. Annotations @Test Identifica um método de teste Groups: grupososquais o métodopertence Parameters: parâmetrosqueserãopassadosparasosmétodos de teste, comodeclarado no testng.xml DependsOnGroups: lista de gruposque o métododepende Timeout: duração máxima de execução do teste antes que ele seja considerado uma falha @Configuration Identifica um métodoparaconfigurar testes Métodos de configuraçãopodem ser agrupados e terdependências beforeTestMethod/afterTestMethod (JUnit: setup/tearDown) beforeTestClass/afterTestClass (JUnit: No equivalent) beforeSuite/afterSuite (JUnit: No equivalent) beforeTest/afterTest (Junit: No equivalent) @ExpectedExceptions Indicaque o métodotestadolançaumaoumaisexceções. É possívelchecar as exceçõeslançadas @DataProvider Provêparâmetrosparamétodos de teste @Factory Criaseusprópriosobjtos de test em tempo de execução
9. Configuração com ‘testng.xml’ Arquivo onde são definidas as configurações de execução dos testes: Métodos de testes, classes e pacotes Quais grupos devem ser executados (include-groups) Quais grupos devem ser excluídos (exclude-groups) Define grupos adicionais (grupos de grupos) Se os testes deve, ser executados em paralelo Parâmetros Modo JUnit
10. Testng.xml <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suitename="Suite1" verbose="1" > <testname="Regression1"> <classes> <classname="test.sample.ParameterSample"/> <classname="test.sample.ParameterTest"/> </classes> </test> <testname="Nopackage" > <classes> <classname="NoPackageTest" /> </classes> </test> </suite> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suitename="Suite1" verbose="1" > <testname="Regression1" > <packages> <package name="test.sample" /> </packages> </test> </suite> Executa todas as classes da package Classes de teste em pacotes diferentes. Quando o arquivo testng.xml está no mesmo pacote, só precisa colocar o nome de classe
11. testng.xml <test name=“Testt1"> <groups> <run> <exclude name="brokenTests" /> <include name="checkinTests" /> </run> </groups> <classes> <class name="test.IndividualMethodsTest"> <methods> <include name="testMethod" /> </methods> </class> </classes> </test> publicclass Test1 { @Test(groups = { "functest", "checkintest" }) publicvoid testMethod1() { } @Test(groups = {"checkintest"} ) publicvoid testMethod2() { } @Test(groups = { "functest" }) publicvoid testMethod3() { } } Vantagem: - Possibilidade de separar grupos de teste como: testes baseados em dados, testes de segurança, testes funcionais, etc... - Possibilidade de criar um grupo para cada funcionalidade.Exemplo: “channel-grid”, “channel-medicao”, “channel-iea”
13. Execução de Testes Maior parte do trabalho é corrigiros testes quefalham A maioria dos frameworks exigemque se executemtodos TestNGcria um arquivo testng-failed.xml Vantagem: é possível re-executarapenasos testes quefalharam
14. Report da Execução TestNGpossuiosewguintesrelatórios: JUnitmode Relatórios Default em HTML PluginJUnitReport HTML TestNG’sowntesting
15. Testes dirigidos a dados (Data-DrivenTesting) Utilizando os DataProviders (@DataProvider) Define métodos que podem ser provedores de dados a outros métodos Permite separar os dados da lógica Dados podemvir de objetos java, arquivostexto, banco de dados, etc… Podem ser definidosconjuntos de dados para testes positivos e para testes negativos
17. Integração com outros Frameworks Maven (v1 e v2) Spring Framework Selenium Cucumber DBUnit GlassfishUnifiedTest Framework (TestNGBased) http://wiki.java.net/bin/view/Projects/GlassFishQuality DBUnit Emma TestCoverage Outros...
18. TestNG vs. JUnit Fonte: http://lijinjoseji.wordpress.com/2008/02/29/testng-56-and-junit-44-which-framework-you-will-choose-for-unit-testing/
19. TestNG vs. JUnit Fonte: http://lijinjoseji.wordpress.com/2008/02/29/testng-56-and-junit-44-which-framework-you-will-choose-for-unit-testing/ Fonte: http://lijinjoseji.wordpress.com/2008/02/29/testng-56-and-junit-44-which-framework-you-will-choose-for-unit-testing/
20. TestNG vs. JUnit Fonte: http://lijinjoseji.wordpress.com/2008/02/29/testng-56-and-junit-44-which-framework-you-will-choose-for-unit-testing/