Olá a todos! Hoje queremos apresentar à comunidade de TI nosso produto — uma IDE para trabalhar com APIs . Talvez alguns de vocês já saibam sobre nós a partir de . No entanto, não houve uma visão abrangente da ferramenta, então estamos corrigindo essa lacuna.

Motivação
Gostaríamos de começar explicando como, de fato, chegamos a essa decisão e decidimos desenvolver nossa ferramenta para um trabalho avançado com APIs. Vamos começar com uma lista de funcionalidades que um produto, que podemos considerar como uma "IDE para trabalhar com APIs", deve ter:
- Criação e execução de solicitações e scripts (sequências de solicitações)
- Escrita de diversos tipos de testes
- Geração de testes
- Trabalho com a descrição da API, incluindo importação de formatos como Swagger, OpenAPI, WADL, etc.
- Mocking de solicitações
- Boa suporte a uma ou mais linguagens de programação para escrita de scripts, incluindo integração com bibliotecas populares
- etc.
A lista pode ser expandida conforme desejado. E é importante criar não apenas a própria IDE, mas também uma infraestrutura específica, como sincronização em nuvem, ferramentas de linha de comando, serviço de monitoramento online, etc. Afinal, as tendências dos últimos anos nos impõem não apenas um poderoso funcionalidade do aplicativo, mas também uma interface agradável.
Para quem é essa ferramenta? Obviamente, todos aqueles que estão de alguma forma envolvidos no desenvolvimento e teste de APIs — desenvolvedores e testadores =). E se para os primeiros muitas vezes é suficiente executar solicitações isoladas e cenários simples, para os testadores isso é uma das principais ferramentas, que deve incluir um poderoso mecanismo para escrever testes com a possibilidade de execução em CI.
Assim, seguindo essas diretrizes, começamos a criar nosso produto. Vamos ver o que conseguimos até este momento.
Início Rápido
Vamos começar com um primeiro contato com o aplicativo. Você pode baixá-lo . Neste momento, todas as 3 principais plataformas são suportadas — Windows, Linux, MacOS. Baixamos, instalamos, iniciamos. Na primeira execução, você poderá visualizar a seguinte janela:

Clique no sinal de mais na parte superior da área de conteúdo para criar sua primeira solicitação. A aba de solicitações se parece com o seguinte modo:

Vamos nos aprofundar um pouco mais. A interface de requisição é muito semelhante à interface de clientes REST populares, o que facilita a migração a partir de ferramentas desse tipo. Vamos executar a primeira requisição para o URL

Em geral, à primeira vista, o painel de resposta também não traz grandes surpresas. No entanto, quero chamar sua atenção para alguns pontos:
- O corpo da resposta apresenta-se em forma de árvore, o que, por um lado, adiciona informações e, por outro, permite adicionar algumas funcionalidades interessantes que discutiremos a seguir
- Há uma aba de Assertions, onde é exibida uma lista de testes para essa requisição
Como podemos notar, nossa ferramenta pode ser usada como um cliente REST prático. No entanto, não estaríamos aqui se suas capacidades se limitassem apenas ao envio de requisições. A seguir, apresentarei os principais conceitos e funcionalidades do TestMace.
Principais conceitos e funcionalidades
Nó
A funcionalidade do TestMace está dividida em diferentes tipos de nós. No exemplo acima, demonstramos o funcionamento do nó RequestStep. Entretanto, atualmente o aplicativo também oferece os seguintes tipos de nós:
- RequestStep. Este é um nó que permite criar uma requisição. Como elemento filho, ele pode ter apenas um nó Assertion.
- Assertion. O nó é usado para escrever testes. Pode ser um nó filho apenas do nó RequestStep.
- Folder. Permite agrupar nós Folder e RequestStep dentro dele.
- Project. Este é o nó raiz, criado automaticamente ao criar um projeto. De resto, repete as funcionalidades do nó Folder.
- Link. Um link para um nó Folder ou RequestStep. Permite reutilizar requisições e cenários.
- etc.
Os nós estão localizados em scratches (painel à esquerda na parte inferior, serve para criar rapidamente requisições "descartáveis") e em project (painel à esquerda na parte superior), onde iremos nos aprofundar.
Projeto
Ao iniciar o aplicativo, você pode ter notado uma linha solitária chamada Project no canto superior esquerdo. Este é a raiz da árvore do projeto. Ao iniciar um projeto, um projeto temporário é criado, e o caminho até ele depende do seu sistema operacional. A qualquer momento, você pode mover o projeto para um local que seja mais conveniente para você.
A principal finalidade do projeto é a capacidade de salvar o trabalho no sistema de arquivos e sincronizá-lo posteriormente por meio de sistemas de controle de versão, execução de cenários em CI, revisão de alterações, etc.
Variáveis
Variáveis são um dos mecanismos fundamentais do aplicativo. Aqueles de vocês que trabalham com ferramentas como o TestMace provavelmente já entenderam do que se trata. Então, variáveis são uma forma de armazenar dados comuns e comunicação entre os nós. Um exemplo são as variáveis de ambiente no Postman ou Insomnia. No entanto, nós fomos além e desenvolvemos o assunto. No TestMace, as variáveis podem ser definidas no nível de qualquer nó. Além disso, existe um mecanismo de herança de variáveis de ancestrais e sobreposição de variáveis em descendentes. Além disso, existem uma série de variáveis integradas, cujos nomes começam com $. Aqui estão algumas delas:
$prevStep— referência às variáveis do nó anterior$nextStep— referência às variáveis do próximo nó$parent— o mesmo que acima, mas para o antecessor$response— resposta do servidor$env— variáveis de ambiente atuais$dynamicVar— variáveis dinâmicas criadas durante a execução do script ou requisição
$env — são essencialmente variáveis comuns no nível do nó do Projeto, no entanto, o conjunto de variáveis de ambiente mudam dependendo do ambiente escolhido.
O acesso à variável é feito através de ${variable_name}
Como valor de uma variável, pode haver outra variável ou até mesmo uma expressão inteira. Por exemplo, como variável de url, pode haver uma expressão do tipo
http://${host}:${port}/${endpoint}.
Vale ressaltar a possibilidade de atribuir variáveis durante a execução do script. Por exemplo, muitas vezes há a necessidade de armazenar dados de autenticação (token ou todo o cabeçalho) que vieram do servidor após um login bem-sucedido. O TestMace permite armazenar esses dados em variáveis dinâmicas de um dos ancestrais. Para evitar colisões com já existentes variáveis 'estáticas', as variáveis dinâmicas foram isoladas em um objeto separado $dynamicVar.
Cenários
Utilizando todas as funcionalidades mencionadas acima, você pode executar cenários completos de requisições. Por exemplo, criação de entidade -> requisição de entidade -> exclusão de entidade. Neste caso, você pode usar um nó Folder para agrupar vários nós RequestStep.
Autocompletar e realçar o valor da expressão
Para um trabalho conveniente com variáveis (e não só), é necessário o autocomplemento. E, claro, a realce dos valores das expressões, para que seja mais fácil e conveniente verificar a que determinada variável equivale. Aqui, como se diz, é melhor ver uma vez do que ouvir cem vezes:

