<?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>DEV Community: Diego Yuri</title>
    <description>The latest articles on DEV Community by Diego Yuri (@yuri-aprendendoqa).</description>
    <link>https://dev.to/yuri-aprendendoqa</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%2F1235598%2Fe11ce605-995b-4243-8cc6-ff1f9ef9e700.jpeg</url>
      <title>DEV Community: Diego Yuri</title>
      <link>https://dev.to/yuri-aprendendoqa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuri-aprendendoqa"/>
    <language>en</language>
    <item>
      <title>Aprendendo sobre Teste Estático e Dinâmico</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Fri, 10 Jan 2025 01:35:41 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/aprendendo-sobre-teste-estatico-e-dinamico-3d47</link>
      <guid>https://dev.to/yuri-aprendendoqa/aprendendo-sobre-teste-estatico-e-dinamico-3d47</guid>
      <description>&lt;p&gt;Fala, pessoal! Tudo bem com vocês?, Sejam muito bem vindos ao Aprendendo QA.&lt;br&gt;
Hoje vamos falar sobre um ótimo tema no universo de testes de software: &lt;strong&gt;Testes Estáticos e Dinâmicos&lt;/strong&gt;. Se você já ouviu falar desses termos, mas ainda não sabe exatamente o que significam ou como aplicá-los, fica tranquilo! Vou explicar tudo de forma simples, com exemplos práticos, para que você saia daqui dominando o assunto.&lt;/p&gt;

&lt;p&gt;Então, pega um café, ajusta a cadeira e vem comigo entender como essas duas abordagens podem transformar a qualidade do seu software!&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;O que são Testes Estáticos e Dinâmicos?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para começar, vamos esclarecer os conceitos básicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teste Estático&lt;/strong&gt;: É aquele em que analisamos o software (ou outros artefatos) sem executá-lo. É como revisar um texto antes de imprimir: você verifica se tudo está no lugar, se as regras foram seguidas e se não há erros evidentes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teste Dinâmico&lt;/strong&gt;: Aqui, o software é colocado para rodar. A ideia é testar na prática para ver como ele se comporta em diferentes situações. É como ligar um carro recém-montado para garantir que ele funciona direitinho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos têm o mesmo objetivo: identificar problemas e garantir a qualidade do software. A diferença está na abordagem.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Teste Estático: Detectando Problemas Antes de Rodar&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;p&gt;No teste estático, você analisa os artefatos do software (como código, requisitos ou documentação) sem precisar executá-lo. Isso pode ser feito manualmente (como em revisões de código) ou usando ferramentas automáticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplos práticos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Revisar um documento de requisitos para encontrar ambiguidades ou inconsistências.&lt;/li&gt;
&lt;li&gt;Usar ferramentas como &lt;strong&gt;SonarQube&lt;/strong&gt; para identificar problemas no código, como variáveis não usadas ou violações de padrões.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefícios:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Detecta problemas cedo no ciclo de vida do desenvolvimento (SDLC), economizando tempo e dinheiro.&lt;/li&gt;
&lt;li&gt;Ajuda a encontrar erros que não aparecem nos testes dinâmicos, como código inacessível ou falhas em requisitos não executáveis.&lt;/li&gt;
&lt;li&gt;Melhora a comunicação entre as equipes ao alinhar expectativas desde o início.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Curiosidade:
&lt;/h3&gt;

&lt;p&gt;Sabe aquele momento em que você pede para um colega revisar seu código antes de enviá-lo? Isso é uma forma de teste estático! Mas também existem métodos mais formais, como inspeções detalhadas com métricas e relatórios.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Teste Dinâmico: Colocando o Software à Prova&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;p&gt;Aqui, o software é executado em diferentes cenários para verificar seu comportamento. É o momento de ver se ele realmente faz o que deveria fazer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplos práticos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Testar um formulário online para garantir que ele aceita apenas dados válidos.&lt;/li&gt;
&lt;li&gt;Simular cenários de alta carga para verificar se o sistema suporta muitos usuários simultaneamente.&lt;/li&gt;
&lt;li&gt;Usar ferramentas como &lt;strong&gt;Selenium&lt;/strong&gt; para automatizar testes funcionais.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefícios:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Identifica problemas que só aparecem durante a execução, como erros de integração ou vazamentos de memória.&lt;/li&gt;
&lt;li&gt;Valida a experiência do usuário e garante que o software funcione bem em diferentes ambientes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Curiosidade:
&lt;/h3&gt;

&lt;p&gt;Já usou um app que travou do nada? Esse é um problema que deveria ter sido detectado por testes dinâmicos!&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Comparando Teste Estático e Dinâmico&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Característica&lt;/th&gt;
&lt;th&gt;Teste Estático&lt;/th&gt;
&lt;th&gt;Teste Dinâmico&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execução do Código&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Não executa o código&lt;/td&gt;
&lt;td&gt;Executa o código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Objetivo Principal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Encontrar defeitos antes da execução&lt;/td&gt;
&lt;td&gt;Verificar comportamento durante a execução&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Geralmente menor&lt;/td&gt;
&lt;td&gt;Pode ser maior devido à complexidade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ferramentas Comuns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SonarQube, Checkstyle&lt;/td&gt;
&lt;td&gt;Selenium, JUnit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Defeitos Detectados&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Código inacessível, erros em requisitos&lt;/td&gt;
&lt;td&gt;Bugs funcionais, gargalos de desempenho&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Por que usar os dois juntos?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Os testes estáticos e dinâmicos não competem entre si; eles se complementam. Enquanto os testes estáticos ajudam a evitar problemas desde o início do projeto, os dinâmicos garantem que tudo funcione bem na prática. Pense neles como duas lentes diferentes para enxergar a qualidade do software: uma foca nos detalhes antes da execução e outra avalia o comportamento real.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Dica Lúdica: Entenda com uma Metáfora&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine que você está construindo uma casa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O teste estático seria revisar a planta da casa antes de começar a construção. Aqui você verifica se tudo faz sentido no papel.&lt;/li&gt;
&lt;li&gt;O teste dinâmico seria morar na casa pronta para ver se as portas abrem corretamente ou se as torneiras não vazam.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Viu só? Um complementa o outro!&lt;/p&gt;




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

&lt;p&gt;Testes estáticos e dinâmicos são indispensáveis para garantir a qualidade do software. Saber quando usar cada um deles pode fazer toda a diferença na entrega de um produto confiável e eficiente. Então, da próxima vez que estiver planejando seus testes, lembre-se dessa dupla poderosa!&lt;/p&gt;

&lt;p&gt;E aí, curtiu aprender sobre esses conceitos? Deixe nos comentários suas dúvidas ou experiências com testes! Até a próxima! 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>BDD - Desenvolvimento Orientado pelo Comportamento</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Fri, 12 Jul 2024 04:37:15 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/bdd-desenvolvimento-orientado-pelo-comportamento-32n3</link>
      <guid>https://dev.to/yuri-aprendendoqa/bdd-desenvolvimento-orientado-pelo-comportamento-32n3</guid>
      <description>&lt;h1&gt;
  
  
  Desenvolvimento Orientado pelo Comportamento(BDD)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introdução ao BDD
&lt;/h2&gt;

&lt;p&gt;Behavior-Driven Development (BDD) é uma abordagem de desenvolvimento de software que incentiva a colaboração entre desenvolvedores, testadores e stakeholders de negócios. O principal objetivo do BDD é garantir que todos os membros da equipe compreendam claramente os requisitos do sistema, descrevendo o comportamento desejado de um aplicativo em uma linguagem natural e acessível a todos os envolvidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Origem e Evolução do BDD
&lt;/h2&gt;

