<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Rafael Berçam</title>
    <description>The latest articles on Forem by Rafael Berçam (@rafaelbercam).</description>
    <link>https://forem.com/rafaelbercam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F482855%2F4ab705ce-ce1a-41f3-b16e-e1066999609a.png</url>
      <title>Forem: Rafael Berçam</title>
      <link>https://forem.com/rafaelbercam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rafaelbercam"/>
    <language>en</language>
    <item>
      <title>Mudando o Jogo com StackSpot AI &amp; Testes Automatizados</title>
      <dc:creator>Rafael Berçam</dc:creator>
      <pubDate>Wed, 30 Apr 2025 17:49:58 +0000</pubDate>
      <link>https://forem.com/rafaelbercam/mudando-o-jogo-com-stackspot-ai-testes-automatizados-155a</link>
      <guid>https://forem.com/rafaelbercam/mudando-o-jogo-com-stackspot-ai-testes-automatizados-155a</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Desenvolver software atualmente é uma tarefa cada vez mais desafiadora: as aplicações estão mais complexas e a pressão por entregas rápidas (e sem bugs!) só aumenta. É nesse cenário que entra a &lt;strong&gt;StackSpot&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A StackSpot funciona como um “hub” central onde você e seu time podem organizar, padronizar e compartilhar tudo o que precisam para criar aplicações modernas: desde componentes de código até automações e boas práticas. Ele acelera o desenvolvimento e garante qualidade do início ao fim — da primeira linha de código até o deploy em produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é hipercontextualização?
&lt;/h2&gt;

&lt;p&gt;Um dos grandes diferenciais da StackSpot (especialmente da StackSpot AI) é a &lt;strong&gt;hipercontextualização&lt;/strong&gt;. Mas o que isso significa na prática? Basicamente, a plataforma entende o contexto do seu projeto, do seu código e até das necessidades do seu time. Ou seja, ao usar a StackSpot AI para revisar um código, por exemplo, ele não traz apenas dicas genéricas. Ele considera o padrão do seu time, as tecnologias utilizadas e até as regras de negócio do seu projeto.&lt;/p&gt;

&lt;p&gt;Assim, as sugestões e automações realmente fazem sentido para o seu cenário — nada de dicas fora de contexto! Isso torna o trabalho mais rápido, eficiente e com muito mais qualidade.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Dica]&lt;br&gt;
Vamos ver na prática como a StackSpot AI pode ajudar a elevar o nível do seu código? 🚀&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Desafios de Qualidade de Software em Times de Alta Performance
&lt;/h1&gt;

&lt;p&gt;Manter a qualidade de software em times grandes (ou mesmo em squads menores) é um grande desafio. Não basta apenas escrever código que funciona: é preciso garantir que todos sigam os mesmos padrões, que os testes automatizados cubram o que realmente importa e que o time evolua junto, sem tropeçar em bugs ou retrabalho.&lt;/p&gt;

&lt;h2&gt;
  
  
  Silo de Conhecimento: O Inimigo Invisível
&lt;/h2&gt;

&lt;p&gt;Um dos maiores vilões é o &lt;strong&gt;silo de conhecimento&lt;/strong&gt;. Sabe quando só uma ou duas pessoas do time sabem como funciona aquele teste automatizado mais complexo ou como rodar uma automação específica? Se essas pessoas saem de férias (ou mudam de empresa), o restante do time fica perdido. Isso trava a evolução e aumenta o risco de bugs passarem despercebidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack Diferente? Nem pensar!
&lt;/h2&gt;

&lt;p&gt;Outro ponto: cada dev querer usar uma stack diferente pode até parecer interessante no início, mas rapidamente se torna um pesadelo. Imagine manter um projeto onde cada um usa uma linguagem, framework ou padrão de teste diferente. Fica impossível padronizar, automatizar e até mesmo dar manutenção. Por isso, alinhar a stack de desenvolvimento é fundamental para garantir qualidade e performance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Nota]&lt;br&gt;
Essa padronização pode ser polêmica, mas a experiência reforça meu ponto de vista. Se você pensa diferente, deixe um comentário para debatermos!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Rotatividade e Falta de Capacitação
&lt;/h2&gt;

&lt;p&gt;A rotatividade de profissionais e a falta de capacitação específica acabam prejudicando automações importantes. Quando o time muda muito, ou quando não há treinamentos adequados, as automações legadas ficam sem manutenção. O resultado? Testes quebrados, pipelines travados e mais bugs em produção.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Informação]&lt;br&gt;
Manter a qualidade de software é um trabalho de equipe — e depende de processos, ferramentas e, principalmente, colaboração e compartilhamento de conhecimento.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Como a StackSpot AI Pode Ajudar a Superar Esses Desafios
&lt;/h1&gt;

&lt;p&gt;Diante desses obstáculos — silos de conhecimento, falta de padronização, rotatividade e automações legadas — fica claro que processos manuais não são suficientes. É aí que entra a &lt;strong&gt;StackSpot AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A plataforma foi criada para &lt;strong&gt;quebrar barreiras de conhecimento&lt;/strong&gt;, &lt;strong&gt;padronizar práticas&lt;/strong&gt; e &lt;strong&gt;automatizar tarefas repetitivas&lt;/strong&gt;. Com recursos de IA, a StackSpot AI analisa o contexto do seu projeto, sugere melhorias de código, identifica falhas em testes automatizados e até gera documentação técnica de forma consistente.&lt;/p&gt;

&lt;p&gt;Além disso, ao centralizar o conhecimento e as melhores práticas em um único lugar, a StackSpot AI facilita o onboarding de novos membros e reduz o impacto da rotatividade. Ou seja, mesmo que o time mude, a qualidade e a continuidade das automações permanecem garantidas.&lt;/p&gt;

&lt;p&gt;Nos próximos tópicos, mostrarei na prática como a StackSpot AI pode transformar o dia a dia do seu time de qualidade — tornando os processos mais ágeis, seguros e colaborativos.&lt;/p&gt;




&lt;h1&gt;
  
  
  Como Criar uma Conta Gratuita na StackSpot AI (Trial)
&lt;/h1&gt;

&lt;p&gt;Se você quer experimentar a StackSpot AI sem custo, siga os passos abaixo para criar sua conta Trial rapidamente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acesse o portal da StackSpot AI:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://ai.stackspot.com/" rel="noopener noreferrer"&gt;https://ai.stackspot.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clique em "Sign in"&lt;/strong&gt; para iniciar o processo de login.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Escolha uma das opções de autenticação:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Microsoft&lt;/li&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy39p02e0un9bzbvalyhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy39p02e0un9bzbvalyhi.png" alt="Tela de autenticação da StackSpot AI" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autorize o acesso&lt;/strong&gt; da StackSpot AI à sua conta escolhida.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pronto! Sua conta Trial será criada automaticamente e você já pode começar a usar a StackSpot AI.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Durante o período de Trial, você terá acesso aos principais recursos da plataforma para testar e avaliar como a StackSpot AI pode ajudar seu time de qualidade.&lt;/p&gt;




