<?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: Nathally Souza</title>
    <description>The latest articles on DEV Community by Nathally Souza (@nathsouzadev).</description>
    <link>https://dev.to/nathsouzadev</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%2F980080%2Fc5dd164c-d139-40dc-b27e-b5cf8d34aa8f.jpeg</url>
      <title>DEV Community: Nathally Souza</title>
      <link>https://dev.to/nathsouzadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nathsouzadev"/>
    <language>en</language>
    <item>
      <title>Utilizando o Docker para potencializar Github Actions</title>
      <dc:creator>Nathally Souza</dc:creator>
      <pubDate>Wed, 01 Mar 2023 12:42:53 +0000</pubDate>
      <link>https://dev.to/nathsouzadev/utilizando-o-docker-para-potencializar-github-actions-2c7c</link>
      <guid>https://dev.to/nathsouzadev/utilizando-o-docker-para-potencializar-github-actions-2c7c</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/nathsouzadev/usando-o-github-como-pipeline-556l"&gt;PARTE 1 Construindo uma pipeline com o Github Actions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anteriormente mostrei como podemos construir uma pipeline com Github Actions e até compartilhei uma simplificada para demonstrar o funcionamento. Agora vamos aprofundar um pouco mais e entender como podemos rodar uma instância do Docker com as actions para aumentar a cobertura dos nossos testes.&lt;/p&gt;

&lt;p&gt;Antes de entender a implementação, vale a pergunta: porque ter um container nas actions? Não vou aprofundar sobre o uso de container, mas nesse caso, ele permite que implementamos um banco local, que será o nosso database para rodar os nossos testes integrados ou e2e, sem a necessidade de conexão com um banco remoto, além de podermos utilizar filas locais, como o RabbitMQ ou Kafka, por exemplo. Somente nesse ponto, já ganhamos performance para a execução dos nossos testes.&lt;/p&gt;

&lt;p&gt;Agora podemos partir para a implementação. Primeiro precisamos criar um arquivo docker-compose.yml, que será onde colocaremos as instruções para montar nossa imagem. No nosso exemplo utilizaremos o Postgres como banco de dados. Para isso, no nosso arquivo, especificamos qual imagem iremos utilizar e já configuramos as variáveis de ambiente, como nome de usuário e senha para acesso ao banco.&lt;/p&gt;

&lt;p&gt;Ainda na configuração do docker, finalizamos especificando o nome de uma rede local para utilizarmos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;version: &lt;span class="s2"&gt;"3.6"&lt;/span&gt;

services:
  postgres:
    image: postgres:11.7-alpine
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: admin
      POSTGRES_PASSWORD: password
networks:
  default:
    external:
      name: my-network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito essa configuração passamos ao nosso workflow para inserir as novas configurações na execução dos testes. Para isso, precisamos de três comandos do docker.&lt;/p&gt;

&lt;p&gt;Essa sequência irá criar a rede local para a execução da nossa instância, posteriormente buildar nossa imagem do docker e por fim apenas exibir os dados da rede que está disponível. Pronto, dessa forma temos uma instância com banco de dados pronta para ser utilizada por nossa aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    - name: Creating network
      run: docker network create &lt;span class="s2"&gt;"microservice-network"&lt;/span&gt;

    - name: Build docker-composer
      run: docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

    - name: Check running container
      run: docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso necessário, você pode executar migrations com dados de testes e povoar o banco com as informações para executar os seus testes e rodá-los em sua pipeline. Dessa forma, em menos de 5 minutos, temos um container pronto para nossa pipeline.&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Construindo uma pipeline com o Github Actions</title>
      <dc:creator>Nathally Souza</dc:creator>
      <pubDate>Mon, 13 Feb 2023 18:22:54 +0000</pubDate>
      <link>https://dev.to/nathsouzadev/usando-o-github-como-pipeline-556l</link>
      <guid>https://dev.to/nathsouzadev/usando-o-github-como-pipeline-556l</guid>
      <description>&lt;p&gt;Que o Github é uma plataforma extremamente útil, todas nós sabemos, mas dentre uma de suas funcionalidades uma das que mais me fascina é o Github Actions. Com as Actions nós podemos construir uma pipeline para nossas aplicações desde as mais simples, até se precisarmos de uma complexidade maior com banco de dados.&lt;/p&gt;

&lt;p&gt;Antes de mergulharmos nesse processo, é necessário entender o que é uma pipeline. Dentro do universo de desenvolvimento, uma pipeline é onde podemos visualizar as validações antes de entregar nossa aplicação em produção. É nessa etapa onde rodamos nossos testes automatizados para garantir que as alterações, que estão sendo enviadas para produção, não irão gerar nenhum erro.&lt;/p&gt;

&lt;p&gt;Com este primeiro conceito, agora entra uma segunda etapa, uma pipeline bem configurada, permitindo que tenhamos um ambiente de stage, ou homologação, e o nosso ambiente de produção. A ideia é que no ambiente de stage sejam feitos testes manuais antes de enviar todas as mudanças para produção.&lt;/p&gt;