&lt;p&gt;BDD evoluiu a partir do Test-Driven Development (TDD) e foi popularizado por Dan North em 2006. Ele surgiu como uma resposta às dificuldades enfrentadas com TDD, propondo uma abordagem que focasse mais no comportamento esperado do sistema do que nos detalhes técnicos dos testes. Com o tempo, BDD cresceu para incluir uma visão mais ampla da análise ágil e dos testes de aceitação automatizados, unificando pessoas técnicas e de negócios usando uma linguagem comum centrada no comportamento do usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Princípios Fundamentais do BDD
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Colaboração&lt;/strong&gt;: Promove a comunicação contínua entre todos os stakeholders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linguagem Natural&lt;/strong&gt;: Utiliza uma linguagem comum (Gherkin) para descrever requisitos e critérios de aceitação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentação Viva&lt;/strong&gt;: Os testes BDD servem como documentação atualizada do comportamento do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ciclos Curtos de Feedback&lt;/strong&gt;: Facilita a identificação e resolução rápida de problemas por meio de iterações curtas e frequentes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ferramentas Comuns de BDD
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cucumber&lt;/strong&gt;: Linguagem de especificação: Gherkin. Integra-se com várias linguagens de programação como Ruby, Java, JavaScript. Permite escrever testes em linguagem natural compreensível por todas as partes interessadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SpecFlow&lt;/strong&gt;: Versão do Cucumber para .NET. Linguagem de especificação: Gherkin. Integra-se com MSTest, NUnit e xUnit para testes de aceitação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JBehave&lt;/strong&gt;: Ferramenta de BDD para Java. Linguagem de especificação: Story. Facilita testes de aceitação integrando-se com JUnit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Behat&lt;/strong&gt;: Ferramenta de BDD para PHP. Linguagem de especificação: Gherkin. Integrado com bibliotecas PHP como Mink para testes de navegador.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gauge&lt;/strong&gt;: Ferramenta leve para criar especificações de teste. Suporta várias linguagens como Java, Ruby, C#, Python. Usa um formato de especificação simples e reusável.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lettuce&lt;/strong&gt;: Ferramenta de BDD para Python. Linguagem de especificação: Gherkin. Facilita a escrita de testes de comportamento de forma clara.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Concordion&lt;/strong&gt;: Ferramenta de BDD para Java. Usa HTML para escrever especificações de teste. Testes são incorporados em documentos HTML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Turnip&lt;/strong&gt;: Extensão do Cucumber para Ruby. Linguagem de especificação: Gherkin. Focado em testes de aceitação para aplicações Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementação do BDD em Projetos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Passo 1: Definição dos Cenários
&lt;/h3&gt;

&lt;p&gt;Comece identificando os cenários de uso mais importantes e descreva-os em linguagem natural utilizando a estrutura "Dado, Quando, Então".&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 2: Automação dos Testes
&lt;/h3&gt;

&lt;p&gt;Utilize uma ferramenta BDD (como Cucumber) para automatizar os cenários descritos. Isso envolve a criação de "steps" que correspondem a cada etapa dos cenários.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 3: Integração Contínua
&lt;/h3&gt;

&lt;p&gt;Integre a execução dos testes BDD no seu pipeline de CI/CD. Isso garante que os testes sejam executados regularmente e que o feedback sobre o estado do sistema seja contínuo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de Escrita para BDD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Método Imperativo
&lt;/h3&gt;

&lt;p&gt;O método imperativo descreve o cenário passo a passo, detalhando ações, nomes de botões e páginas acessadas. É mais utilizado para pessoas que realizam testes manuais e sentem a necessidade de visualizar detalhadamente todos os passos de um cenário.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;:&lt;br&gt;
&lt;/p&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; Compra de Produto

&lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Compra de produto com sucesso
  &lt;span class="nf"&gt;Dado &lt;/span&gt;que o usuário está na página inicial
  &lt;span class="nf"&gt;Quando &lt;/span&gt;ele clica no link &lt;span class="s"&gt;"Login"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;preenche o campo de e-mail com &lt;span class="s"&gt;"usuario@exemplo.com"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;preenche o campo de senha com &lt;span class="s"&gt;"senhaSegura123"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;clica no botão &lt;span class="s"&gt;"Entrar"&lt;/span&gt;
  &lt;span class="nf"&gt;Então &lt;/span&gt;ele deve ser redirecionado para a página &lt;span class="s"&gt;"Minha Conta"&lt;/span&gt;

  &lt;span class="nf"&gt;Dado &lt;/span&gt;que ele está logado na página &lt;span class="s"&gt;"Minha Conta"&lt;/span&gt;
  &lt;span class="nf"&gt;Quando &lt;/span&gt;ele pesquisa pelo produto &lt;span class="s"&gt;"Smartphone XYZ"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;clica no botão &lt;span class="s"&gt;"Buscar"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;clica no link do produto &lt;span class="s"&gt;"Smartphone XYZ"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;clica no botão &lt;span class="s"&gt;"Adicionar ao Carrinho"&lt;/span&gt;
  &lt;span class="nf"&gt;Então &lt;/span&gt;ele deve ver uma mensagem &lt;span class="s"&gt;"Produto adicionado ao carrinho"&lt;/span&gt;

  &lt;span class="nf"&gt;Dado &lt;/span&gt;que o produto está no carrinho
  &lt;span class="nf"&gt;Quando &lt;/span&gt;ele clica no ícone do carrinho
  &lt;span class="nf"&gt;E &lt;/span&gt;clica no botão &lt;span class="s"&gt;"Finalizar Compra"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;preenche o endereço de entrega
  &lt;span class="nf"&gt;E &lt;/span&gt;escolhe a forma de pagamento &lt;span class="s"&gt;"Cartão de Crédito"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;preenche os dados do cartão
  &lt;span class="nf"&gt;E &lt;/span&gt;clica no botão &lt;span class="s"&gt;"Confirmar Compra"&lt;/span&gt;
  &lt;span class="nf"&gt;Então &lt;/span&gt;ele deve ver uma mensagem &lt;span class="s"&gt;"Compra realizada com sucesso"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Desvantagens do Método Imperativo
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desgaste e Tempo&lt;/strong&gt;: A escrita detalhada de cada passo pode ser desgastante e consumir muito tempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rigidez&lt;/strong&gt;: Pequenas mudanças na interface exigem uma revisão completa dos cenários, o que pode ser trabalhoso.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Método Declarativo
&lt;/h3&gt;

&lt;p&gt;O método declarativo foca no comportamento do usuário e descreve os passos de forma mais abstrata, facilitando o entendimento e a manutenção.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;:&lt;br&gt;
&lt;/p&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; Compra de Produto

&lt;span class="kn"&gt;Cenário&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Compra de produto com sucesso
  &lt;span class="nf"&gt;Dado &lt;/span&gt;que o usuário está na página inicial
  &lt;span class="nf"&gt;Quando &lt;/span&gt;ele faz login no sistema
  &lt;span class="nf"&gt;E &lt;/span&gt;pesquisa e seleciona o produto &lt;span class="s"&gt;"Smartphone XYZ"&lt;/span&gt;
  &lt;span class="nf"&gt;E &lt;/span&gt;adiciona o produto ao carrinho
  &lt;span class="nf"&gt;E &lt;/span&gt;finaliza a compra com um cartão de crédito
  &lt;span class="nf"&gt;Então &lt;/span&gt;ele deve ver uma mensagem &lt;span class="s"&gt;"Compra realizada com sucesso"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Vantagens do Método Declarativo
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Simplicidade&lt;/strong&gt;: Cenários mais curtos e de fácil compreensão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção&lt;/strong&gt;: Menos suscetível a mudanças na interface.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Sintaxe Gherkin
&lt;/h3&gt;

&lt;p&gt;Gherkin é uma Business Readable Domain Specific Language, criada para descrever comportamentos desejados de um software, removendo os detalhes lógicos dos testes de comportamento.&lt;/p&gt;

&lt;h4&gt;
  
  
  Elementos do Gherkin
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Given (Dado)&lt;/strong&gt;: Descrição das condições para o cenário ocorrer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When (Quando)&lt;/strong&gt;: Descrição das ações que devem ocorrer quando o cenário for executado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then (Então)&lt;/strong&gt;: Descrição dos resultados esperados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Funcionalidade&lt;/strong&gt;: Define o conjunto de comportamento do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contexto&lt;/strong&gt;: Precondição que se repete para todos os cenários da funcionalidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cenário&lt;/strong&gt;: Identifica um fluxo por meio do comportamento do sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esquema do cenário&lt;/strong&gt;: Informa que esse cenário irá utilizar um conjunto de dados para repeti-lo várias vezes com dados diferentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Boas Práticas para a Escrita do BDD
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade&lt;/strong&gt;: Não há certo ou errado entre os métodos de escrita apresentados; use o que for mais produtivo para o seu time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foco no Comportamento do Usuário&lt;/strong&gt;: O comportamento do usuário deve ser o centro das atenções.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escrita em Terceira Pessoa&lt;/strong&gt;: Para manter o foco no usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objetividade&lt;/strong&gt;: Cenários objetivos são mais fáceis de manter e menos propensos a falhas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboração&lt;/strong&gt;: Envolva todo o time na escrita do BDD.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Como Levar a Abordagem BDD para o Seu Time
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Los Tres Amigos
&lt;/h3&gt;