Vale ressaltar que o autocomplemento não é implementado apenas para variáveis, mas também, por exemplo, para cabeçalhos, valores de determinados cabeçalhos (como o autocomplemento para o cabeçalho Content-Type), protocolos e muito mais. A lista está em constante expansão conforme o aplicativo cresce.
Desfazer/refazer
Desfazer/refazer alterações é algo muito conveniente, porém, por algum motivo, não é implementado em muitos lugares (e as ferramentas para trabalhar com API não são uma exceção). Mas não estamos entre esses!) O desfazer/refazer está implementado em todo o projeto, permitindo cancelar não apenas a edição de um determinado nó, mas também sua criação, exclusão, movimentação, etc. As operações mais críticas exigem confirmação.
Criação de testes
O nó de Assertion é responsável pela criação de testes. Uma das principais características é a possibilidade de criar testes sem programação, utilizando editores embutidos.
O nó de Assertion consiste em um conjunto de afirmações (assertions). Cada assertion tem seu tipo, atualmente existem vários tipos de assertions.
Comparar valores — simplesmente compara 2 valores. Existem vários operadores de comparação: "igual", "diferente", "maior que", "maior ou igual a", "menor que", "menor ou igual a".
Contém valor — verifica a inclusão de uma substring em uma string.
XPath — verifica se um determinado valor está presente no XML segundo o seletor.
Assertion JavaScript — script arbitrário em JavaScript que retorna true em caso de sucesso e false em caso de falha.
Note que apenas o último requer habilidades de programação do usuário, os outros 3 assertions são criados através de uma interface gráfica. Veja, por exemplo, como é o diálogo de criação do assertion de comparar valores:

A cereja do bolo é a criação rápida de assertions a partir da resposta, veja como é fácil!