&lt;p&gt;Quando qualquer erro é encontrado, a pipeline impede o deploy para qualquer um dos ambientes e é necessário que realizemos as correções antes do deploy. No exemplo abaixo temos o caso de uma pipeline que teve falha em uma das verificações dos testes unitários e bloqueou a mudança em stage.&lt;/p&gt;

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

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

&lt;p&gt;No caso do exemplo exibido, é necessário fazer a correção na mensagem retornada para que as validações sejam feitas e o deploy possa seguir em cada um dos ambientes. Se tudo der certo, a aplicação será disponibilizada em todos os ambientes após os testes automatizados.&lt;/p&gt;

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

&lt;p&gt;Neste cenário, temos a situação em que todas as validações passaram e conseguimos disponibilizar nossa aplicação no ambiente final. Depois desses conceitos, como podemos realizar todo esse processo usando o Github Actions?&lt;/p&gt;

&lt;p&gt;No nosso exemplo temos uma aplicação simples com Nest, então usaremos as definições fornecidas pelo Github para aplicações com Node.&lt;/p&gt;

&lt;p&gt;Na raiz do nosso projeto, criamos uma pasta .github, dentro dela um repositório workflow, onde colocaremos nosso &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frne20vqyefbirix80iin.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frne20vqyefbirix80iin.jpg" alt="Image description" width="800" height="146"&gt;&lt;/a&gt;arquivo main.yml. É este arquivo yaml que será o responsável por definir quais são as etapas que serão percorridas em nossa pipeline.&lt;/p&gt;

&lt;p&gt;No nosso exemplo o nosso arquivo yaml está da seguinte forma&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;name: Development

on:
  push:
    branches:
      - main
      - stage
  pull_request:
    branches:
      - main
      - stage

&lt;span class="nb"&gt;env&lt;/span&gt;:
  PORT: 5000

&lt;span class="nb"&gt;jobs&lt;/span&gt;:
  &lt;span class="nb"&gt;test&lt;/span&gt;:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;16.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      uses: actions/setup-node@v3
      with:
        node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    - name: Install dependencies
      run: yarn &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;

    - name: Run unit tests
      run: yarn &lt;span class="nb"&gt;test

  &lt;/span&gt;e2e:
    &lt;span class="k"&gt;if&lt;/span&gt;: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ always() &amp;amp;&amp;amp; contains(join(needs.*.result, &lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;), &lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt;&lt;span class="p"&gt;) &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
    needs: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;16.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      uses: actions/setup-node@v3
      with:
        node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    - name: Install dependencies
      run: yarn &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;

    - name: Running e2e tests
      run: yarn &lt;span class="nb"&gt;test&lt;/span&gt;:e2e

  stage:
    &lt;span class="k"&gt;if&lt;/span&gt;: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ always() &amp;amp;&amp;amp; contains(join(needs.*.result, &lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;), &lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt;&lt;span class="p"&gt;) &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
    needs: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;, e2e]
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;16.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      uses: actions/setup-node@v3
      with:
        node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    - name: Install dependencies
      run: yarn &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;

  deploy:
    &lt;span class="k"&gt;if&lt;/span&gt;: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ always() &amp;amp;&amp;amp; contains(join(needs.*.result, &lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;), &lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt;&lt;span class="p"&gt;) &amp;amp;&amp;amp; github.ref == &lt;/span&gt;&lt;span class="s1"&gt;'refs/heads/main'&lt;/span&gt;&lt;span class="p"&gt; &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
    needs: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;, e2e, stage]
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;16.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      uses: actions/setup-node@v3
      with:
        node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    - name: Install dependencies
      run: yarn &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como usamos um arquivo yaml, precisamos nos atentar à indentação, que é uma das bases dessa linguagem. Feita essa observação, note que temos três conjuntos principais de instruções: on, env e jobs. Destas três, apenas on e jobs são obrigatórias, a env usamos apenas as nossas validações precisam de uma variável de ambiente. No nosso caso, definimos apenas uma porta para a aplicação rodar localmente durante o deploy.&lt;/p&gt;

&lt;p&gt;O on é utilizado para definir quais serão os gatilhos da nossa pipeline, ou seja, quando executaremos essas verificações. No nosso caso definimos que sempre quando realizarmos um push ou pull requests nas branchs main e stage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;on:
  push:
    branches:
      - main
      - stage
  pull_request:
    branches:
      - main
      - stage

&lt;span class="nb"&gt;env&lt;/span&gt;:
  PORT: 5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vem a parte funcional da nossa pipeline. Dentro do jobs, definimos quais serão as ações executadas durante cada um dos processos. No nosso exemplo possuímos os dois primeiros jobs test e e2e, que estão configurados para rodar os testes automatizados.&lt;/p&gt;