&lt;p&gt;Também conhecido como Power of Three, este processo consiste em reunir o analista de negócios, um desenvolvedor e um QA para construir cenários e histórias coerentes e de valor para o usuário.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Analista de negócios&lt;/strong&gt;: Foco nas regras de negócio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desenvolvedor&lt;/strong&gt;: Verificação técnica e soluções alternativas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analista de qualidade&lt;/strong&gt;: Levantamento de cenários não imaginados e questionamento de comportamentos adversos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BDD Warriors
&lt;/h3&gt;

&lt;p&gt;Um jogo que ensina de forma divertida como escrever cenários coerentes e objetivos utilizando o mínimo de linhas possíveis. Cada jogador recebe cartas com passos diversos (Given, When, Then) e, a cada rodada, complementa o cenário. O objetivo é completar cenários de forma eficaz e aprender a importância do trabalho em equipe na construção dos BDDs.&lt;/p&gt;

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

&lt;p&gt;Behavior-Driven Development é uma abordagem poderosa que pode melhorar significativamente a qualidade do software e a comunicação entre os membros da equipe. Embora haja desafios na sua implementação, os benefícios superam as dificuldades, resultando em sistemas que melhor atendem às necessidades dos usuários e facilitam a manutenção e evolução contínua.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Idempotência: Conceito e Aplicação na Garantia da Qualidade de Softwar</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Sat, 15 Jun 2024 00:36:43 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/idempotencia-conceito-e-aplicacao-na-garantia-da-qualidade-de-softwar-1gic</link>
      <guid>https://dev.to/yuri-aprendendoqa/idempotencia-conceito-e-aplicacao-na-garantia-da-qualidade-de-softwar-1gic</guid>
      <description>&lt;h4&gt;
  
  
  1. Introdução
&lt;/h4&gt;

&lt;p&gt;Você sabe ou já ouviu falar em idempotência? &lt;/p&gt;

&lt;p&gt;Em matemática e ciência da computação, a idempotência é a propriedade que algumas operações têm de poderem ser aplicadas várias vezes sem que o valor do resultado se altere após a aplicação inicial. De acordo com a Wikipedia, isso significa que, após a primeira execução de uma operação idempotente, execuções subsequentes não terão efeito adicional. A idempotência é um conceito crucial na qualidade de software (QA), especialmente em serviços web e APIs, pois garante que sistemas sejam mais confiáveis e robustos.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Conceito e Exemplos de Idempotência
&lt;/h4&gt;

&lt;p&gt;Em termos de métodos HTTP, a idempotência refere-se a métodos que podem ser chamados múltiplas vezes sem produzir resultados diferentes. Segundo a W3C, o resultado de uma solicitação executada com sucesso é independente do número de vezes que ela é executada. Por exemplo, em aritmética, adicionar zero a um número é uma operação idempotente, pois não altera o valor original.&lt;/p&gt;

&lt;p&gt;No contexto de APIs REST, os seguintes verbos HTTP são considerados idempotentes: GET, PUT, DELETE, HEAD e OPTIONS. Por outro lado, o verbo POST não é idempotente. Métodos idempotentes são seguros, ou seja, não alteram o estado da aplicação, enquanto métodos não idempotentes podem alterar o estado.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Idempotência em APIs REST: Exemplos Práticos
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt;: O método POST é usado principalmente para criar recursos. Cada requisição POST cria um novo recurso, alterando o estado da aplicação. Por exemplo, suponha que temos um endpoint "/user" que recebe um payload para criar um usuário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lucas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"last_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Paixão"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Araraquara"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada vez que esse endpoint é chamado, um novo usuário é criado, mudando o estado da aplicação e adicionando um novo registro ao banco de dados. Por isso, POST não é idempotente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt;: O método GET é usado para recuperar dados. Ele é considerado idempotente porque, independentemente de quantas vezes seja chamado, a resposta será a mesma, sem alterar o estado da aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PUT&lt;/strong&gt;: O método PUT é usado para atualizar recursos. Ele é idempotente porque, após a primeira chamada, chamadas subsequentes com o mesmo payload não alteram o estado da aplicação. Por exemplo, se enviarmos um payload para alterar a cidade de "Araraquara" para "São Paulo", a resposta será a mesma em chamadas subsequentes, com o estado da aplicação inalterado após a primeira atualização:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Lucas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"last_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Paixão"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"São Paulo"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DELETE&lt;/strong&gt;: O método DELETE é usado para remover recursos. Ele é idempotente porque, após a primeira chamada que deleta o recurso, chamadas subsequentes não terão efeito adicional, retornando o mesmo resultado. Por exemplo, ao deletar um usuário com "/user?name=Lucas", a primeira chamada remove o usuário e as seguintes confirmam que o recurso não existe mais, sem alterar o estado da aplicação.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Importância da Idempotência em APIs REST
&lt;/h4&gt;

&lt;p&gt;A idempotência é crucial para garantir que os serviços que consomem APIs REST funcionem corretamente, mesmo em situações de erro ou duplicação de chamadas. Por exemplo, se ocorrer um timeout, é comum que o serviço faça uma nova chamada ao endpoint. Sem idempotência, chamadas duplicadas podem causar resultados inesperados ou exceções.&lt;/p&gt;

&lt;p&gt;Implementar idempotência previne erros e garante que o sistema se comporte de maneira previsível e confiável, mesmo sob condições adversas. Isso é essencial para manter a integridade dos dados e a estabilidade do sistema.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Conclusão
&lt;/h4&gt;

&lt;p&gt;Em resumo, a idempotência é um conceito fundamental para a qualidade de software, especialmente em serviços web e APIs. Ela garante que operações possam ser repetidas sem causar efeitos colaterais indesejados, aumentando a confiabilidade e a robustez do sistema. Ao implementar idempotência, prevenimos erros, melhoramos a experiência do usuário e garantimos a consistência dos dados. Portanto, adotar práticas idempotentes é uma estratégia vital na garantia da qualidade de software.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fundamentos de Teste</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Sun, 12 May 2024 04:16:50 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/fundamentos-de-teste-4753</link>
      <guid>https://dev.to/yuri-aprendendoqa/fundamentos-de-teste-4753</guid>
      <description>&lt;h2&gt;
  
  
  1.1 O que é teste?
&lt;/h2&gt;

&lt;p&gt;Teste de software é um processo essencial no desenvolvimento de sistemas, visando avaliar a qualidade de um programa de computador para garantir seu funcionamento conforme o esperado. Este processo envolve a identificação de defeitos e a verificação se o software atende aos requisitos especificados. O teste pode ser dinâmico, envolvendo a execução do software, ou estático, que inclui revisões e análise sem a execução do programa.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1.1 Objetivos do teste
&lt;/h3&gt;

&lt;p&gt;Os objetivos do teste são diversos e variam de acordo com o contexto. Eles incluem avaliar produtos de trabalho, detectar falhas, garantir a cobertura necessária, reduzir o risco de qualidade inadequada, garantir conformidade com requisitos contratuais e normativos, fornecer informações aos stakeholders e criar confiança na qualidade do software. O principal objetivo é reduzir a probabilidade de defeitos quando o software estiver em produção, minimizando os riscos para o negócio e garantindo que as necessidades do cliente sejam atendidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1.2 Teste e depuração
&lt;/h3&gt;

&lt;p&gt;O teste e a depuração são atividades distintas, mas complementares, no ciclo de desenvolvimento de software. Enquanto o teste identifica falhas no software, a depuração se concentra em encontrar e corrigir essas falhas. No teste dinâmico, quando uma falha é acionada, o processo de depuração envolve reproduzir a falha, diagnosticar a causa principal e corrigir essa causa. No teste estático, quando um defeito é identificado, a depuração se concentra em removê-lo diretamente do código, sem a necessidade de reproduzir a falha.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 Por que os testes são necessários?
&lt;/h2&gt;

&lt;p&gt;Os testes desempenham um papel crucial no desenvolvimento de software, proporcionando uma forma eficaz de garantir a qualidade e confiabilidade dos produtos de software. Existem várias razões pelas quais os testes são necessários, cada uma contribuindo para o sucesso geral do processo de desenvolvimento. Vamos explorar essas razões em detalhes:&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2.1 Contribuições para o sucesso dos testes
&lt;/h3&gt;