&lt;h1&gt;
  
  
  Explorando a Home da StackSpot AI: Seu Ponto de Partida
&lt;/h1&gt;

&lt;p&gt;Assim que você cria sua conta e acessa a &lt;a href="https://ai.stackspot.com/" rel="noopener noreferrer"&gt;StackSpot AI Portal&lt;/a&gt;, você já cai direto na página inicial da plataforma. O destaque é o &lt;strong&gt;chat genérico&lt;/strong&gt; — seu assistente central, pronto para ajudar com dúvidas, sugestões de código, revisões, automações de tarefas e muito mais.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo47by45ftt7l99abf7aj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo47by45ftt7l99abf7aj.gif" alt="Gif mostrando o chat na página inicial da StackSpot AI" width="760" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse chat é só o começo! O StackSpot AI oferece vários recursos avançados para tornar sua experiência ainda mais produtiva. Os principais atributos são:&lt;/p&gt;




&lt;h2&gt;
  
  
  Principais Atributos da StackSpot AI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Knowledge Source
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que é:&lt;/strong&gt; Fontes de conhecimento que você pode adicionar ao StackSpot AI, como snippets de código, APIs, documentos técnicos, padrões internos, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Para que serve:&lt;/strong&gt; Permite que a IA gere respostas e códigos hipercontextualizados, seguindo exatamente o que seu projeto ou empresa precisa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Quick Command
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que é:&lt;/strong&gt; Comandos rápidos para automatizar tarefas comuns, como gerar código, rodar testes, fazer deploy e muito mais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Para que serve:&lt;/strong&gt; Economiza tempo, agiliza processos repetitivos e garante que tudo siga o padrão do time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Agents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O que é:&lt;/strong&gt; Assistentes especializados para diferentes etapas do desenvolvimento, como revisão de código, geração de user stories, identificação de vulnerabilidades, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Para que serve:&lt;/strong&gt; Trazem inteligência e automação para processos específicos, elevando a qualidade e a segurança do software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses recursos podem ser acessados tanto pelo portal web quanto pelas extensões da StackSpot AI para IDEs, integrando-se facilmente ao seu fluxo de trabalho.&lt;/p&gt;




&lt;h1&gt;
  
  
  Criando Knowledge Sources: Hipercontextualizando sua API
&lt;/h1&gt;

&lt;p&gt;Na StackSpot AI, as &lt;strong&gt;Knowledge Sources&lt;/strong&gt; são a base para respostas inteligentes e alinhadas ao seu contexto. Você pode adicionar documentos técnicos, snippets, padrões internos e, claro, contratos de API no formato OpenAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que usar OpenAPI como Knowledge Source?
&lt;/h2&gt;

&lt;p&gt;Ao adicionar o documento OpenAPI da sua API como fonte de conhecimento, a StackSpot AI passa a entender todos os endpoints, parâmetros, respostas e regras do seu serviço. Assim, qualquer dúvida ou geração de código será hipercontextualizada, seguindo exatamente o contrato da sua API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como usar a API do Serverest como Knowledge Source na StackSpot AI
&lt;/h2&gt;

&lt;p&gt;Se você quer turbinar a StackSpot AI com o contrato da &lt;a href="https://serverest.dev/" rel="noopener noreferrer"&gt;API do Serverest&lt;/a&gt;, siga este passo a passo. Assim, a IA entenderá todos os endpoints, parâmetros e respostas da API, facilitando a geração de exemplos de código ou esclarecimento de dúvidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Baixe o arquivo Swagger da API
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Acesse: &lt;a href="https://raw.githubusercontent.com/ServeRest/ServeRest/trunk/docs/swagger.json" rel="noopener noreferrer"&gt;swagger.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Salve o arquivo &lt;code&gt;swagger.json&lt;/code&gt; no seu computador.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Crie uma Knowledge Source na StackSpot AI
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Entre no portal: &lt;a href="https://ai.stackspot.com/" rel="noopener noreferrer"&gt;https://ai.stackspot.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Faça login com sua conta (GitHub, Microsoft ou Google).&lt;/li&gt;
&lt;li&gt;No menu, vá em &lt;strong&gt;Criar Knowledge Sources&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Selecione o tipo &lt;strong&gt;API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Dê um nome, por exemplo: &lt;code&gt;API Serverest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Salve.&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;Add file&lt;/strong&gt;, escolha a opção &lt;strong&gt;Documento&lt;/strong&gt; e faça upload do &lt;code&gt;swagger.json&lt;/code&gt; que você baixou.&lt;/li&gt;
&lt;li&gt;Após o upload, a mágica acontece!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhsifbnshf99c3utqiiq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frhsifbnshf99c3utqiiq.png" alt="Upload do Swagger na StackSpot AI" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pronto! Agora a IA entende a API
&lt;/h3&gt;

&lt;p&gt;No chat, selecione a Knowledge Source criada para que a IA utilize o contrato da API nas respostas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmerjfasmaop1slkkky45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmerjfasmaop1slkkky45.png" alt="Selecionando a Knowledge Source no chat" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com a KS criada, a StackSpot AI já consegue responder perguntas e gerar exemplos de código usando o contrato da API. Por exemplo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pergunta:&lt;/strong&gt; Como faço para cadastrar um novo usuário na API Serverest?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1oagm6fv5ikwwlpql8m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1oagm6fv5ikwwlpql8m.gif" alt="Exemplo de uso da API no chat" width="720" height="417"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Resposta
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Para cadastrar um novo usuário na API ServeRest, faça uma requisição HTTP POST para o endpoint `/usuarios` com um JSON contendo os dados do usuário. Exemplo:

Endpoint:

POST /usuarios
Content-Type: application/json

Corpo da requisição:

{
  "nome": "Fulano da Silva",
  "email": "fulano@qa.com",
  "password": "teste",
  "administrador": "true"
}

Exemplo usando curl:

curl -X POST http://localhost:3000/usuarios \
  -H "Content-Type: application/json" \
  -d '{
    "nome": "Fulano da Silva",
    "email": "fulano@qa.com",
    "password": "teste",
    "administrador": "true"
  }'

Resposta esperada (201):

{
  "message": "Cadastro realizado com sucesso",
  "_id": "jogfODIlXsqxNFS2"
}

O campo `administrador` aceita "true" ou "false" (string). Não é permitido cadastrar usuário com email já utilizado.

