O framework Grails oferece uma API rica e simples para execução de testes, para várias fases do processo de produção do aplicativo. Estas fases são inicialmente separadas em:
- unit
- integration
- functional
- other
Novas fases ou tipos de testes podem ser adicionados a estas através do uso de plugins, sendo que as fases functional e other necessitam de plugins específicos antes de serem utilizadas.
Testes de Unidade
Os testes de unidade têm por finalidade garantir o funcionamento de porções mínimas do código implementado, como um método ou a verificação do estado de um objeto após uma determinada operação.
Para se testar comportamentos dinâmicamente criados pelo framework, nesta fase, é necessário fazer a injeção manual destes nas classes ou fazer o mocking de objetos para se conseguir testar por exemplo as constraints de uma classe de domínio ou os controllers.
Teste de integração
A fase de testes de integração difere da fase de teste de unidade pelo fato de o Grails preparar todo o ambiente de execução dos testes conforme este seria no ambiente de execução do aplicativo.
Nesta fase todos os métodos dinamicamente injetados pelo framework estarão disponíveis para uso, sem necessidade de fazer mocking ou injeção manual dos mesmos.
Durante os testes de integração você tem acesso ao um banco de dados configurado no arquivo conf/DataSource.groovy para o ambiente de testes. Durante os testes o Grails e encarrega de criar a estrutura do banco de dados, iniciar uma transação e no final desfazer (rollback) tudo no final do processo transparentemente.
Testes funcionais
Os testes funcionais têm por objetivo enviar requisições HTTP para a aplicação e verificar o comportamento resultante. O Grails não provê suporte nativo para a execução de testes funcionais. Alguns plugins estão disponíveis atualmente para isto:
Executando os Testes
Por definição as classes de teste devem estender a classe GrailsUnitTestCase. Seu nome deve ter o sufixo Tests e seus métodos o prefixo test, conforme a especificação do JUnit 3, que é a base de execução dos testes de unidade e integração do Grails.
As classes de teste de unidade se encontram dentro do diretório test/unit e as de teste de integração no diretório test/integration.
//Um exemplo de classe de teste do Grails package exemplo import grails.test.* class PessoaTests extends GrailsUnitTestCase { protected void setUp() { super.setUp() } protected void tearDown() { super.tearDown() } void testAlgumaCoisa() { assertTrue false } }
As classes de teste de unidade e integração pode ser criadas respectivamentes pelos comandos:
$ grails create-unit-test MeuTesteDeUnidade $ grails create-integration-test MeuTesteDeIntegracao
O comando test-app do Grails oferece algumas opções bem interessantes para acelerar e automatizar o processo de testes da aplicação.
Em sua forma mais comum, sem parâmetros, todos os testes encontrados serão executados:
$ grails test-app
Alguns argumentos podem ser adicionados ao comando para agilizar o processo de teste, como por exemplo específicar uma fase de testes:
$ grails test-app unit: $ grails test-app integration:
Além disso você pode combinar mais parâmetros para testar uma classe isoladamente…
$ grails test-app unit: exemplo.Pessoa $ grails test-app integration: exemplo.PessoaController
ou testar um método específico…
$ grails test-app unit: exemplo.Pessoa.testAlgumaCoisa
Metacaracteres
Você pode utilizar metacaracteres para testar todas as classes de um pacote…
$ grails test-app unit: exemplo.*todas as classes de um pacote e seus subpacotes…
$ grails test-app integration: exemplo.**.*
classes terminadas com uma determinada sentença…
$ grails test-app *Controllerou combinar tudo isto…
$ grails test-app exemplo.**.* *Controller
Visualizando os resultados
O resultado da execução dos testes é salvo na pasta target/test-reports em formato plain text, HTML e XML.
Conclusão
Este artigo é apenas uma breve introdução a API e execução de de testes do Grails. Não deixe de consultar a última versão da documentação do framework.