Rodando testes do SoapUI com JUnit

O SoapUI é uma boa ferramenta para testarmos APIs SOAP ou REST. Além de testes manuais, podemos também criar Test Suites e Test Cases dentro do SoapUI, para automatizar esse processo. Entretanto, a execução dos testes ainda requer uma intervenção manual (clique com o botão direito -> Launch Test Runner...).

Para colocarmos esses testes dentro de um pipeline de Integração Contínua, precisamos encontrar uma forma de executá-los automaticamente. Neste post, vamos ver como rodar Test Suites e Test Cases criados no SoapUI através do JUnit.

Além de Integração Contínua, essa abordagem permite que você tenha total controle sobre a execução dos testes do SoapUI. No ano passado, trabalhei em um projeto no qual conseguia, através dessa abordagem, integrar testes do SoapUI com testes de UI (com Selenium WebDriver). Eu conseguia chamar um serviço SOAP e, em seguida, verificar que a chamada surtiu efeito na interface Web.
Exemplo: chamar o serviço SOAP de "Bloquear Usuário" e, posteriormente, verificar que o usuário consta como "Bloqueado" na tela de "Consultar Usuário".


Dependências

Neste exemplo, vou usar o Maven para gerenciar as dependências. Para adicioná-las, primeiro verifique a versão do SoapUI que você está usando.

Caso use uma versão igual ou anterior a 4.5.1, adicione, no pom.xml:

  • O seguinte repositório, na tag repositories
<repositories>  
    <repository>
        <id>soapUI</id>
        <url>http://www.eviware.com/repository/maven2/</url>
    </repository>
</repositories>  
  • A dependência maven-soapui-plugin, na tag dependencies
<dependencies>  
    <dependency>
        <groupId>eviware</groupId>
        <artifactId>maven-soapui-plugin</artifactId>
        <version>NUMERO_VERSAO</version>
    </dependency>
</dependencies>  

Caso use uma versão maior do que 4.5.1:

  • O seguinte repositório, na tag repositories
<repositories>  
    <repository>
        <id>soapui</id>
        <url>http://www.soapui.org/repository/maven2/</url>
    </repository>
</repositories>  
  • A dependência soapui-maven-plugin, na tag dependencies
<dependencies>  
    <dependency>
        <groupId>com.smartbear.soapui</groupId>
        <artifactId>maven-soapui-plugin</artifactId>
        <version>NUMERO_VERSAO</version>
    </dependency>
</dependencies>  

IMPORTANTE: A versão da dependência e a do SoapUI usada para criar os testes deve ser sempre a mesma. Já tive problemas na execução de testes mesmo usando versões próximas (dependência com 5.1.2 e versão 5.1.0 do SoapUI).


Como funciona?

Existem duas formas possíveis de executar os testes do SoapUI via JUnit:

  • Rodando todos os testes de uma vez só

Essa forma simplesmente roda todos os test cases de um projeto, ou seja, não permite executar test cases ou suites em específico. Para isso, é usada a classe SoapUITestCaseRunner:

public void rodaTodosOsTestes() throws Exception  
{
  SoapUITestCaseRunner runner = new SoapUITestCaseRunner(); 
  runner.setProjectFile("path/para/arquivo/xml/do/projeto.xml");
  runner.run(); 
}
  • Rodando test cases de forma isolada

Dessa maneira, é possível ter controle sobre a execução dos testes. Você pode rodar um test case específico de uma determinada suite, sem dificuldade:

public void rodaTestCaseEspecifico() throws Exception  
{
  WsdlProject project = new WsdlProject("path/para/arquivo/xml/do/projeto.xml"); 
  TestSuite suite = project.getTestSuiteByName("Test Suite"); 
  TestCase teste = suite.getTestCaseByName("Test Case");

  TestRunner runner = teste.run(new PropertiesMap(), false); 
  assertEquals(Status.FINISHED, runner.getStatus()); 
}