Se precisar de exemplos em outra linguagem, me avise!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;E sim, além de mostrar como cadastrar um novo usuário, a IA traz regras implícitas na documentação e exemplos de respostas do Swagger.&lt;/p&gt;

&lt;p&gt;Já entendeu o potencial disso?&lt;/p&gt;




&lt;h1&gt;
  
  
  Como Criar um Agent de QA na StackSpot AI para Gerar Testes Automatizados e Cenários Gherkin
&lt;/h1&gt;

&lt;p&gt;Veja o passo a passo para criar um Agent de QA que gera testes automatizados e cenários de teste em Gherkin (BDD) em português, usando a StackSpot AI:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Crie o Agent de QA
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o &lt;a href="https://ai.stackspot.com/login" rel="noopener noreferrer"&gt;Portal da StackSpot AI&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;No menu lateral, clique em &lt;strong&gt;Contents &amp;gt; Agents&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;Create Agents&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Configure o Agent
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agent name:&lt;/strong&gt; &lt;code&gt;QA Test Generator&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você é um especialista em qualidade de software e BDD. Gere testes automatizados (unitários ou de integração) para os endpoints da API, seguindo o contrato OpenAPI e as melhores práticas de QA. Além disso, gere cenários de teste em Gherkin (Português), utilizando a estrutura Dado, Quando, Então. Considere exemplos de payloads, cenários de sucesso e falha, e utilize frameworks populares como pytest, jest ou outros conforme a linguagem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suggested Prompts:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gere um teste automatizado para o endpoint de cadastro de usuário.&lt;/li&gt;
&lt;li&gt;Quais cenários negativos devo testar no endpoint de login?&lt;/li&gt;
&lt;li&gt;Gere cenários de teste Gherkin para o endpoint POST /usuarios.&lt;/li&gt;
&lt;li&gt;Crie um cenário Gherkin para o endpoint GET /produtos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conversational mode:&lt;/strong&gt; Ative para permitir interações contínuas.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Adicione Knowledge Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Selecione o Swagger da sua API (já cadastrado como Knowledge Source).&lt;/li&gt;
&lt;li&gt;Adicione também documentos internos de padrões de testes, exemplos de código ou guidelines de QA, se houver.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Salve e Teste o Agent
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Clique em &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use a seção &lt;strong&gt;Try&lt;/strong&gt; para testar prompts, por exemplo:
&amp;gt; Gere cenários de teste em Gherkin para o endpoint POST /usuarios da API Serverest, cobrindo casos de sucesso e erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9wvr0gnc5w36e2xygml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh9wvr0gnc5w36e2xygml.png" alt="Testando o Agent de QA" width="800" height="470"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Exemplo de Uso
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Crie um cenário Gherkin para o endpoint GET /produtos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Resposta esperada do Agent:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Funcionalidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Listar produtos cadastrados

  &lt;span class="kn"&gt;Contexto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;Dado &lt;/span&gt;que existem produtos cadastrados no sistema

  &lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Buscar todos os produtos com sucesso
    &lt;span class="nf"&gt;Quando &lt;/span&gt;o cliente realiza uma requisição GET para &lt;span class="s"&gt;"/produtos"&lt;/span&gt;
    &lt;span class="nf"&gt;Então &lt;/span&gt;a resposta deve ter o status 200
    &lt;span class="nf"&gt;E &lt;/span&gt;o corpo da resposta deve conter uma lista de produtos
    &lt;span class="nf"&gt;E &lt;/span&gt;a propriedade &lt;span class="s"&gt;"quantidade"&lt;/span&gt; deve indicar o número de produtos cadastrados

  &lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Buscar produtos com filtro de nome
    &lt;span class="nf"&gt;Dado &lt;/span&gt;que existe um produto cadastrado com nome &lt;span class="s"&gt;"Logitech MX Vertical"&lt;/span&gt;
    &lt;span class="nf"&gt;Quando &lt;/span&gt;o cliente realiza uma requisição GET para &lt;span class="s"&gt;"/produtos?nome=Logitech MX Vertical"&lt;/span&gt;
    &lt;span class="nf"&gt;Então &lt;/span&gt;a resposta deve ter o status 200
    &lt;span class="nf"&gt;E &lt;/span&gt;o corpo da resposta deve conter apenas os produtos com nome &lt;span class="s"&gt;"Logitech MX Vertical"&lt;/span&gt;

  &lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Buscar produtos quando não há produtos cadastrados
    &lt;span class="nf"&gt;Dado &lt;/span&gt;que não existem produtos cadastrados no sistema
    &lt;span class="nf"&gt;Quando &lt;/span&gt;o cliente realiza uma requisição GET para &lt;span class="s"&gt;"/produtos"&lt;/span&gt;
    &lt;span class="nf"&gt;Então &lt;/span&gt;a resposta deve ter o status 200
    &lt;span class="nf"&gt;E &lt;/span&gt;o corpo da resposta deve conter uma lista vazia de produtos
    &lt;span class="nf"&gt;E &lt;/span&gt;a propriedade &lt;span class="s"&gt;"quantidade"&lt;/span&gt; deve ser igual a 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn1slyjdqllaplgj727t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn1slyjdqllaplgj727t.gif" alt="Exemplo de resposta do Agent" width="720" height="417"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Resumo do Agent
&lt;/h3&gt;

&lt;p&gt;Ao configurar um prompt eficiente e integrá-lo a uma base de conhecimento hipercontextualizada — exclusiva da sua empresa — você transforma o Agent em um verdadeiro parceiro de trabalho. Essa abordagem potencializa a geração rápida e precisa de scripts automatizados, otimizando tarefas repetitivas e especializadas que, tradicionalmente, demandariam horas de trabalho manual. O resultado é um ganho significativo de produtividade e padronização nos processos de qualidade.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Dica]&lt;br&gt;
É possível usar uma, duas ou várias Knowledge Sources dentro de um Agent, e preparar até 4 prompts de sugestão de uso.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Quick Commands: Automatize Tarefas e Ganhe Tempo na Sua IDE
&lt;/h1&gt;

