uaiMockServer – Crie um servidor Rest de teste com apenas uma linha de comando

Olá, tudo bem?

Sabe aquele momento em que você precisa chamar um serviço REST, mas esse serviço não está pronto ainda?

Imagine que você está desenvolvendo uma nova tela do APP que o serviço REST ainda não está pronto. Nesse caso você precisará ter um código falso em seu projeto, e esse código terá que ser substituído quando o serviço ficar pronto. Não importa se você trabalha com Java, .NET, PHP, Ruby, Python, etc.. Você terá que ter sempre o trabalho de primeiro criar o mock e depois criar a chamada real quando o serviço REST não estiver pronto.

Para testes unitários temos o mesmo problema, é comum termos uma classe com a implementação real e uma classe com um código falso. Na hora do teste é que a classe falsa é utilizada. O ruim dessa abordagem é que o código que executa a chamada nunca é testado.

Como podemos resolver esse problema? E o mais interessante: “existe uma solução que atenda delphi, .NET, PHP, Java, Android, IOS, WindowsPhone, etc?”

Apresento para vocês o mais novo produto que criei: “uaiMockServer

Com o uaiMockServer você poderá criar um servidor de teste utilizando o JAR e um arquivo de configuração. Com o uaiMockServer você poderá disparar os testes usando HTTP, mas com seus dados de testes.

Existem dois modos de utilizar o uaiMockServer: Standalone e com Testes Unitários.

Standalone

O modo standalone é quando você dispara o jar manualmente. Para executar o serviço manualmente basta fazer:

java -jar uaiMockServer-{VERSION}.Standalone.jar

Tudo o que você precisa agora é do arquivo de configuração que estará descrito mais abaixo.

No arquivo exemplo de configuração já vem mapeado um hello world apontando para a porta 1234. Se você estiver usando linux, execute o comando:

curl localhost:1234/uaiMockServer/

E você já verá o JSON retornado.

Testes Unitários

Primeiro passo é adicionar o projeto em seu pom:

<dependency>
   <groupId>uaihebert.com</groupId>
   <artifactId>uaiMockServer</artifactId>
   <version>1.0.1</version>
   <scope>test</scope>
</dependency>

Uma vez que a dependência já está em seu pom você pode criar um teste como o abaixo:

public class YourTest {
    private static UaiMockServer uaiMockServer;

    @BeforeClass
    public static void beforeClass() {
        uaiMockServer = UaiMockServer.start();
    }

    @AfterClass
    public static void afterClass() {
        uaiMockServer.shutdown();
    }

    @Test
    public void aTest() {
        final Customer customer = // invoke the URL
        assertTrue(customer != null);
    }
}

A chamada na URL tem que ser feita com algum framework de sua preferência. Eu coloco abaixo um exemplo feito utilizando RestEasy e o arquivo de configuração (mostrado mais abaixo):

@Test
public void isGetRootReturning200() {
    final String url = "http://localhost:1234/uaiMockServer/";

    Client client = ClientBuilder.newClient();
    Response response = client.target(url).request().get();

    assertEquals(200, response.getStatus());
}

A vantagem disso? Agora você não precisa mais de um código mock em seus testes. Você pode chamar diretamente do JUnit o servidor criado.

Configuração

Para rodar corretamente é necessário um arquivo de configuração. Um exemplo simples seria o arquivo abaixo:

com.uaihebert.uaimockserver {
	port = 1234
	host = localhost
	fileLog = false
	consoleLog = true
	context = /uaiMockServer
	defaultContentTypeResponse = "text/html;charset=UTF-8"
	routes = [
	    {
			request {
				path = "/"
				method = "GET"
			}
			response {
				contentType = "application/json;charset=UTF-8"
				statusCode = 200
				body = """{"mockBody":{"title":"Hello World"}}"""
			}
	    }
    ]
}

O arquivo tem que ter a extensão .config e não está no formato JSON, mas sim é um superset do JSON – HCON – utilizado para configurações (clique aqui para mais detalhes).

Com esse arquivo você pode configurar a porta a ser chamada, o host, header, queryparam e diversas outras funções que estão descritas na documentação do uaiMockServer.

Note que foi criado um request e response desse modo você pode simular toda chamada que você quiser.

Caso você rode a versão Standalone, esse arquivo deve ficar na mesma pasta que o jar. Você também pode passar o caminho completo assim:

java -jar uaiMockServer-{VERSION}.Standalone.jar CAMINHO_COMPLETO_DO_ARQUIVO