&lt;p&gt;Os testes oferecem um meio econômico de detectar defeitos, permitindo sua remoção e contribuindo, assim, para a melhoria da qualidade do software. Além disso, eles proporcionam uma avaliação direta da qualidade dos artefatos em diferentes estágios do ciclo de vida do desenvolvimento de software, auxiliando nas decisões de progressão para as próximas etapas do processo. Os testes também garantem que as necessidades dos usuários sejam consideradas ao longo do ciclo de vida do desenvolvimento e podem ser necessários para atender a requisitos contratuais ou legais, bem como para cumprir normas regulatórias.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2.2 Testes e Garantia da Qualidade (QA)
&lt;/h3&gt;

&lt;p&gt;Embora muitas vezes os termos "teste" e "garantia da qualidade" (QA) sejam usados de forma intercambiável, é importante reconhecer suas diferenças. Enquanto o teste é uma forma de controle de qualidade (QC), focado na detecção de defeitos, a QA é uma abordagem preventiva e orientada para o processo, visando a implementação e melhoria dos processos de desenvolvimento e teste. Enquanto o QC é corretivo e centrado no produto, a QA é preventiva e centra-se nos processos, buscando garantir que um bom processo resulte em um bom produto.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2.3 Erros, Defeitos, Falhas e Causas-raiz
&lt;/h3&gt;

&lt;p&gt;Os erros humanos podem resultar na introdução de defeitos no software, que, por sua vez, podem causar falhas no sistema. Identificar a causa-raiz de um problema é essencial para evitar falhas recorrentes. A análise de causa-raiz é realizada para identificar as causas fundamentais de erros ou defeitos, permitindo sua remoção ou mitigação. Essa abordagem é fundamental para a melhoria contínua da qualidade do software e a prevenção de problemas futuros.&lt;/p&gt;

&lt;p&gt;Em resumo, os testes são necessários para garantir que o software atenda aos requisitos de qualidade, atendendo às necessidades dos usuários e garantindo sua confiabilidade e desempenho adequados. Eles desempenham um papel crucial não apenas na detecção de defeitos, mas também na prevenção de problemas e na melhoria contínua dos processos de desenvolvimento de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.3 Princípios de Teste
&lt;/h2&gt;

&lt;p&gt;Ao longo dos anos, vários princípios de teste foram propostos para oferecer diretrizes gerais aplicáveis a todos os tipos de testes. Neste contexto, destacamos sete desses princípios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O teste mostra a presença, não a ausência de defeitos.&lt;/li&gt;
&lt;li&gt;Testes exaustivos são impossíveis.&lt;/li&gt;
&lt;li&gt;Testes antecipados economizam tempo e dinheiro.&lt;/li&gt;
&lt;li&gt;Os defeitos se agrupam.&lt;/li&gt;
&lt;li&gt;Os testes se degradam.&lt;/li&gt;
&lt;li&gt;Os testes dependem do contexto.&lt;/li&gt;
&lt;li&gt;Falácia da ausência de defeitos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1.4 Atividades de teste, Testware e Papéis no teste
&lt;/h2&gt;

&lt;p&gt;O processo de teste é fundamental para garantir a qualidade de um produto de software. Embora possa variar dependendo do contexto, existem conjuntos comuns de atividades de teste que formam um processo de teste. Essas atividades são adaptadas de acordo com as necessidades específicas do projeto e são essenciais para alcançar os objetivos de teste.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4.1 Atividades e Tarefas de Teste
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Planejamento do Teste&lt;/li&gt;
&lt;li&gt;Monitoramento e Controle de Teste&lt;/li&gt;
&lt;li&gt;Análise de Teste&lt;/li&gt;
&lt;li&gt;Modelagem de Teste&lt;/li&gt;
&lt;li&gt;Implementação do Teste&lt;/li&gt;
&lt;li&gt;Execução do Teste&lt;/li&gt;
&lt;li&gt;Conclusão de Teste&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.4.2 Processo de Teste no Contexto
&lt;/h3&gt;

&lt;p&gt;O processo de teste é influenciado por diversos fatores contextuais, incluindo stakeholders, membros da equipe, domínio do negócio, fatores técnicos, restrições do projeto, fatores organizacionais e ciclo de vida do desenvolvimento de software. Esses fatores impactam a estratégia de teste, técnicas de teste, grau de automação e relatórios de teste.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4.3 Testware
&lt;/h3&gt;

&lt;p&gt;O testware é o produto de trabalho de saída das atividades de teste e inclui diversos elementos, como plano de testes, casos de teste, scripts de teste, registros de testes e relatórios de defeitos. O gerenciamento adequado do testware é essencial para garantir a consistência e integridade dos produtos de trabalho.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4.4 Rastreabilidade entre a Base de Teste e o Testware
&lt;/h3&gt;

&lt;p&gt;Para um monitoramento e controle eficazes dos testes, é importante estabelecer e manter a rastreabilidade entre os elementos da base de teste e o testware associado. A rastreabilidade permite avaliar a cobertura, determinar o impacto das mudanças, facilitar auditorias de teste e atender aos critérios de governança de TI.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4.5 Papéis no Teste
&lt;/h3&gt;

&lt;p&gt;Existem dois papéis principais nos testes: gerenciamento de teste e testador. O papel de gerenciamento de teste é responsável pelo planejamento, monitoramento e controle das atividades de teste, enquanto o papel de testador foca nas atividades técnicas de análise, modelagem, implementação e execução de teste. Os indivíduos podem desempenhar esses papéis em momentos diferentes, dependendo do contexto e das necessidades do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.5 Habilidades essenciais e boas práticas em testes
&lt;/h2&gt;

&lt;p&gt;Habilidade é a capacidade de realizar uma tarefa com eficácia, uma aptidão que resulta do conhecimento, prática e aptidão de uma pessoa. Os testadores eficazes possuem habilidades essenciais que lhes permitem desempenhar bem seu trabalho. Eles não apenas realizam testes, mas também são membros ativos e eficazes de uma equipe, capazes de executar testes em vários níveis de independência.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.5.1 Habilidades genéricas necessárias para testes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Conhecimento sobre testes&lt;/li&gt;
&lt;li&gt;Meticulosidade e atenção aos detalhes&lt;/li&gt;
&lt;li&gt;Boas habilidades de comunicação&lt;/li&gt;
&lt;li&gt;Pensamento analítico e crítico&lt;/li&gt;
&lt;li&gt;Conhecimento técnico&lt;/li&gt;
&lt;li&gt;Conhecimento do domínio&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.5.2 Abordagem de equipe completa
&lt;/h3&gt;

&lt;p&gt;Na abordagem de equipe completa, todos os membros da equipe têm a capacidade de executar qualquer tarefa e são responsáveis pela qualidade. A colaboração e comunicação são facilitadas pela co-localização da equipe, seja fisicamente ou virtualmente. Essa abordagem melhora a dinâmica da equipe, promove a comunicação e colaboração e permite o aproveitamento dos vários conjuntos de habilidades da equipe para o benefício do projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.5.3 Independência dos testes
&lt;/h3&gt;

&lt;p&gt;A independência dos testes é crucial para a eficácia do processo de teste, pois permite que os testadores identifiquem diferentes tipos de falhas e defeitos em comparação com os desenvolvedores, devido às suas diferentes perspectivas e formações técnicas. No entanto, a independência não substitui a familiaridade, e diferentes níveis de independência podem ser necessários dependendo do contexto do projeto.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Aprofundando os Conhecimentos em Testes de Software: Diferenciando Tipo e Nível de Teste</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Sun, 04 Feb 2024 01:38:12 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/aprofundando-os-conhecimentos-em-testes-de-software-diferenciando-tipo-e-nivel-de-teste-2k12</link>
      <guid>https://dev.to/yuri-aprendendoqa/aprofundando-os-conhecimentos-em-testes-de-software-diferenciando-tipo-e-nivel-de-teste-2k12</guid>
      <description>&lt;p&gt;Ao abordarmos o processo de garantia de qualidade de software, deparamo-nos com termos e conceitos que, à primeira vista, podem parecer complexos e até confundíveis (especialmente quando ainda não os compreendemos completamente). Um ponto crucial nessa discussão é a distinção entre Tipos de Testes e Níveis de Testes, uma distinção que frequentemente causa confusão, especialmente entre os iniciantes. Vamos, então, explorar essas diferenças e fornecer uma explicação mais clara sobre o assunto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos e Níveis de Testes: Entendendo as Diferenças
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipos de Testes
&lt;/h3&gt;

