Usando Mountebank para ser um stub de dependências externas: um passo a passo.

Otávio Machado
Desenvolvimento ágil | Thoughtworks
3 min readJan 30, 2017

Você está em um projeto onde tem que montar uma grande quantidade de dados de teste?

Testar suas aplicações se tornou difícil porque elas dependem de um grande número de dependências externas?

Suas estruturas de dados são tão complexas que criar amostras desses dados está fora de questão, seja porque é muito difícil fazê-lo, ou porque estas amostras não representam os dados reais com veracidade suficiente?

Testes de performance são coisas além da realidade no sistema no qual você está trabalhando?

Se você respondeu sim para pelo menos uma das questões acima, eu e o Henrique Souza temos uma possível solução para os seus problemas!

Sabe como geralmente criamos mocks, stubs ou spies para testes unitários e de integração, quando não queremos realmente testar o funcionamento daquelas partes específicas da aplicação?

Existem ferramentas que podem fazer o mesmo para dependências externas. Na nossa realidade, queríamos testar a performance do nosso sistema sem considerar o tempo que levava para essas dependências processarem nossas requisições. Queríamos que o teste representasse um fluxo real do sistema, com dados reais — de forma que não cometeríamos o erro de testar a performance com um exemplo extremamente simples, ou tão complexo que nunca aconteceria de verdade.

Por essas razões, começamos a dar uma olhada no Mountebank, uma ferramenta de código aberto que faz todo o processo, desde ajudar a buscar dados de resposta de dependências externas, armazenar estes dados até subir uma aplicação que replica as URLs destas dependências, retornando as respostas armazenadas.

Nós criamos o seguinte passo-a-passo para demonstrar um exemplo simples deste processo, principalmente porque descobrimos que toda vez que tínhamos que explicá-lo para novas pessoas desenvolvedoras, tínhamos que reaprender tudo do zero — e não há muitos exemplos simples e completos na página oficial da ferramenta.

  1. Primeiro, baixe e instale o Mountebank. Você também pode instalá-lo usando:
npm install -g mountebank

2. Inicie o Mountebank. (./mb na pasta do mountebank também funciona)

3. Neste exemplo, nós estamos subindo uma dependência externa localmente. Se você tem essa dependência funcionando em outro lugar, você pode pular este passo.

4. Crie um impostor, como o seguinte:

curl -i -X POST -H 'Content-Type: application/json' http://127.0.0.1:2525/imposters --data '{
"port": 6569,
"protocol": "http",
"name": "proxyOnce",
"stubs": [
{
"responses": [
{
"proxy": {
"to": "http://localhost:8080",
"mode": "proxyOnce",
"predicateGenerators": [
{
"matches": {
"method": true,
"path": true,
"query": true,
"body": true
}
}
]
}
}
]
}
]
}'

Você pode modificar o exemplo no que for necessário, mas garanta que a porta do mountebank (por padrão, 2525) e a porta que irá fazer o redirecionamento (neste caso, 6569) está correta.

As outras opções são para redirecionar apenas a primeira requisição (proxyOnce), usar http, definir o endereço da dependência (http://localhost:8080) e dizer que as requisições, quando forem armazenadas, devem somente responder quando o método da requisição(method), caminho (path), busca(query) e corpo da requisição (body) forem iguais aos da requisição original. Para mais informações, o site do Mountebank tem uma documentação mais detalhada.

5. Faça as requisições que você quer clonar na porta 6569, e a ferramenta irá redirecionar a primeira requisição para a porta 8080.

6. Agora que você tem suas requisições clonadas, se você estiver com a dependência externa rodando localmente, você pode pará-la e verificar que o Mountebank ainda está retornando dados para as requisições que você clonou.

7. Para poder utilizar as requisições clonadas, tudo o que você deve fazer é avisar o mountebank para armazená-las em um arquivo. Isso é feito enquanto o mountebank ainda estiver rodando.

mb save --savefile impostorsPopulated.json

8. Agora você pode replicar este estado sempre que quiser, reiniciando o mountebank com o arquivo que você salvou.

mb --configfile impostorsPopulated.json

Com esta abordagem, fomos capazes de rodar testes de performance para o nosso back-end e, com algumas mudanças, para o nosso front-end também, e esperamos que você possa se beneficiar também!

Este artigo te ajudou? Esquecemos de comentar alguma coisa?

--

--

Otávio Machado
Desenvolvimento ágil | Thoughtworks

Works in tech for 10+ years, learning to be the best engineer and the best leader I can be as I go. When in doubt, choose to be kind.