Caso você vá rodar o serviço em seus testes unitários (JUnit por exemplo), você deve colocar o arquivo na pasta “src/test/resources” do maven. Você também poderia passar o caminho completo do arquivo como:

uaiMockServer = UaiMockServer.start(CAMINHO_COMPLETO_DO_ARQUIVO);

É grátis?

Sim. Use a vontade.

O código fonte é aberto? Sim: https://github.com/uaihebert/uaiMockServer

A documentação está onde? http://uaimockserver.com

E para baixar o .config e o JAR Standalone? http://sourceforge.net/projects/uaimockserver/files/

Tem teste? Sim, Temos bastantes testes unitários e 100% de cobertura.

Performance desse trem é bom?

No próprio GIT tem um teste que dispara 300 requests e tem todas as resposta em menos de 2 segundos.

Agradecimentos Especiais

4 thoughts on “uaiMockServer – Crie um servidor Rest de teste com apenas uma linha de comando

  1. Sem ofença Hébert, DRY! http://migre.me/oAtze
    Talvez vc esteja fazendo uma prova de conceito ou algo assim, mas particularmente me envolveria em algo já produzido pela comunidade – hoje o que toma mais tempo no desenvolvimento é escolher/decidir/optar pelo que já existe à sua disposição.

    Grato por um camarada com boa didática tanto em inglês quanto em português.

    • Gilberto, bom dia.

      Fique tranquilo que não fiquei ofendido não. Ao longo do tempo aprendi que sempre haverá opiniões divergentes e sempre as respeito. E da maioria delas eu sempre aprendo algo, assim como aprendi da sua. (:

      Eu cheguei a pesquisar sobre alguns frameworks e mais abaixo eu coloco um pequeno resumo sobre eles.

      Eu já tentei ajudar diversos frameworks open source, mas a maioria dos códigos são complexo e pior, muitos nem compilavam. Para fazer build, levei horas e as vezes nem funcionavam. Eu concordo com você que deveríamos ajudar no que existe, mas em diversos momentos eu desisti.

      O que me levou a criar o uaiMockServer foi pelos motivos abaixo:

      • Ser fácil de usar
      • Ter Standalne
      • Poder ser utilizando por desenvolvedores de qualquer linguagem de um modo rápido. Com 5min você já consegue estar utilizando
      • Grátis
      • OpenSource
      • Fácil de evoluir – o código está simples, o build rápido
      • Ter confiança de que está testado. 100% de cobertura
      • Performático

      Abaixo deixo um pequeno levantamento que fiz sobre os outros frameworks:

      • WireMock O Standalone tem que funcionar por linha de comando, com isso facilita erros de digitação e dificulta a leitura. A configuração é programática Ele é quem faz a chamada HTTP e não o próprio projeto. A diferença do uaiMockServer para ele é que o uaiMockServer só precisa ter o Start e Shutdown. Não precisa mais de conhecer código java. Apenas um arquivo de configuração. Honestamente são abordagens bem diferentes.
      • SoapUI – Eu sempre usei, mas sempre achei complexo. E no caso dele, você vai precisar ter todos os requests mapeados para depois criar o mock. O meu não substitui o SOAPUI, mas eu sempre o uso mais para teste de integração. Ele disparar meu sistema quando as chamadas externas não estão sendo mocadas.
      • mockable.io – Não é free
      • mocky.io – Precisa ter conexão com Web – Isso pode atrapalhar muito o seu teste
      • mock-server – Totalmente programático. Se você não conhecer a API, vai perder um bom tempo estudando. Quando eu criei o arquivo de configuração para mapear o request/response conseguiram criar seus próprios requests em segundos. Não tiveram problemas em entender seu funcionamento.

      Honestamente eu vi um GAP no mercado e criei uma ferramenta prática e funcional. Pretendo evoluí-la de modo que vire referência.

      Só um último pensamento: se fôssemos apenas investir no que já existe a JBoss não recriaria um servlet container para substituir o Tomcat por exemplo. As vezes uma nova visão e abordagem são necessários.

  2. Muito bom. Parabéns..

    Seria muito interessante gerar a mock através de uma especificação RAML, seria uma ótima feature. Fica a sugestão.

    Abs!

    • João, bom dia.

      Agradeço e muito sua idéia. Eu tenho uma lista de futuras features a sua idéia já está lá.

      Obrigado pelo apoio. (:

Leave a Reply to Gilberto Cancel reply