&lt;p&gt;Os &lt;strong&gt;tipos de testes&lt;/strong&gt; estão diretamente ligados ao propósito específico do teste, determinando se este será funcional, de desempenho, entre outros&lt;/p&gt;

&lt;h3&gt;
  
  
  Níveis de Testes
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;nível de teste&lt;/strong&gt;, por sua vez, descreve o momento em que o teste ocorre durante o ciclo de desenvolvimento. Este aspecto considera se o teste é realizado em um sistema já desenvolvido ou durante sua construção.&lt;/p&gt;

&lt;p&gt;Para o BSTQB (Brazilian Software Testing Qualifications Board) em seu documento base de estudo (Syllabus) disponível em &lt;a href="https://bcr.bstqb.org.br/docs/syllabus_ctfl_3.1.1br.pdf"&gt;Base de estudo&lt;/a&gt;, eles também definem níveis de testes como grupos de atividades de teste que são organizados e gerenciados juntos, descrevendo/executando testes em determinado nível de desenvolvimento do projeto, desde as unidades individuais ou componentes até os sistemas completos ou, quando aplicável, em sistemas de sistemas.&lt;/p&gt;

&lt;p&gt;No livro "Jornada Ágil de Qualidade", os níveis de teste são explorados, destacando a capacidade de agrupá-los para identificar responsabilidades, o tamanho do objeto de teste e a semelhança com o ambiente de produção. Os níveis típicos como: &lt;strong&gt;unidade, integração, sistema e aceitação&lt;/strong&gt;, podem ser categorizados em baixo e alto nível.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjpyz6myrpz6eni8l623.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvjpyz6myrpz6eni8l623.png" alt="Niveis de teste" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Baixo Nível de Testes
&lt;/h2&gt;

&lt;p&gt;Os &lt;strong&gt;testes de baixo nível&lt;/strong&gt; são direcionados à verificação de componentes individuais do sistema, sendo os desenvolvedores os principais responsáveis por sua execução. Após assegurar a qualidade das partes mais fundamentais do sistema por meio dos testes de unidade, as partes maiores são testadas em conjunto durante os testes de integração. Exemplos incluem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testes Unitários&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Também conhecidos como Teste de Componentes ou Teste de Unidade.&lt;/li&gt;
&lt;li&gt;Focam nos menores blocos construtivos do sistema.&lt;/li&gt;
&lt;li&gt;Baseiam-se no funcionamento interno de componentes individuais.&lt;/li&gt;
&lt;li&gt;Podem exigir testes funcionais e não funcionais*&lt;em&gt;(Tipo de teste).&lt;/em&gt;*&lt;/li&gt;
&lt;li&gt;Geralmente executados pelo desenvolvedor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testes de Integração&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realizados após os testes unitários.&lt;/li&gt;
&lt;li&gt;Concentram-se nas interações entre componentes ou sistemas.&lt;/li&gt;
&lt;li&gt;Verificam se o sistema se comporta corretamente quando partes são combinadas.&lt;/li&gt;
&lt;li&gt;Podem exigir testes funcionais e não funcionais*&lt;em&gt;(Tipo de teste).&lt;/em&gt;*.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Alto Nível de Testes
&lt;/h2&gt;

&lt;p&gt;Os &lt;strong&gt;testes de alto nível&lt;/strong&gt; visam testar produtos completos, fornecendo informações sobre a qualidade do sistema. Estes são realizados após os testes de baixo nível e, frequentemente, em diferentes etapas da validação do sistema. Os principais testes de alto nível incluem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testes de Sistema&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envolvem o teste funcional ou integrado do sistema completo.&lt;/li&gt;
&lt;li&gt;Concentram-se no comportamento e capacidades globais do sistema.&lt;/li&gt;
&lt;li&gt;Objetivos incluem a redução de riscos e a validação do sistema como um todo.&lt;/li&gt;
&lt;li&gt;Exemplos de testes: usabilidade, acessibilidade, desempenho, segurança (pentest), portabilidade, regressão.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Testes de Aceitação&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Executados pelo usuário ou cliente.&lt;/li&gt;
&lt;li&gt;Validam se o sistema atende aos requisitos originais.&lt;/li&gt;
&lt;li&gt;Realizados após os testes de sistema bem-sucedidos.&lt;/li&gt;
&lt;li&gt;Objetivos incluem estabelecer confiança na qualidade do sistema como um todo e verificar se os comportamentos funcionais e não funcionais estão de acordo com o esperado.&lt;/li&gt;
&lt;li&gt;Exemplos de testes: aceitação do usuário,aceitação do contrato,alpha, beta, ATDD, testes A/B, LRR, HRR.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlue7dhb3ljd1pg7o2n1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlue7dhb3ljd1pg7o2n1.png" alt="relação teste" width="581" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É crucial lembrar que não existe uma abordagem única para testes, ou seja, não necessáriamente seguiriamos o fluxo baixo nivel para alto nivel. A flexibilidade na aplicação dos níveis de teste é essencial para adaptar o modelo à realidade do contexto em que será utilizado, a imagem a seguir demonstra um pouco essa questão&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy10h60tohly50ekanho8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy10h60tohly50ekanho8.png" alt="encaixe testen" width="533" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Compreendido os &lt;strong&gt;niveis de testes&lt;/strong&gt;, iremos agora se aprofundar um pouco mais nos &lt;strong&gt;tipos de testes&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos de Teste
&lt;/h2&gt;

&lt;p&gt;Quando falamos de tipo de testes, estamos falando da "forma" que determinada coisa será testada e seu proposito. Lembrando que essa "Forma" de testar que logo iremos descrever melhor, pode ser alocada em quaisquer niveis de testes, sendo alguns mais habitual, outros não.&lt;/p&gt;

&lt;p&gt;Para falarmos de tipo de teste, inicialmente vamos a sua definição&lt;br&gt;
contida lá naquela base de estudo do BSTQB&lt;br&gt;
Eles definem os tipos de teste em 4 principais(Que podem ter ramificações)&lt;br&gt;
Sendo eles:&lt;br&gt;
1 -Teste funcional&lt;br&gt;
2 -Teste não funcional&lt;br&gt;
3 -Teste caixa-branca&lt;br&gt;
4 -Teste relacionado à mudança&lt;/p&gt;

&lt;p&gt;Mas vejamos, Muito usa-se no mercado outras nomenclaturas, ou, aquilo que eu chamo de ramificações desses tipos de testes inicial definido.&lt;br&gt;
Irei primeiro basear-se em 4 topicos desses tipo de testes, e posteriormente em um segundo post, irei aprofundar nossos conehcimentos geral nos tipos de teste.&lt;br&gt;
irei trazer uma base sobre os 4 diferente tipospara compreendermos o contexto geral dos tipos de testes &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QQeMylzD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/v2/resize:fit:720/format:webp/1%2ANLI1L7RK7SRyFj3c59dXSg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QQeMylzD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://miro.medium.com/v2/resize:fit:720/format:webp/1%2ANLI1L7RK7SRyFj3c59dXSg.png" alt="Niveis de teste" width="720" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1 - Teste Funcional
&lt;/h2&gt;

&lt;p&gt;O teste funcional em um sistema visa avaliar as funções que o software deve executar, com base nos requisitos funcionais, que podem ser descritos em diversas formas, como especificações de requisitos, épicos, histórias de usuários, casos de uso ou especificações funcionais. Essas funções representam o "o que" o sistema deve realizar.&lt;/p&gt;

&lt;p&gt;A realização de testes funcionais ocorre em todos os níveis de teste, sendo que cada nível pode ter um foco diferente. O teste funcional utiliza técnicas de caixa-preta para avaliar o comportamento do software, derivando condições e casos de teste sem a necessidade de conhecimento interno da implementação. A cobertura funcional é uma medida de eficácia, calculada como a porcentagem de elementos funcionais abordados pelos testes, identificando potenciais lacunas de cobertura.&lt;/p&gt;

&lt;p&gt;O projeto e a execução de testes funcionais podem exigir conhecimentos específicos, como compreensão do problema de negócios que o software resolve. As características de qualidade podem ser classificadas como funcionais e não funcionais, sendo que o teste funcional se concentra nas subcaracterísticas relacionadas à funcionalidade, como adequação funcional, corretude, completude e adequação à tarefa.&lt;/p&gt;