No entanto, essas assertions possuem limitações óbvias, e, ao deparar-se com elas, você pode utilizar o assertion JavaScript. Aqui, o TestMace também oferece um ambiente confortável com autocomplemento, destaque de sintaxe e até um analisador estático.
Descrição da API
O TestMace permite não só o uso da API, mas também a sua documentação. A descrição possui uma estrutura hierárquica e se integra organicamente ao restante do projeto. Além disso, atualmente há a possibilidade de importar a descrição da API nos formatos Swagger 2.0 / OpenAPI 3.0. A descrição não é apenas um peso morto, mas se integra intimamente com o restante do projeto, particularmente com o recurso de autocompletar URLs, cabeçalhos HTTP, parâmetros de consulta e mais; no futuro, planejamos adicionar testes para verificar se as respostas correspondem à descrição da API.
Compartilhamento de nós
Exemplo: você gostaria de compartilhar uma requisição problemática ou mesmo um cenário completo com um colega ou simplesmente anexá-la a um bug. O TestMace cobre esse caso: o aplicativo permite serializar qualquer nó e até mesmo uma subárvore em uma URL. Um simples copiar e colar e você já transferiu a requisição para outra máquina ou projeto com facilidade.
Formato legível por humanos para armazenamento de projeto
Atualmente, cada nó é armazenado em um arquivo separado com a extensão yml (como no caso do nó de Assertion), ou em uma pasta com o nome do nó e um arquivo index.yml dentro dela.
Veja como por exemplo o arquivo de requisição que fizemos na revisão acima:
index.yml
children: []
variables: {}
type: RequestStep
assignVariables: []
requestData:
request:
method: GET
url: 'https://next.json-generator.com/api/json/get/NJv-NT-U8'
headers: []
disabledInheritedHeaders: []
params: []
body:
type: Json
jsonBody: ''
xmlBody: ''
textBody: ''
formData: []
file: ''
formURLEncoded: []
strictSSL: Inherit
authData:
type: inherit
name: Scratch 1Como você pode ver, tudo é bastante claro. Se desejado, esse formato pode ser editado manualmente de maneira bastante confortável.
A hierarquia de pastas no sistema de arquivos repete completamente a hierarquia dos nós no projeto. Por exemplo, um cenário como:

Mapeia-se no sistema de arquivos para a seguinte estrutura (apenas a hierarquia de pastas é mostrada, mas a essência é clara)

O que facilita o processo de revisão do projeto.
Importação do Postman
Depois de ler tudo o que foi exposto, alguns usuários podem querer experimentar (não é mesmo?) o novo produto ou (quem sabe!) utilizá-lo amplamente em seu projeto. No entanto, a migração pode ser impedida por uma grande quantidade de trabalho já realizada no mesmo Postman. Para esses casos, o TestMace suporta a importação de coleções do Postman. Atualmente, a importação sem testes é suportada, mas no futuro não excluímos a possibilidade de também suportá-los.
Planos
Espero que muitos dos que chegaram até aqui tenham gostado do nosso produto. Mas isso ainda não é tudo! O trabalho no produto está a todo vapor e aqui estão algumas funcionalidades que planejamos adicionar em breve.
Sincronização em nuvem
Uma das funcionalidades mais solicitadas. No momento, oferecemos como sincronização o uso de sistemas de controle de versão, para os quais estamos tornando o formato mais amigável para esse tipo de armazenamento. No entanto, nem todos acham esse fluxo de trabalho adequado, portanto, está planejado adicionar um mecanismo de sincronização mais familiar para muitos através de nossos servidores.
CLI
Como mencionado acima, produtos de nível IDE não ficam sem várias integrações com aplicativos ou fluxos de trabalho já existentes. A CLI é precisamente necessária para integrar testes escritos no TestMace ao processo de integração contínua. O trabalho na CLI está a todo vapor, nas versões iniciais haverá o lançamento do projeto com um simples relatório no console. No futuro, planejamos adicionar a saída do relatório no formato JUnit.
Sistema de plugins
Apesar de toda a potência da nossa ferramenta, o conjunto de casos que requerem solução é infinito. Afinal, existem tarefas específicas para projetos concretos. É por isso que, no futuro, planejamos adicionar um SDK para desenvolvimento de plugins, permitindo que cada desenvolvedor acrescente funcionalidades conforme desejado.
Ampliação da variedade de tipos de nós
Este conjunto de nós não cobre todos os casos necessários para o usuário. Nós que estão planejados para serem adicionados:
- Nó Script — transforma e coloca dados, utilizando js e a API correspondente. Usando esse tipo de nó, podem ser feitas coisas como scripts de pre-request e post-request no Postman.
- Nó GraphQL — suporte a graphql
- Nó de asserção personalizada — permitirá expandir o conjunto de asserções existentes no projeto
Naturalmente, esta não é uma lista final, ela continuará a ser constantemente ampliada, inclusive com seu feedback.
FAQ
O que diferencia você do Postman?
- Conceito de nós que permite escalar praticamente infinitamente a funcionalidade do projeto
- Formato legível de projeto com armazenamento no sistema de arquivos, facilitando o trabalho com sistemas de controle de versão
- Capacidade de criar testes sem programação e suporte mais avançado a js no editor de testes (completar automaticamente, analisador estático)
- Autocompletação avançada e destaque do valor atual das variáveis
Este é um produto de código aberto?
Não, no momento o código-fonte está fechado, mas no futuro consideramos a possibilidade de abrir os fontes
De onde vem a sua fonte de renda?)
Além da versão gratuita, planejamos lançar uma versão paga do produto. Ela incluirá, em primeiro lugar, recursos que exigem uma parte do servidor, como a sincronização.
Conclusão
Nosso projeto avança a passos largos em direção a um lançamento estável. No entanto, o produto já pode ser utilizado, e os feedbacks positivos de nossos primeiros usuários comprovam isso. Estamos coletando ativamente as opiniões, pois sem a colaboração próxima com a comunidade, não é possível construir uma boa ferramenta. Você pode nos encontrar aqui:
Estamos ansiosos por seus desejos e sugestões!
Fonte: habr.com