&lt;p&gt;Os &lt;strong&gt;Quick Commands&lt;/strong&gt; da StackSpot AI são atalhos inteligentes que ajudam a automatizar tarefas repetitivas direto na sua IDE, seja no IntelliJ ou no Visual Studio Code. Precisa gerar testes, documentar código, refatorar um trecho ou rodar um comando customizado? Com os Quick Commands, dá para fazer tudo isso rapidamente, sem sair do editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Criar um Quick Command
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acesse o Portal da StackSpot AI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No menu lateral, vá em &lt;strong&gt;Contents &amp;gt; Quick Command&lt;/strong&gt; e clique em &lt;strong&gt;Create Custom Quick Command&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escolha o tipo de comando&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Selecione a opção &lt;strong&gt;IDE&lt;/strong&gt; para criar comandos que rodarão direto na sua IDE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure o comando&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Dê um nome, slug, descrição e defina o prompt que será executado. É possível usar variáveis como &lt;code&gt;{{ selected_code }}&lt;/code&gt; para trabalhar com o código selecionado.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fitpvy2jt0lwdrdaaenn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fitpvy2jt0lwdrdaaenn4.png" alt="Criando um novo QuickCommand" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmgklqskyrd3ub5yttox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmgklqskyrd3ub5yttox.png" alt="Selecionando modelo em branco" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7bgmh38vcue9ij9nfm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7bgmh38vcue9ij9nfm5.png" alt="Tela de criação de prompts e requests" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Componentes do Quick Command
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prompts
&lt;/h3&gt;

&lt;p&gt;Instruções em linguagem natural enviadas para a StackSpot AI. Permitem automatizar tarefas como gerar código, documentar, traduzir ou sugerir melhorias. Podem utilizar variáveis como &lt;code&gt;{{ selected_code }}&lt;/code&gt; e inputs personalizados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Requests
&lt;/h3&gt;

&lt;p&gt;Permitem integrar o Quick Command com APIs externas. Você define o método HTTP, a URL (com variáveis Jinja), headers e o corpo da requisição. O resultado pode ser manipulado e apresentado ao usuário ou inserido no código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inputs
&lt;/h3&gt;