&lt;p&gt;Em resumo, o teste funcional consiste em uma série de subtestes, especialmente utilizando técnicas caixa-preta, para garantir que o software desempenhe efetivamente as funções planejadas, com ênfase nas características de qualidade funcionais.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 - Teste Não Funcional
&lt;/h2&gt;

&lt;p&gt;Os testes não funcionais abrangem a avaliação de características gerais de sistemas e softwares, como usabilidade, eficiência de performance e segurança. Ao contrário de uma percepção comum, esses testes são aplicáveis em todos os níveis e devem ser realizados o mais cedo possível para evitar descobertas tardias de defeitos não funcionais, que podem ser prejudiciais ao sucesso do projeto.&lt;/p&gt;

&lt;p&gt;Assim como nos testes funcionais, as técnicas caixa-preta podem ser utilizadas para derivar condições de teste e casos de teste para os testes não funcionais. Por exemplo, a análise do valor limite pode ser empregada para definir condições de tensão em testes de performance. A eficácia dos testes não funcionais é medida pela cobertura não funcional, expressa como a porcentagem de elementos não funcionais abordados pelos testes, identificando possíveis lacunas de cobertura.&lt;/p&gt;

&lt;p&gt;A modelagem e execução de testes não funcionais podem exigir habilidades especializadas, como o conhecimento de fraquezas inerentes a um projeto ou tecnologia, como vulnerabilidades de segurança associadas a linguagens de desenvolvimento específicas. Além disso, considerações sobre a base de usuários, como os funcionários de sistemas de gerenciamento de unidades de saúde, podem ser relevantes.&lt;/p&gt;

&lt;p&gt;Os testes não funcionais incluem avaliação de desempenho, compatibilidade, usabilidade, adequação, confiabilidade, segurança da informação, manutenibilidade e portabilidade. Esses testes verificam aspectos gerais da aplicação, independentemente das regras de negócio específicas, abrangendo desde o desempenho até a segurança e a usabilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 - Teste Não Funcional
&lt;/h2&gt;

&lt;p&gt;O teste caixa-branca é uma abordagem derivada de testes que se concentra na estrutura interna ou na implementação do sistema. Essa estrutura interna engloba elementos como código, arquitetura, fluxos de trabalho e fluxos de dados dentro do sistema.&lt;/p&gt;

&lt;p&gt;A eficácia dos testes caixa-branca é medida por meio da cobertura estrutural, que representa a extensão em que determinados elementos estruturais foram testados, expressa como uma porcentagem do tipo de elemento a ser coberto. No nível de teste de componente, a cobertura de código é avaliada com base na porcentagem do código do componente testado, podendo abranger aspectos específicos, como a porcentagem de instruções executáveis ou a porcentagem de resultados de decisões testados. No teste de integração de componentes, o foco pode ser na arquitetura do sistema, incluindo interfaces entre componentes.&lt;/p&gt;

&lt;p&gt;A modelagem e execução do teste caixa-branca podem demandar habilidades e conhecimentos especializados, como a compreensão da construção do código (por exemplo, o uso de ferramentas de cobertura de código), a avaliação do armazenamento de dados (como a análise de consultas de banco de dados) e a interpretação correta dos resultados de ferramentas de cobertura.&lt;/p&gt;

&lt;p&gt;Em resumo, o teste caixa-branca é uma abordagem que se baseia na estrutura interna do sistema, envolvendo o código, arquitetura e fluxos de dados, e sua eficácia é avaliada por meio da cobertura estrutural. Esse tipo de teste é também conhecido como caixa de vidro ou estrutural.&lt;/p&gt;

&lt;h2&gt;
  
  
  4 - Teste relacionado à mudança
&lt;/h2&gt;

&lt;p&gt;Quando ocorrem alterações em um sistema, seja para corrigir defeitos ou introduzir novas funcionalidades, é crucial realizar testes para garantir que as mudanças foram implementadas corretamente e não causaram efeitos colaterais indesejados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de Testes:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Teste de Regressão:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Detectar efeitos colaterais indesejados das alterações.&lt;/li&gt;
&lt;li&gt;Candidato à automação.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Teste de Confirmação (Reteste):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Objetivo: Confirmar se o defeito foi corrigido.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Abrangência dos Testes:
&lt;/h3&gt;

&lt;p&gt;Esses testes devem ser aplicados em todos os níveis de testes, independentemente do estágio do desenvolvimento do software. Em ciclos de desenvolvimento ágil, a frequência desses testes é aumentada para garantir uma validação contínua das alterações realizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Descrição Adicional:
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Teste de Confirmação&lt;/strong&gt; envolve a execução de testes após a correção de um defeito, utilizando todos os casos de teste que falharam devido ao defeito corrigido.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Teste de Regressão&lt;/strong&gt; consiste na execução de testes para detectar efeitos colaterais indesejados resultantes das alterações realizadas no sistema.&lt;/p&gt;

&lt;p&gt;Esses testes desempenham um papel crucial na manutenção da integridade do software durante seu ciclo de vida, assegurando que cada modificação contribua para uma melhoria contínua e não introduza novos problemas.&lt;/p&gt;




&lt;p&gt;Os tipos de testes apresentados neste artigo abrangem diferentes aspectos e requerem especificidades para cada contexto de aplicação. Embora não tenhamos abordado detalhadamente as ramificações e especificidades de cada tipo de teste neste artigo, pretendo explorá-las em futuras publicações.&lt;/p&gt;

&lt;p&gt;Nessas futuras discussões, poderemos examinar mais de perto as nuances dos testes e as diferentes abordagens comumente utilizadas em cada contexto específico. Isso inclui a exploração das ramificações de testes normalmente empregadas nos tipos de teste discutidos aqui.&lt;/p&gt;

&lt;p&gt;Por enquanto, agradeço pela leitura e espero que este artigo tenha proporcionado uma compreensão no entendimento de niveis e  tipos de testes.&lt;br&gt;
Se houver alguma dúvida ou sugestão, sinta-se à vontade para compartilhar.&lt;/p&gt;

&lt;p&gt;Muito obrigado!&lt;/p&gt;

</description>
      <category>teste</category>
      <category>qualidade</category>
      <category>qa</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Aprenda a implementar cucumber ao Cypress em testes automatizados</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Sat, 30 Dec 2023 23:30:55 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/aprenda-a-implementar-cucumber-ao-cypress-em-testes-automatizados-4e62</link>
      <guid>https://dev.to/yuri-aprendendoqa/aprenda-a-implementar-cucumber-ao-cypress-em-testes-automatizados-4e62</guid>
      <description>&lt;p&gt;Neste artigo, iremos explorar uma abordagem para implementar Cucumber com Cypress em projetos de automação de testes. Antes de iniciarmos, precisamos que se tenha instalado e configurado os seguites pré-requisitos&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após a instalação dos itens, Vamos confirmar que o Node foi configurado corretamente.&lt;br&gt;
Abra o terminal e execute os comandos &lt;code&gt;npm -v&lt;/code&gt; para verificar a versão do Node.js.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a versão for exibida corretamente, a configuração foi bem-sucedida.&lt;/p&gt;