&lt;p&gt;Neste caso, antes de executar de fato cada etapa, definimos no runs-on e na strategy as configurações necessárias da nossa aplicação. No nosso caso, temos explicito que vamos usar um setup do Ubuntu lts e na sequência o Node na versão 16. Este ponto é específico de cada linguagem e necessita de consulta à documentação para saber qual a configuração ideal para sua aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;jobs&lt;/span&gt;:
  &lt;span class="nb"&gt;test&lt;/span&gt;:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;16.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      uses: actions/setup-node@v3
      with:
        node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    - name: Install dependencies
      run: yarn &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;

    - name: Run unit tests
      run: yarn &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ainda dentro dos jobs o segredo para impedir a execução da pipeline em caso de erro está no nosso if, que aparece a partir do e2e. Nesse caso, pedimos que sempre os testes tenham sucesso para somente após isso executar o próximo passo. Sem esse if, mesmo que ocorra um erro na etapa anterior, a pipeline seguirá todo o fluxo até produção, que não é nossa ideia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stage:
    &lt;span class="k"&gt;if&lt;/span&gt;: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ always() &amp;amp;&amp;amp; contains(join(needs.*.result, &lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;), &lt;/span&gt;&lt;span class="s1"&gt;'success'&lt;/span&gt;&lt;span class="p"&gt;) &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
    needs: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;, e2e]
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: &lt;span class="o"&gt;[&lt;/span&gt;16.x]

    steps:
    - uses: actions/checkout@v3

    - name: Use Node.js &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
      uses: actions/setup-node@v3
      with:
        node-version: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ matrix.node-version &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

    - name: Install dependencies
      run: yarn &lt;span class="nt"&gt;--frozen-lockfile&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, nos dois jobs finais, em stage e deploy, é quando realizamos a entrega da nossa aplicação em cada um dos ambientes. Nesse caso, usamos uma branch diferente para construir cada um desses ambientes.&lt;/p&gt;

&lt;p&gt;Dentro desses jobs informamos os comandos para realizar o deploy da aplicação e é onde podemos integrar com outros serviços. Esse ponto é um assunto para outro momento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.tourl"&gt;https://github.com/nathyts/products-api&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Qualidade, testes e desenvolvimento</title>
      <dc:creator>Nathally Souza</dc:creator>
      <pubDate>Sun, 04 Dec 2022 12:31:17 +0000</pubDate>
      <link>https://dev.to/nathsouzadev/qualidade-testes-e-desenvolvimento-4ol1</link>
      <guid>https://dev.to/nathsouzadev/qualidade-testes-e-desenvolvimento-4ol1</guid>
      <description>&lt;p&gt;Na maioria das vezes, quando falamos em qualidade no desenvolvimento de software, ou citamos a pessoa QA, pensamos em alguém que tem única e exclusivamente o papel de mapear os cenários de testes, testar nossa aplicação e encontrar bugs que eventualmente acontecem após a entrega do código.&lt;/p&gt;

&lt;p&gt;A questão é que pensar em qualidade e testes não tem que ser uma função de uma única pessoa, deve ser algo comum a todos do time. Qualidade é uma cultura a ser construída dentro das equipes.&lt;/p&gt;

&lt;p&gt;Nas experiências que já tive, entendo que pensar na qualidade vem desde a primeira discussão de uma ideia. Onde isso tem impacto, quais são os cenários desejáveis, o que não queremos que aconteça são algumas das perguntas que tem que ser feitas ainda nesse momento para podermos elaborar os cenários de testes.&lt;/p&gt;

&lt;p&gt;Aqui um adendo: caso o time tenha a presença de uma pessoa QA, entendo que ela tem que participar desde esse primeiro momento junto com a tech lead. Caso o time não tenha uma pessoa QA, no meu entendimento, a tech lead, tem que conseguir mapear esses cenários. Uma vez que entendo que QA é cultura, no cenário ideal, todas no time devem ter capacidade para mapear estes cenários, porém a realidade não é o meu cenário ideal.&lt;/p&gt;

&lt;p&gt;Porque eu penso que todas no time tem que ter essa mentalidade? Uma vez que garantimos que todas as desenvolvedoras conseguem pensar na qualidade do código, nos cenários corretos e errados, essas pessoas também conseguirão escrever testes, unitários, e2e e funcionais mais eficazes, aumentando a segurança no momento do deploy, diminuindo o risco de bug em produção e a velocidade de resposta para eventuais correções ou implementações.&lt;/p&gt;

&lt;p&gt;Por fim, sempre lembrando que não vivemos no cenário que eu julgo ideal, o time de negócios também precisa ter esse olhar de qualidade. É importante que as histórias tenham escopo bem definido e critérios de aceite objetivos. Esses critérios de aceite podem ser exatamente os cenários de testes que esperamos de uma funcionalidade.&lt;/p&gt;

&lt;p&gt;Qualidade é cultura e deve ser papel de todos no time, pensar na qualidade do código e da entrega para o usuário final. Essa obrigação não é apenas da QA.&lt;/p&gt;

</description>
      <category>design</category>
      <category>graphics</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