&lt;p&gt;Perguntas feitas ao usuário antes da execução do comando. Podem ser obrigatórios ou opcionais, e seus valores podem ser usados em Prompts e Web Requests através de variáveis (ex: &lt;code&gt;{{ nome_do_input }}&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Criando um Prompt para o Quick Command
&lt;/h2&gt;

&lt;p&gt;Ao criar um Quick Command, um dos principais componentes é o Prompt, que permite, por meio de linguagem natural, criar instruções para serem realizadas.&lt;/p&gt;

&lt;p&gt;No exemplo a seguir, solicitei que o código selecionado pelo usuário (uma feature escrita em Gherkin) seja convertido em steps implementados de acordo com o projeto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[Nota]&lt;br&gt;
O projeto está indexado pelo Plugin da StackSpot e funcionando como uma Knowledge Source da AI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ivg0ewexy7b62kvao0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4ivg0ewexy7b62kvao0.png" alt="Criando prompt para QuickCommand" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No prompt, utilizei o slug &lt;code&gt;{create-behave-steps}&lt;/code&gt; e a seguinte descrição:&lt;/p&gt;

&lt;p&gt;Ao receber a feature&lt;/p&gt;

&lt;p&gt;{{selected_code}} &lt;/p&gt;

&lt;p&gt;Você deve gerar os steps da lib behave para implementação, seguindo os melhores padrões do mercado.&lt;br&gt;
Apenas gere os steps e não precisa escrever nada anteriormente ou explicações.&lt;/p&gt;

&lt;p&gt;O trecho &lt;code&gt;{{selected_code}}&lt;/code&gt; corresponde ao código selecionado pelo usuário na IDE (exemplo: VS Code).&lt;/p&gt;

&lt;p&gt;Com a flag &lt;code&gt;Usar Projeto Indexado&lt;/code&gt; habilitada, a saída será hipercontextualizada.&lt;/p&gt;

&lt;p&gt;Vamos testar?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Neste GIF, acionei meu QuickCommand através de uma &lt;code&gt;/&lt;/code&gt; e selecionei para rodar o comando com a feature selecionada na IDE.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzaecocy8lmcswn06sukn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzaecocy8lmcswn06sukn.gif" alt="Executando QuickCommand na IDE" width="720" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Em seguida, os steps são gerados de forma hipercontextualizada, pois estou usando minha KS (Knowledge Source) e meu projeto indexado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1r7mof4jycsefa7q67.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1r7mof4jycsefa7q67.gif" alt="Steps gerados automaticamente" width="720" height="295"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;A adoção da &lt;strong&gt;StackSpot AI&lt;/strong&gt; transformou radicalmente minha rotina de trabalho. O uso combinado de &lt;strong&gt;Agents&lt;/strong&gt;, &lt;strong&gt;Knowledge Sources&lt;/strong&gt; e &lt;strong&gt;Quick Commands&lt;/strong&gt; elevou minha produtividade a um novo patamar, permitindo enfrentar desafios de alta complexidade com muito mais agilidade e precisão.&lt;/p&gt;

&lt;p&gt;Com os &lt;strong&gt;Agents&lt;/strong&gt;, automatizo tarefas especializadas e garanto respostas contextualizadas para problemas específicos do meu domínio. As &lt;strong&gt;Knowledge Sources&lt;/strong&gt; centralizam e padronizam o conhecimento do time, tornando a resolução de dúvidas e a implementação de boas práticas algo natural e acessível. Já os &lt;strong&gt;Quick Commands&lt;/strong&gt; agilizam tarefas repetitivas, como geração de código e testes, liberando tempo para focar em atividades estratégicas.&lt;/p&gt;

&lt;p&gt;O resultado é claro: processos mais rápidos, entregas com maior qualidade e uma automação sustentada por IA que realmente faz diferença no dia a dia. A StackSpot AI não só aumentou minha eficiência, mas também trouxe mais segurança e padronização para todo o ciclo de desenvolvimento. Estou colhendo frutos concretos dessa mudança — e recomendo fortemente para quem busca produtividade e inovação em times de tecnologia.&lt;/p&gt;




&lt;h1&gt;
  
  
  Gostou do conteúdo?
&lt;/h1&gt;

&lt;p&gt;Deixe seu feedback, comentário e reação ao post. Sua participação é fundamental para que eu continue criando conteúdos.&lt;/p&gt;

&lt;p&gt;Me siga nas redes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/rafaelbercam/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>stackspot</category>
      <category>ai</category>
      <category>automation</category>
      <category>testing</category>
    </item>
    <item>
      <title>🧪 Validando Mensagens no Kafka com Kotlin e Awaitility</title>
      <dc:creator>Rafael Berçam</dc:creator>
      <pubDate>Tue, 04 Mar 2025 16:09:25 +0000</pubDate>
      <link>https://forem.com/rafaelbercam/validando-mensagens-no-kafka-com-kotlin-e-awaitility-22hg</link>
      <guid>https://forem.com/rafaelbercam/validando-mensagens-no-kafka-com-kotlin-e-awaitility-22hg</guid>
      <description>&lt;p&gt;Fala pessoal! Neste post, vou te guiar por um exemplo prático de como testar a publicação de mensagens em um tópico Kafka usando &lt;code&gt;Kotlin&lt;/code&gt;, &lt;code&gt;Awaitility&lt;/code&gt; e o &lt;code&gt;KafkaConsumer&lt;/code&gt;. Esse tipo de validação é essencial em sistemas distribuídos para garantir que as mensagens sejam enviadas e recebidas corretamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;📚 Estrutura do Projeto&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A estrutura básica do projeto é assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── src
│   ├── main
│   │    └── kotlin
│   │         └── api
│   │              └── KafkaProducerService.kt
│   └── &lt;span class="nb"&gt;test&lt;/span&gt;
│        └── kotlin
│             └── api
│                  └── KafkaApiTest.kt
└── pom.xml &lt;span class="o"&gt;(&lt;/span&gt;ou build.gradle.kts para Kotlin&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Certifique-se de incluir as seguintes dependências no seu pom.xml (Maven) ou build.gradle.kts (Gradle):&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.kafka&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;kafka-clients&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.7.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.awaitility&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;awaitility&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.2.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.module&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-module-kotlin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.16.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🤔 O Que é o Awaitility?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;O Awaitility é uma biblioteca Java/Kotlin projetada para facilitar a espera por condições assíncronas em testes. Em vez de usar Thread.sleep() (o que é ineficiente), o Awaitility permite esperar de forma mais inteligente até que uma condição seja atendida.&lt;/p&gt;

&lt;p&gt;✅ Por que usar Awaitility com Kafka?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Os consumidores Kafka não recebem mensagens imediatamente (processamento assíncrono).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Precisamos esperar até que a mensagem seja publicada no tópico e lida pelo consumidor.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;📊 Exemplo Prático: Validando Transações Bancárias&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Vamos criar um teste que:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Publica uma mensagem de uma transação bancária em um tópico Kafka.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consome a mensagem do tópico.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Valida se o conteúdo recebido está correto.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🛠️ O Modelo de Transação&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;📬 O Teste com Kafka e Awaitility&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  &lt;strong&gt;🧐 Explicando o Teste&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Produzimos uma mensagem Kafka com &lt;code&gt;kafkaProducer.sendMessage()&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz35a3xi7zv9zt4h0ttp4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz35a3xi7zv9zt4h0ttp4.png" alt="Tela do IntelliJ com teste executado com sucesso" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Consumimos com &lt;code&gt;kafkaConsumer.poll()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usamos o &lt;code&gt;await().untilAsserted&lt;/code&gt; para esperar até a mensagem ser validada.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se a mensagem não for encontrada ou os dados estiverem incorretos, o teste falha com uma mensagem de erro clara. ✅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tjm5ccqcbpfohoc12js.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tjm5ccqcbpfohoc12js.png" alt="Tela do Docker com o tópico da transação feita pelo teste" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;📢 Conclusão&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Testar mensagens Kafka de forma assíncrona é essencial para garantir a integridade do sistema. Usando o Awaitility com KafkaConsumer, conseguimos validar mensagens de forma eficiente.&lt;/p&gt;

&lt;p&gt;Se você gostou do conteúdo ou tem dúvidas, deixe um comentário! 🚀&lt;/p&gt;

&lt;p&gt;👉 Me siga no dev.to para mais conteúdo de qualidade!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy coding! 💻&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Links Referencias e Projeto no GitHub
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.awaitility.org/" rel="noopener noreferrer"&gt;Awaitility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/async-tests-kafka-awaitility" rel="noopener noreferrer"&gt;Projeto GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>qa</category>
      <category>kafka</category>
      <category>asynctests</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>Estruturação de Testes de API</title>
      <dc:creator>Rafael Berçam</dc:creator>
      <pubDate>Tue, 12 Sep 2023 19:38:18 +0000</pubDate>
      <link>https://forem.com/rafaelbercam/estruturacao-de-testes-de-api-4efn</link>
      <guid>https://forem.com/rafaelbercam/estruturacao-de-testes-de-api-4efn</guid>
      <description>&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Então, resolvi postar esse conteúdo para trazer um ponto de vista sobre a importância de estruturar seus testes de API e como isso pode tornar seu dia a dia eficiente e organizado. &lt;/p&gt;

&lt;p&gt;Essa forma de organização é baseada em estrutura de camadas que são formas de abstrair algumas classes e responsabilidades do seu código, para torná-lo legível, de fácil manutenção e muitas boas práticas. &lt;br&gt;
Como eu sei que isso pode variar de linguagem para linguagem, framework para framework, eu vou exemplificar mostrando em diferentes contextos e uso das principais linguagens do mercado. &lt;/p&gt;

&lt;p&gt;Então bora la começar!&lt;/p&gt;
&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Testes de API são essenciais para garantir a qualidade e confiabilidade de aplicações que utilizam APIs. Eles permitem verificar se as APIs estão funcionando conforme o esperado, identificando e corrigindo bugs antes que eles cheguem as aplicações ou sistemas clientes (consumers)&lt;/p&gt;

&lt;p&gt;Uma boa estrutura para testes de API pode ajudar a tornar o processo de desenvolvimento e manutenção mais eficiente. Ela pode ajudar a organizar os testes, facilitar a identificação de problemas e tornar os testes mais repetíveis (reuso).&lt;/p&gt;

&lt;p&gt;Uma boa estrutura para testes de API deve atender aos seguintes objetivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organização: Os testes devem ser organizados de forma lógica e fácil de entender.&lt;/li&gt;
&lt;li&gt;Eficiência: O processo de execução dos testes deve ser eficiente e rápido.&lt;/li&gt;
&lt;li&gt;Repetibilidade: Os testes devem ser repetíveis, para que os resultados possam ser verificados com confiança (testes independentes).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Estrutura em camadas
&lt;/h2&gt;

&lt;p&gt;Uma estrutura de testes de API em camadas, pode te ajudar a atingir esses objetivos, pois ele divide os testes em diferentes camadas, cada uma com uma responsabilidade específica.&lt;/p&gt;

&lt;p&gt;A Arquitetura em camadas é um estilo arquitetural que dentre vários objetivos, o maior dele é organizar as responsabilidades de partes de um software, normalmente criando um isolamento e dando um propósito bem definido a cada camada de forma que a mesma possa ser reutilizável por um nível mais alto ou até substituível. O uso desse conceito é até antigo, amplamente utilizado a algum tempo, porém essa motivação de traze-lo para automação de testes foi devido a grande desorganização nas aplicações corporativas que ja trabalhei, que se perderam em meio a troca de profissionais, descontinuação de uma stack ou até mesmo a reescrita de um mesmo teste com tecnologias diferentes (Sim, existem profissionais que sabem apenas uma ferramenta, e usam a qualquer custo).&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qq-UiMBt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kv4yi5b3am5jdh0vk27d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qq-UiMBt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kv4yi5b3am5jdh0vk27d.png" alt="Arquitetura em camadas, divisão lógica" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma camada física, pode ser convertida em várias camadas lógicas para organizar e traçar responsabilidades de uma aplicação backend.&lt;/p&gt;

&lt;p&gt;Então como poderíamos trazer isso para automação dos testes de API? Para isso vamos pensar em um modelo básico, que não necessariamente será o mesmo em todos os casos, mas possuem características semelhantes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ax57KWHJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/udhyl24oo6j2abl9kciv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ax57KWHJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/udhyl24oo6j2abl9kciv.png" alt="Divisão lógica dos testes de API" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;

&lt;p&gt;Essa camada é pensada justamente na forma que estamos abstraindo a construção de objetos que usamos em nossas requisições. Um grande ponto de atenção que percebo, é que a maioria dos projetos o payload é criado dentro do teste, ou na camada que realiza a requisição. Isso cria um acoplamento desnecessário e prejudica a manutenção do código, dado que precisa alterar o código em vários pontos em sua manutenção. &lt;/p&gt;

&lt;p&gt;Então como podemos abstrair isso?&lt;/p&gt;

&lt;p&gt;Simples, basta usarmos uma classe simples que retorna um objeto de acordo com seu construtor ou método que retorna ele para sua classe. O ideal é sempre passar o payload (ou body) como parâmetro da sua requisição.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No exemplo acima é apenas uma abstração de uma classe que por sua vez possui um método &lt;code&gt;new_user_payload&lt;/code&gt; que retorna o objeto user para uma requisição do tipo POST &lt;code&gt;create_user&lt;/code&gt; então, eu deleguei para a classe &lt;code&gt;DataUser&lt;/code&gt; a responsabilidade de criar um objeto.&lt;/p&gt;

&lt;p&gt;A Princípio isso pode parecer simples, mas a manutenção do código passa a ser simplificada uma vez que a criação do objeto é concentrada em uma classe, sem a necessidade de repetir o objeto no corpo do teste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requests
&lt;/h3&gt;

&lt;p&gt;Esta camada é mais comum vê-la abstraída de forma correta, mas nem sempre é seguida uma boa prática em sua utilização.&lt;/p&gt;

&lt;p&gt;Uma vez definido que uma classe irá retornar o resultado de uma requisição &lt;code&gt;Response&lt;/code&gt; então vamos definir essa responsabilidade única para suas funções&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Repare que a classe &lt;code&gt;UserRequests&lt;/code&gt; dispõe funções que retornam o resultado das requisições, e recebe por parâmetro o payload (body) ou outros argumentos necessários, para tornar mais genérica sua chamada. Isso fará que sua classe tenha um reuso dentro dos testes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Em alguns testes e frameworks, sempre temos a necessidade de abstrair algum dado que não pode ficar &lt;a href="https://en.wikipedia.org/wiki/Hard_coding"&gt;hard coding&lt;/a&gt; na aplicação, isso tudo porque precisamos realizar alterações nesse valor para deixar nossos testes repetíveis em várias situações.&lt;/p&gt;

&lt;p&gt;A mais comum são as trocas de ambientes (de desenvolvimento para homologação para produção, etc..)&lt;/p&gt;

&lt;p&gt;Então essas classes ou configurações são responsáveis por garantir que essas informações sejam carregadas de acordo com a necessidade dos nossos testes.&lt;/p&gt;

&lt;p&gt;Um bom exemplo, é a &lt;code&gt;base_uri&lt;/code&gt; das nossas API's que podem mudar de acordo com o ambiente.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Neste exemplo eu salvei a informação da ninha url base no arquivo &lt;code&gt;.env&lt;/code&gt; que por sua vez é inicializada através da classe &lt;code&gt;SetupClass&lt;/code&gt; que retorna o valor contido na variável &lt;code&gt;BASE_URL&lt;/code&gt;. Ja nas classes responsáveis por realizar as requisições eu apenas retorno para o &lt;code&gt;ENDPOINT&lt;/code&gt; o valor dessa configuração.&lt;/p&gt;

&lt;p&gt;Devemos evitar ao máximo realizar o hard coding em nossos projetos, eles normalmente dificultam a manutenção e podemos até mesmo quebrar os testes quando não nos atentamos a estas alterações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Importante
&lt;/h3&gt;

&lt;p&gt;Essa maneira de organizar o seu código não é única e exclusiva, mas a iniciativa é exemplificar o quanto um código pode ficar organizado seguindo esse modelo. E por vezes quando mudamos de linguagem ou framework, são disponibilizadas recursos diferentes para as mesmas configurações, então o foco não deve ser em uma linguagem ou ferramenta ok?&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;A busca por deixar nossos projetos de automação cada vez mais robustos e reaproveitáveis nos leva a pensar em diferentes maneiras de organizar nosso código, quando estamos desenvolvendo de forma colaborativa, a quantidade de conflitos que podemos ter em nossos repositórios sempre são grandes, dado a quantidade de acoplamento que criamos sob nossas automações.&lt;/p&gt;

&lt;p&gt;A principal motivação é que este post lhe faça refletir sobre como podemos disponibilizar nosso código de forma objetiva e fácil manutenção e que suas abstrações façam o papel de ajudar a legibilidade do código e não aumente a complexidade de aprendizado.&lt;/p&gt;

&lt;p&gt;Deixo aqui um repositório com vários boilerplates do mesmo projeto de automação de API com diferentes linguagens e frameworks que trabalham a mesma ideia.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rafaelbercam"&gt;
        rafaelbercam
      &lt;/a&gt; / &lt;a href="https://github.com/rafaelbercam/boilerplates"&gt;
        boilerplates
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Test automation project boilerplates
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
&lt;strong&gt;Boilerplates Testes Automatizados&lt;/strong&gt;
&lt;/h1&gt;
&lt;h2&gt;
&lt;strong&gt;O que são?&lt;/strong&gt;
&lt;/h2&gt;
&lt;p&gt;Em programação de computadores, código boilerplate ou boilerplate se refere a seções de código que devem ser incluídas em muitos lugares com pouca ou nenhuma alteração.&lt;/p&gt;
&lt;p&gt;Traduzindo em poucas palavras: é um código padrão ou esqueleto de um código no qual poderá ser reutilizado com pouca alteração ou nenhuma para dar start nos projetos.&lt;/p&gt;
&lt;h2&gt;
&lt;strong&gt;Seções&lt;/strong&gt;
&lt;/h2&gt;
&lt;h3&gt;
Testes API&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/APITestsKotlin"&gt;Automação de Testes API com REST-assured - Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/boilerplate-api-test-rest-assured"&gt;Automação de Testes API com REST-assured - Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/api-tests-typescript"&gt;Automação de Testes API com Mocha e Chai - TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/api_tests_api_rspec"&gt;Automação de Testes API com RSpec e HTTParty - Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/supertest-jest"&gt;Automação de Testes API com Supertest &amp;amp; Jest - TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/automated_tests_pytest"&gt;Automação de testes API com Pytest - Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Testes Web&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/playwright-tests-jest"&gt;Automação de Testes Web com Playwright&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/web-dojo-test-cypress"&gt;Automação de Testes Web com Cypress&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Testes Mobile&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/boilerplate_webdriverio_mobile"&gt;Automação de Testes Mobile com WebdriverIO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Web Crawler&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam/alert-price-Puppeteer"&gt;Alerta de Preço com Puppeteer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rafaelbercam/boilerplates"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;E não deixe de compartilhar este post e deixar um comentário ou dúvida! Minha intenção é compartilhar um pouco do meu conhecimento!&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

&lt;p&gt;Meus links&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/rafaelbercam/"&gt;https://www.linkedin.com/in/rafaelbercam/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rafaelbercam"&gt;https://github.com/rafaelbercam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/rafaelbercam"&gt;https://dev.to/rafaelbercam&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>testing</category>
      <category>api</category>
      <category>architecture</category>
      <category>automation</category>
    </item>
    <item>
      <title>Resolvendo variáveis de ambiente em testes automatizados com dotenv</title>
      <dc:creator>Rafael Berçam</dc:creator>
      <pubDate>Fri, 02 Jul 2021 16:56:49 +0000</pubDate>
      <link>https://forem.com/rafaelbercam/resolvendo-variaveis-de-ambiente-em-testes-automatizados-com-dotenv-3kd3</link>
      <guid>https://forem.com/rafaelbercam/resolvendo-variaveis-de-ambiente-em-testes-automatizados-com-dotenv-3kd3</guid>
      <description>&lt;h2&gt;
  
  
  O Problema
&lt;/h2&gt;

&lt;p&gt;Sempre é uma questão recorrente de, como utilizar variáveis de ambiente em testes automatizados? Como remover do código credenciais de acesso, urls de acesso ao sistema e diminiur a vulnerabilidade?&lt;/p&gt;

&lt;p&gt;Isso é extremamente importante quando o assunto é segurança dos seus repos (mesmo privados), então o que me motivou a criar este post é mostrar como fazer isso usando recursos simples, disponíveis na maior parte das linguagens e frameworks de mercado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variáveis de ambiente, o que são?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma variável de ambiente possui um valor recebido de forma dinâmica, que pode afetar a forma em que os processos em execução se comporta no sistema operacional.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Trocando &lt;code&gt;seis&lt;/code&gt; por &lt;code&gt;meia dúzia&lt;/code&gt;, são variáveis que em tempo de execução recebem valores definidos de forma dinâmica, podendo customizar o valor de acordo com o ambiente executado. &lt;br&gt;
Um bom exemplo são ambientes de execução como &lt;code&gt;Dev&lt;/code&gt;, &lt;code&gt;Homolog&lt;/code&gt; e &lt;code&gt;Produção&lt;/code&gt;, ou credenciais de acesso nesses diferentes ambientes como &lt;code&gt;email&lt;/code&gt; e &lt;code&gt;senha&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E quais são os riscos de deixar isso no repositório?&lt;/p&gt;

&lt;p&gt;Pode ser até uma pergunta fácil de responder, mas os riscos variam de acordo com o sistema em que você atua.&lt;/p&gt;

&lt;p&gt;Imagine um ambiente que comumente é atacado e explorado sua vulnerabilidade? Qualquer brecha é um risco para que exponha dados sensíveis para o mundo externo. Mesmo em repositórios privados, tem o fator humano que pode expor propositalmente e complicar a vida de um time inteiro. &lt;/p&gt;

&lt;p&gt;Então sem mais delongas, vamos ver como resolver isso dentro dos códigos e quais soluções de mercado temos para isso.&lt;/p&gt;
&lt;h4&gt;
  
  
  .ENV
&lt;/h4&gt;

&lt;p&gt;Dentro do ecossistema JavaScript, temos o &lt;code&gt;dotenv&lt;/code&gt; que é uma lib muito comum e fácil de usar.&lt;/p&gt;

&lt;p&gt;vamos analisar o seguinte trecho de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Teste recurso /login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login com sucesso&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fulano@qa.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;teste&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;postLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Login realizado com sucesso&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pois bem, as credenciais de acesso estão expostas no código, e podem ser facilmente identificadas pelos termos de pesquisa de código como &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em um sistema operacional como o Linux, quando precisamos atribuir um valor a uma variável de ambiente em tempo de execução, usando o comando:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;export VARIAVEL='valor-da-variavel'&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E para imprimir o valor e conferir o seu armazenamento podemos usar o comando &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;echo $VARIAVEL&lt;/code&gt;&lt;br&gt;
&lt;code&gt;// valor-da-variavel&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;vide exemplo abaixo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kfuk2x3j7kxcjf450gu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6kfuk2x3j7kxcjf450gu.png" alt="Vaviáveis de ambiente exportadas no terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Considerando essa informação, vamos fazer um teste com nosso trecho de código onde vou substituir os valores que estão expostos por variáveis de ambiente em tempo de execução. Para isso vamos usar o &lt;code&gt;process.env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;process.env&lt;/code&gt; é um recurso do próprio do node de pegar as variáveis de ambiente do sistema.&lt;br&gt;
Se usarmos o mesmo teste do terminal imprimindo apenas as variáveis de ambiente do SO usnado o &lt;code&gt;process.env&lt;/code&gt; do node.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwybq4inzlw6ihgog324c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwybq4inzlw6ihgog324c.png" alt="variáveis de ambiente process.env"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao começar a digitar o &lt;code&gt;process.env&lt;/code&gt; no node, o terminal já exibe previamente uma lista de variáveis que o sistema disponibiliza. Essas variáveis são definidas previamente quando ligamos o computador e damos o arranque no sistema operacional, para isso ele pega as variáveis de ambiente definidas em arquivos específicos.&lt;/p&gt;

&lt;p&gt;Exemplo: &lt;code&gt;~./bashrc&lt;/code&gt; do Linux&lt;/p&gt;

&lt;p&gt;Quando exportamos uma variável como mostra no comando da imagem acima, elas ficam disponíveis enquanto o terminal está em execução, então essas variáveis são listadas quando imprimimos:&lt;/p&gt;

&lt;p&gt;vide saída do comando &lt;code&gt;process.env&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktyb6l4zribo5wz92i2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktyb6l4zribo5wz92i2v.png" alt="variável email"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0a8smhzhu7thafa5hu1r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0a8smhzhu7thafa5hu1r.png" alt="vairável password"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, vamos fazer um teste: Antes de executar o mesmo trecho de código vou substituir os valores por &lt;code&gt;process.env.EMAIL&lt;/code&gt; e &lt;code&gt;process.env.PASSWORD&lt;/code&gt; e executar o código.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Teste recurso /login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login com sucesso&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EMAIL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;password&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PASSWORD&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;postLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Login realizado com sucesso&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Executando o comando para realizar o teste exportando as variáveis:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;"test-dev"&lt;/span&gt;: &lt;span class="s2"&gt;"export EMAIL='fulano@qa.com' &amp;amp;&amp;amp; export PASSWORD='teste' &amp;amp;&amp;amp;  mocha --file login-test.js"&lt;/span&gt;,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Obtive sucesso no teste&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6rcwz0cczfd4ovmth8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6rcwz0cczfd4ovmth8a.png" alt="Testes executados com sucesso"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então precisamos exportar sempre? Claro que não!&lt;/p&gt;

&lt;p&gt;Vamos utilizar uma lib popular que ja mencionei que se chama dotenv. Para isso, use o comando de instalar a dependência dotenv no seu projeto usando o gerenciador de dependências&lt;/p&gt;

&lt;p&gt;Exemplo: &lt;code&gt;yarn add dotenv&lt;/code&gt; ou &lt;code&gt;npm install dotenv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após a instalação, crie um arquivo na raiz do projeto &lt;code&gt;.env&lt;/code&gt; contendo os valores das variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk635gfxn1rs0swnoqzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk635gfxn1rs0swnoqzq.png" alt="Variáveis de ambiente no arquivo .env"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Crie as variáveis de ambiente, contendo todas as informações que precisa abstrair do sistema para as variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;Agora na classe de testes, vamos substituir os valores das credenciais por variáveis de ambiente. E também vamos importar o arquivo .env para dentro da classe de testes.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;dotenv&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="nx"&gt;dotenv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../.env&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;



&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Teste recurso /login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login com sucesso&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EMAIL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PASSWORD&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;postLogin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Repare que no código estou imprimindo as credenciais para ter certeza que o valor esta sendo atribuído para as variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;Executando o teste então temos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89q5mootu5rljhum7drs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F89q5mootu5rljhum7drs.png" alt="Testes executados imprimindo os valores das variáveis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja como é simples!&lt;br&gt;
Agora tem uma dica importante. Precisamos adicionar no .gitignore o arquivo .env e criar um arquivo de exemplo para quem foi baixar o seu repositório, saiba que precisa cria-lo para expor as variáveis de ambiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimm69mzsjnw6zrvrcxsy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimm69mzsjnw6zrvrcxsy.png" alt="Exemplo do arquivo .env.example"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Concluindo
&lt;/h4&gt;

&lt;p&gt;Este foi um exemplo simples de configuração, lembrando que existem maneiras mais abstratas e combinadas com uso de outras libs como cross-env&lt;/p&gt;

&lt;p&gt;Aqui estão os repositórios oficiais do &lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt; e &lt;a href="https://www.npmjs.com/package/cross-env" rel="noopener noreferrer"&gt;cross-env&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste repositório, eu utilizo os mesmos recursos deste post!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rafaelbercam" rel="noopener noreferrer"&gt;
        rafaelbercam
      &lt;/a&gt; / &lt;a href="https://github.com/rafaelbercam/api-tests-typescript" rel="noopener noreferrer"&gt;
        api-tests-typescript
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Automação de Testes de API com TypeScript
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://github.com/ServeRest/ServeRest/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8ffa354f4f3aefc11dcc715815786230c4887b144b9344ba6c79e417d2979095/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492d5365727665526573742d677265656e" alt="Badge ServeRest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;strong&gt;Boilerplate Testes de API em TypeScript&lt;/strong&gt;&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;Pré-requisitos&lt;/strong&gt;&lt;/h2&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Instalar o &lt;a href="https://nodejs.org/pt-br/" rel="nofollow noopener noreferrer"&gt;Node&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;Ambiente&lt;/strong&gt;&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Para executar os testes localmente, estou utilizando o ServeRest&lt;/p&gt;

&lt;p&gt;
 &lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/29241659/115161869-6a017e80-a076-11eb-9bbe-c391eff410db.png"&gt;&lt;img alt="Logo do ServeRest" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F29241659%2F115161869-6a017e80-a076-11eb-9bbe-c391eff410db.png" height="120"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Link do Repo: &lt;a href="https://github.com/ServeRest/ServeRest" rel="noopener noreferrer"&gt;https://github.com/ServeRest/ServeRest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ServeRest está disponível de forma &lt;a href="https://serverest.dev" rel="nofollow noopener noreferrer"&gt;online&lt;/a&gt;, no &lt;a href="https://www.npmjs.com/package/serverest" rel="nofollow noopener noreferrer"&gt;npm&lt;/a&gt; e no &lt;a href="https://hub.docker.com/r/paulogoncalvesbh/serverest/" rel="nofollow noopener noreferrer"&gt;docker&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;Instalando Dependências&lt;/strong&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Rodar o comando&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm i
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Criar arquivo &lt;code&gt;.env&lt;/code&gt; na raiz do projeto&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Criar o arquivo com as seguintes variáveis&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;PROD=https://serverest.dev
DEV=http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Rodar os testes localhost&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm run test-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Para rodar os testes em Produção&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;npm run test-prod
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;&lt;strong&gt;Configuração do Projeto&lt;/strong&gt;&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Estrutura de Pastas&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;O projeto esta dividido da seguinte maneira:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;[api-tests-typescript]
   [src] -&amp;gt; código fonte
        [config] -&amp;gt; arquivos de configuração ambiente
        [factory] -&amp;gt; métodos para criar objetos
        [services] -&amp;gt; funções que retornam requisições das rotas
        [test] -&amp;gt; Arquivos de testes com Mocha e Chai.
   .env -&amp;gt; arquivo com variáveis de ambiente(normalmente não commitada)
   .mocharc.js -&amp;gt; arquivo de configuração do Mochawesome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;&lt;strong&gt;Services&lt;/strong&gt;&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Services são funções que retornam requests pré-estabelecidas de cara um…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rafaelbercam/api-tests-typescript" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>seguranca</category>
      <category>testes</category>
      <category>qa</category>
    </item>
  </channel>
</rss>