Essa abordagem também facilita a identificação de erros nos testes. Da forma anterior, teríamos que investigar pelo log quais testes falharam, o que pode se tornar custoso facilmente caso você tenha uma quantidade razoável de testes. Rodando os testes separadamente, fica muito simples identificar qual teste falhou. :)


Projeto de Exemplo no GitHub

Para demonstrar a execução dos testes via JUnit, criei um projeto de exemplo no GitHub. Esse projeto está utilizando como base um sample project que vem na instalação do SoapUI, dentro do diretório SoapUI-Tutorials. O sample usado é o Sample-SOAP-Project-soapui-project.xml.

Estrutura do projeto

O repositório consiste em um projeto Maven simples, com as dependências apontando para a versão 5.1.2 (já que essa é a versão do SoapUI que estou utilizando).

src/test/resources

Dentro desse diretório, coloquei o arquivo XML do projeto do SoapUI. Também criei um arquivo de properties chamado config.properties, no qual são setadas duas propriedades:

  • soapui.project: contém o nome do arquivo XML do projeto do SoapUI

  • soapui.test.suite: contém o nome da Test Suite que vamos executar (no caso, só usei uma)

Classe SoapUIUtil

Dentro do diretório src/main/java/soapui/util, criei uma classe chamada SoapUIUtil, com alguns métodos utilitários para facilitar a nossa vida:

  • getProject(): retorna um WsdlProject, a partir do arquivo passado na property soapui.project

  • getTestCaseByName(String testCase): retorna o TestCase com o nome informado, pertencente à TestSuite passada na property soapui.test.suite

  • startMockService() e stopMockService(): como dizem os nomes, esses métodos irão iniciar e parar um mock service usado para execução dos testes

Testes

O projeto contém duas classes de teste (dentro de src/test/java/soapui):

  • SoapUISimpleTest: esse teste usa a abordagem de rodar todos os test cases do projeto do SoapUI, conforme expliquei anteriormente no post

  • SoapUITest: essa classe possui quatro testes, cada um executando um TestCase específico do SoapUI. Antes da execução dos testes, é inicializado o mock service (através de um método com @BeforeClass). Depois da execução dos testes, esse mock service é parado (através de um método com @AfterClass).

Caso você queira rodar todos os testes, basta rodar mvn clean test. Os reports de execução dos testes serão gerados dentro do diretório target/surefire-reports/.

Integração Contínua

O projeto está habilitado para Integração Contínua na nuvem, usando o CircleCI. Para quem não conhece, recomendo fortemente dar uma olhada no CircleCI, é um serviço excelente e bastante simples de usar. Lembrando que, assim como o TravisCI, o CircleCI é gratuito para repositórios públicos (como o projeto de exemplo que vimos) e pago para repositórios privados.


Não deixe de conferir os links que coloquei abaixo, na seção de Referências. Também não hesite em entrar em contato ou postar um comentário caso tenha surgido alguma dúvida, OK?

Abraços e até o próximo post. :)


Referências

https://github.com/stefanteixeira/example-soapui-junit
http://www.soapui.org/test-automation/junit/junit-integration.html
http://www.soapui.org/test-automation/maven/maven-2-x.html
https://thomassundberg.wordpress.com/2011/11/16/testing-a-web-service-with-soapui-junit-maven-and-cucumber/
http://stackoverflow.com/questions/22908086/how-to-run-soapui-tests-from-java-resolved
http://opensourcesoftwareandme.blogspot.com.br/2012/10/testing-web-services-from-junit-using.html


Sobre o autor: Stefan Teixeira trabalha como QA Engineer e, desde o final de 2014, tem se aventurado no mundo DevOps. É Bacharel em Ciência da Computação pela UFRJ e MBA em Garantia de Qualidade de Software pela Escola Politécnica da UFRJ. Entusiasta de Testes Automatizados (e de tudo que possa ser automatizado!), Agile Testing e da cultura DevOps.

Contatos: stefanfk@gmail.com | Twitter | LinkedIn


comments powered by Disqus