&lt;p&gt;Agora, criaremos uma pasta para o projeto e abriremos-a no Visual Studio Code. Após isso No terminal( CTRL + SHIFT + ' ) do VS Code, execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso criará o arquivo &lt;code&gt;package.json&lt;/code&gt; na pasta. Em seguida, instalaremos o Cypress e o plugin do Cucumber:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cypress &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;cypress-cucumber-preprocessor &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a instalação, abra o Cypress para criar uma estrutura inicial do projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cypress open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Cypress, clique em "E2E Testing", escolha um navegador (por exemplo, Electron), crie um novo arquivo de especificação e execute o teste de exemplo, feito isso podemos fechar o cypress.&lt;/p&gt;

&lt;p&gt;Neste ponto, é fundamental entender a estrutura das pastas do projeto. Teremos duas pastas principais: &lt;code&gt;Cypress&lt;/code&gt; e &lt;code&gt;Node_Modules&lt;/code&gt;. Além disso, serão encontrados os seguintes arquivos essenciais: &lt;code&gt;Cypress.config.js&lt;/code&gt;, &lt;code&gt;package-lock.json&lt;/code&gt; e &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vAjAuM_R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yuridiego.tech/assets/img/blog/Esqueleto-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vAjAuM_R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yuridiego.tech/assets/img/blog/Esqueleto-1.png" alt="Estrutura de Pastas" width="258" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para iniciar a configuração do Cucumber, acessaremos o arquivo &lt;code&gt;Cypress.config.js&lt;/code&gt;, onde importaremos o plugin necessário. Na primeira linha do código, adicionaremos o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cucumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cypress-cucumber-preprocessor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, dentro deste mesmo arquivo, iremos adicionar a configuração do preprocessor dentro do &lt;code&gt;Module.exports&lt;/code&gt;. Dentro da função &lt;code&gt;setupNodeEvents&lt;/code&gt;, adicionaremos o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file:preprocessor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cucumber&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim, o código neste momento ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cucumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cypress-cucumber-preprocessor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cypress&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;e2e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setupNodeEvents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file:preprocessor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cucumber&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;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, dentro do bloco &lt;code&gt;e2e&lt;/code&gt;, adicionaremos a localização das features. Embora isso possa ser configurado conforme preferência, por padrão, manteremos as features dentro da própria pasta &lt;code&gt;e2e&lt;/code&gt;. A configuração será da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;specPattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cypress/e2e/step_definitions/*.feature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso indica que nossos arquivos &lt;code&gt;.feature&lt;/code&gt; estarão dentro da pasta &lt;code&gt;STEP_DEFINITIONS&lt;/code&gt; na pasta &lt;code&gt;e2e&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O arquivo final terá a seguinte aparência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cucumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cypress-cucumber-preprocessor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cypress&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;e2e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setupNodeEvents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file:preprocessor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cucumber&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;specPattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cypress/e2e/step_definitions/*.feature&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entretanto, neste momento, a pasta necessária ainda não foi criada no projeto. Dentro da pasta &lt;code&gt;e2e&lt;/code&gt;, encontraremos apenas o arquivo exemplo que criamos anteriormente ao abrir o Cypress. Portanto, podemos acessar a pasta &lt;code&gt;e2e&lt;/code&gt;, excluir o arquivo de exemplo (&lt;code&gt;spec.cy.js&lt;/code&gt;), e dentro desta mesma pasta, criar a pasta &lt;code&gt;step_definitions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Essa organização é crucial para estruturar o projeto de forma clara, eliminando arquivos desnecessários e preparando o terreno para a inclusão das definições de passos do Cucumber.&lt;/p&gt;

&lt;p&gt;Com a estrutura inicial ajustada, é hora de realizar as configurações necessárias no arquivo &lt;code&gt;package.json&lt;/code&gt;. Isso é crucial para garantir que o Cucumber e o Cypress funcionem harmoniosamente. Adicione a seguinte configuração dentro do bloco&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"cypress-cucumber-preprocessor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nonGlobalStepDefinitions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stepDefinitions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cypress/e2e/step_definitions"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicando cada parte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;nonGlobalStepDefinitions&lt;/code&gt;: Este é um comando padrão do plugin e é essencial para o seu correto funcionamento.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;"stepDefinitions": "cypress/e2e/step_definitions"&lt;/code&gt;: Aqui, especificamos o caminho para a pasta que contém as definições de etapas dos nossos testes. No exemplo, estamos definindo que nossos arquivos &lt;code&gt;.js&lt;/code&gt; de definição de etapas estão na própria pasta &lt;code&gt;step_definitions&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A estrutura final do seu arquivo &lt;code&gt;package.json&lt;/code&gt; pode se assemelhar a este exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"artigo1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ISC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cypress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^13.6.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cypress-cucumber-preprocessor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.3.1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cypress-cucumber-preprocessor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nonGlobalStepDefinitions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stepDefinitions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cypress/e2e/step_definitions"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas configurações são cruciais para garantir que o ambiente esteja devidamente preparado para a integração do Cucumber com o Cypress, e que as definições de etapas estejam devidamente reconhecidas.&lt;/p&gt;

&lt;p&gt;Neste ponto, todas as configurações essenciais foram realizadas para criar um ambiente de trabalho alinhado com o escopo do projeto. É importante destacar que seguimos uma abordagem específica para organizar nossos arquivos.&lt;/p&gt;

&lt;p&gt;Na raiz da pasta &lt;code&gt;STEP_DEFINITIONS&lt;/code&gt;, a prática será deixar nossos arquivos &lt;code&gt;.feature&lt;/code&gt;. Mas a organização não para por aí. Dentro da pasta &lt;code&gt;STEP_DEFINITIONS&lt;/code&gt;, criaremos uma pasta para cada feature. Isso significa que na raiz teremos o arquivo &lt;code&gt;.feature&lt;/code&gt; correspondente, e dentro da pasta, teremos outros elementos relacionados a essa feature.&lt;/p&gt;

&lt;p&gt;Este método de organização facilita a manutenção e compreensão do projeto, tornando a estrutura mais intuitiva. Afinal, um arquivo &lt;code&gt;.feature&lt;/code&gt; na raiz representa a feature em si, enquanto a pasta com o nome da feature contém elementos adicionais relacionados a ela.&lt;/p&gt;

&lt;p&gt;Essa abordagem flexível e intuitiva proporciona uma experiência mais clara e eficiente ao trabalhar com os testes e cenários definidos no projeto.&lt;/p&gt;

&lt;p&gt;o nosso exemplo, o escopo do projeto se apresenta conforme a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R59wpwvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yuridiego.tech/assets/img/blog/Esqueleto-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R59wpwvm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yuridiego.tech/assets/img/blog/Esqueleto-2.png" alt="Escopo do Projeto" width="484" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vale ressaltar que este tutorial não visa aprofundar-se no ensino detalhado das ferramentas, mas sim orientar sobre como implementar o Cucumber com Cypress. Inicialmente, abordaremos a utilização prática dessas ferramentas, proporcionando um entendimento gradual.&lt;/p&gt;

&lt;p&gt;Vamos começar criando, na raiz da pasta &lt;code&gt;step_definitions&lt;/code&gt;, o arquivo &lt;code&gt;.feature&lt;/code&gt; para nosso projeto, nomeando-o como &lt;code&gt;form.feature&lt;/code&gt;. A seguir, apresentarei um exemplo prático, delineando os passos do BDD (Behavior-Driven Development):&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;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Form

&lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Valid Form
&lt;span class="nf"&gt;Given &lt;/span&gt;que o site seja acessado
&lt;span class="nf"&gt;When &lt;/span&gt;preencher o formulário
&lt;span class="nf"&gt;Then &lt;/span&gt;Valido o acesso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este cenário fictício representa a interação com um formulário em um site. Durante a execução dos testes, cada passo (&lt;code&gt;Given&lt;/code&gt;, &lt;code&gt;When&lt;/code&gt;, &lt;code&gt;Then&lt;/code&gt;) será associado a ações específicas no código de automação.&lt;/p&gt;

&lt;p&gt;O intuito é proporcionar uma visão inicial do funcionamento do BDD/Cucumber no projeto, partindo de um exemplo simples.&lt;/p&gt;

&lt;p&gt;Após criar e configurar o arquivo &lt;code&gt;.feature&lt;/code&gt;, avançaremos para a criação da estrutura de funções. Dentro da pasta &lt;code&gt;step_definitions&lt;/code&gt;, criaremos uma subpasta chamada &lt;code&gt;form&lt;/code&gt;. Dentro dessa subpasta, será criado o arquivo &lt;code&gt;form.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para cada feature testada, será necessário implementar/importar os códigos dos passos do Cucumber, como &lt;code&gt;Given&lt;/code&gt;, &lt;code&gt;When&lt;/code&gt;, &lt;code&gt;Then&lt;/code&gt;. Portanto, adicionaremos o seguinte código nos arquivos &lt;code&gt;.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Given&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;When&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Then&lt;/span&gt; &lt;span class="p"&gt;}&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;cypress-cucumber-preprocessor/steps&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este trecho de código localiza o caminho configurado no &lt;code&gt;cypress.config.js&lt;/code&gt;, acessando o diretório &lt;code&gt;steps&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O arquivo &lt;code&gt;.js&lt;/code&gt; ficará da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Given&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;When&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Then&lt;/span&gt; &lt;span class="p"&gt;}&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;cypress-cucumber-preprocessor/steps&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;que o site seja acessado&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://vinothqaacademy.com/demo-site/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&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="s1"&gt;Demo Site – Registration Form – Vinoth Q.A Academy&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="nc"&gt;When&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;preencher o formulario&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#vfb-5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Yuri&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#vfb-7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lima&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#vfb-31-1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#vfb-14&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;teste@teste.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#vfb-3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;99&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#vfb-4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nc"&gt;Then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Valido acesso&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&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="s1"&gt;Demo Site – Dynamic Transaction – Vinoth Q.A Academy&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, utilizamos &lt;code&gt;Given&lt;/code&gt;, &lt;code&gt;When&lt;/code&gt; e &lt;code&gt;Then&lt;/code&gt; em vez do habitual &lt;code&gt;it&lt;/code&gt; do Cypress, construindo assim nosso ambiente conforme necessário. No exemplo, o passo &lt;code&gt;Given&lt;/code&gt; valida o acesso ao site, onde é visitado e confirmado pelo título. O passo &lt;code&gt;When&lt;/code&gt; realiza o preenchimento do formulário, e, por fim, o passo &lt;code&gt;Then&lt;/code&gt; valida a página seguinte, para onde é redirecionado após o envio do formulário.&lt;/p&gt;

&lt;p&gt;Essa abordagem básica exemplifica o comportamento do BDD/Cucumber no projeto, destacando a naturalidade da linguagem de especificação.&lt;/p&gt;

&lt;p&gt;Ressalta-se a necessidade do entendimento do BDD e Cucumber, onde a nomenclatura inicial após abrir a função (Given, When, Then) deve ser exatamente a mesma definida no arquivo &lt;code&gt;.feature&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No nosso exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nc"&gt;Given&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;que o site seja acessado&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://vinothqaacademy.com/demo-site/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;should&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eq&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="s1"&gt;Demo Site – Registration Form – Vinoth Q.A Academy&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A frase "que o site seja acessado" deve ser estritamente idêntica à linha "Given que o site seja acessado" contida no arquivo &lt;code&gt;.feature&lt;/code&gt;. Qualquer divergência nesses pontos resultará na falha da execução do teste.&lt;/p&gt;

&lt;p&gt;Na imagem a seguir, podemos visualizar a execução do teste.&lt;/p&gt;

&lt;p&gt;Espero que tenham apreciado o conteúdo e que seja produtivo para vocês. Para qualquer assistência adicional, estou à disposição.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UzVGxvXZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yuridiego.tech/assets/img/blog/Teste-Example.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UzVGxvXZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yuridiego.tech/assets/img/blog/Teste-Example.png" alt="Teste Executado" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lyvxDhqD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://yuridiego.tech/assets/img/blog/form-feature.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lyvxDhqD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://yuridiego.tech/assets/img/blog/form-feature.gif" alt="Gif do Teste em Ação" width="622" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado!&lt;/p&gt;

</description>
      <category>cypress</category>
      <category>cucumber</category>
      <category>testes</category>
      <category>automation</category>
    </item>
    <item>
      <title>Simplificando Testes: Por que Talvez Você Não Precise de Cucumber e Page Object ao testar usando Cypress</title>
      <dc:creator>Diego Yuri</dc:creator>
      <pubDate>Mon, 18 Dec 2023 16:43:32 +0000</pubDate>
      <link>https://dev.to/yuri-aprendendoqa/simplificando-testes-por-que-talvez-voce-nao-precise-de-cucumber-e-page-object-ao-testar-usando-cypress-527m</link>
      <guid>https://dev.to/yuri-aprendendoqa/simplificando-testes-por-que-talvez-voce-nao-precise-de-cucumber-e-page-object-ao-testar-usando-cypress-527m</guid>
      <description>&lt;h1&gt;
  
  
  Explorando a relação entre Cypress, Cucumber (BDD) e PageObject
&lt;/h1&gt;

&lt;p&gt;Olá! Eu sou o Yuri.&lt;/p&gt;

&lt;p&gt;Hoje vamos discutir a interação entre Cypress, Cucumber (BDD) e PageObject no contexto de testes automatizados. Recentemente, tenho dedicado tempo para aprimorar meus conhecimentos em testes automatizados, especialmente no que diz respeito ao Cypress. Durante a formação que participei esse ano (FormaNT), adquiri uma base de conhecimento em Selenium, Cucumber e BDD. Inclusive, compartilhei essas experiências em um vídeo no meu canal, onde apresento um escopo de projeto relacionado a Cucumber: &lt;a href="https://www.youtube.com/watch?v=5At_YphI_-Y"&gt;TDD e BDD: Como esses conceitos se relacionam com Testes de Software&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ao explorar o Cypress, notei uma conexão direta entre Cypress e Selenium, uma ferramenta que já conhecia e havia utilizado com o Cucumber. Paralelamente, percebi que muitos dos conteudos de aprendizado que encontrei relacionado ao Cypress também enfatizavam e traziam o conceito de PageObject.&lt;/p&gt;

&lt;p&gt;Enquanto buscava integrar o Cucumber ao Cypress, percebi que, embora o Cypress facilite muitas coisas, a introdução do PageObject tornava a implementação mais complexa. Isso me fez questionar a utilidade do PageObject em projetos que poderiam ser mais eficientes sem ele.&lt;/p&gt;

&lt;p&gt;Durante essa jornada, Busquei conteudos que comentavam esse ponto que observei, e acabei encontrando uma live muito interessante, que me ajudou a contextualizar esse ponto. Você pode assisti-la aqui: &lt;a href="https://www.youtube.com/watch?v=VYG-gzA1ahY"&gt;Por que QAs usam Page Objects com Cypress?&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com todo conhecimento adiquirido nessas pesquisas, cheguei a alguns entendimentos, e que gostaria de compartilha-los para que possamos refletir nos nossos conceitos de qualidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Cucumber com Cypress: É a combinação ideal?
&lt;/h2&gt;

&lt;p&gt;Desde o início dos meus estudos com Cypress, considerei a implementação do Cucumber, pois o vejo como um excelente framework. No entanto, ao estudar o Cypress por si só, percebi que a utilização do Cucumber poderia ser redundante, uma vez que a estrutura do Cypress já permite uma diversificação eficiente dos cenários e contextos de teste. A integração do Cucumber dependerá do projeto e da importância dos passos definidos.&lt;/p&gt;

&lt;p&gt;Em breve, vou compartilhar um vídeo demonstrando como integrar o Cucumber com o Cypress. No entanto, é fundamental avaliar se a utilização do Cucumber é realmente necessária, considerando as capacidades nativas do Cypress.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Utilização de PageObject
&lt;/h2&gt;

&lt;p&gt;A utilização do PageObject, especialmente no contexto do Cypress, pode introduzir complexidade desnecessária. A própria ferramenta oferece funcionalidades, como Commands, que permitem a criação de funções chamadas apenas nos testes principais e podem ser reutilizadas conforme necessário. Em projetos extensos, é possível segmentar os Commands para áreas específicas, como Login ou Cadastro, seguindo o conceito de "Função-Teste" no ambiente Cypress.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Aprofundando o conhecimento: Application Actions
&lt;/h2&gt;

&lt;p&gt;O blog do Cypress apresenta um artigo relevante sobre a relação &lt;br&gt;
entre PageObject e uma abordagem baseada em Application Actions. Essa reflexão visa aprofundar o entendimento sobre as diferentes abordagens e incentivar uma revisão da forma como aplicamos esses conceitos. Ambas as abordagens são válidas, e a escolha entre usar ou não o PageObject deve ser orientada pelas necessidades específicas do projeto. &lt;br&gt;
Compreender os conceitos da ferramenta, assim como a melhor forma de implementar, pode nos levar a um caminho no qual podemos decidir a utilização ou não tanto dos Application Actions quanto dos pageObjects &lt;br&gt;
Voces podem ver o artigo para uma compreensão melhor a seguir &lt;a href="https://www.cypress.io/blog/2019/01/03/stop-using-page-objects-and-start-using-app-actions"&gt;Application Actions: Use Them Instead of Page Objects&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essas reflexões visam aprimorar nossos conceitos de qualidade e proporcionar uma visão mais clara sobre a implementação eficiente de testes automatizados. Fique atento para futuras discussões e compartilhamento de conhecimento!&lt;/p&gt;

</description>
      <category>cypress</category>
      <category>cucumber</category>
      <category>qa</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
