<p><strong>Meta Description:</strong> Entenda como QA se integra às metodologias ágeis: Scrum, Kanban e XP. Aprenda a aplicar práticas de qualidade em equipes ágeis.</p>

<hr>
<h2>QA em Scrum</h2>

<h3>Cerimônias e QA</h3>

<h4>Sprint Planning</h4>
<pre><code># Sprint Planning - Input de QA

<h2>Antes da Planning</h2>
<ul><li>[ ] Backlog priorizado pelo PO</li><ol><li>[ ] User stories com critérios de aceitação</li>
<li>[ ] Histórias técnicas identificadas</li>
</ol>
<h2>Durante Planning</h2>
<h3>Para cada história</h3><ol><li>PO apresenta requirements</li>
<li>Devs estimam esforço</li>
<li>QA identifica:</li>
</ol>  - Riscos de teste
  - Dados necessários
  - Dependências
  - Complexidade de automação<ol><li>timebox: ~1 hora por sprint</li>
</ol>
<h2>Output</h2><ol><li>[ ] Sprint backlog definido</li>
<li>[ ] Definition of Done clara</li>
<li>[ ] Dívidas técnicas identificadas</li>
</ol></code></pre>

<h4>Daily Standup</h4>
<pre><code># Daily Standup - QA Updates

<h2>Formato: 3 perguntas</h2>

<h3>O que fiz ontem para ajudar o time?</h3><ol><li>"Finalizei testes da história #123"</li>
<li>"Revisei PR do João"</li>
</ol>
<h3>O que farei hoje?</h3><ol><li>"Vou testar história #124"</li>
<li>"Vou automatizar teste de login"</li>
</ol>
<h3>Há algum impedimento?</h3><ol><li>"Aguardando ambiente de staging"</li>
<li>"Preciso de acesso ao banco de produção"</li>
</ol>
<h2>Tips para QA</h2><ol><li>Mantenha updates curtos (~30 segundos)</li>
<li>Identifique bloqueios rápido</li>
<li>Ajude devs com code review</li>
<li>Coordene com outros QAers</li>
</ol></code></pre>

<h4>Sprint Review</h4>
<pre><code># Sprint Review - Testing Handoff

<h2>Demo Checklist</h2><ol><li>[ ] Funcionalidades demonstradas</li>
<li>[ ] Critérios de aceitação cumpridos</li>
<li>[ ] Testes executados</li>
<li>[ ] Bugs documentados</li>
</ol>
<h2>Demo Format</h2><ol><li>"O que foi feito?"</li>
<li>"Como funciona?"</li>
<li>"O que não foi feito?" (e por quê)</li>
<li>"Próximos passos"</li>
</ol>
<h2>Feedback de QA</h2><ol><li>Qualidade geral</li>
<li>Issues encontrados</li>
<li>Recomendações</li>
</ol></code></pre>

<h4>Sprint Retrospective</h4>
<pre><code># Sprint Retrospective - QA Focus

<h2>Start (O que começar a fazer?)</h2><ol><li>"Começar a fazer BDD com time"</li>
<li>"Começar a documentar testes"</li>
</ol>
<h2>Stop (O que parar de fazer?)</h2><ol><li>"Parar de fazer testes manuais em features pequenas"</li>
<li>"Parar de aceitar histórias sem critérios de aceitação"</li>
</ol>
<h2>Continue (O que continuar fazendo?)</h2><ol><li>"Continuar pair testing"</li>
<li>"Continuar code reviews"</li>
</ol>
<h2>Ações para Próximo Sprint</h2><ol><li>[ ] Ação 1 - Responsável: João</li>
<li>[ ] Ação 2 - Responsável: Maria</li>
</ol></code></pre>

<h3>Definition of Done (DoD)</h3>

<pre><code># Definition of Done - Checklist

<p>Para uma história ser considerada "Done":</p>

<h2>Código</h2><ol><li>[ ] Código implementado</li>
<li>[ ] Code review aprovado</li>
<li>[ ] Branch merged to main</li>
<li>[ ] Sem warnings de linter</li>
</ol>
<h2>Testes</h2><ol><li>[ ] Unit tests escritos (&gt; 80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} coverage)</li>
<li>[ ] Testes de integração passando</li>
<li>[ ] Testes funcionais passando</li>
<li>[ ] Testes de performance (se aplicável)</li>
<li>[ ] Accessibility testes (se aplicável)</li>
</ol>
<h2>Qualidade</h2><ol><li>[ ] Segurança revisada</li>
<li>[ ] Performance considerada</li>
<li>[ ] Responsivo (se web/mobile)</li>
<li>[ ] Logs implementados</li>
</ol>
<h2>Documentação</h2><ol><li>[ ] README atualizado</li>
<li>[ ] API docs (se aplicável)</li>
<li>[ ] Swagger/OpenAPI atualizado</li>
</ol>
<h2>Deploy</h2><ol><li>[ ] Deploy em staging</li>
<li>[ ] Smoke tests passando</li>
<li>[ ] Ready for production</li>
</ol></code></pre>

<hr>
<h2>QA em Kanban</h2>

<h3>Quadro Kanban</h3>

<pre><code>┌──────────┬──────────┬──────────┬──────────┬──────────┐
│  BACKLOG │  READY   │ IN DEV   │  TEST    │   DONE   │
├──────────┼──────────┼──────────┼──────────┼──────────┤
│  Story 5 │ Story 1  │ Story 2  │ Story 3  │ Story 4  │
│  Story 6 │          │          │          │ Story 7  │
│  Story 8 │          │          │          │          │
└──────────┴──────────┴──────────┴──────────┴──────────┘
    ∞            5           3          3           ∞
</code></pre>

<h3>WIP Limits</h3>

<figure class="wp-block-table"><table>
<tr><th>Column</th><th>WIP Limit</th><th>Reason</th></tr>
<tr><td>Ready</td><td>5</td><td>Capacidade do time</td></tr>
<tr><td>In Dev</td><td>3</td><td>Focus por developer</td></tr>
<tr><td>Test</td><td>3</td><td>Capacidade QA</td></tr>
<tr><td>Review</td><td>2</td><td>Bottlenecks visíveis</td></tr>
</table></figure>

<h3>Métricas Kanban</h3>

<pre><code># Lead Time e Cycle Time
import datetime

<p>def calculate_metrics():<br>    tickets = [<br>        {<br>            "id": "PROD-123",<br>            "created": "2024-01-01",<br>            "ready": "2024-01-03",<br>            "dev_start": "2024-01-05",<br>            "dev_done": "2024-01-08",<br>            "test_start": "2024-01-09",<br>            "test_done": "2024-01-10",<br>            "done": "2024-01-10",<br>        }<br>    ]</p>

<p>for ticket in tickets:<br>        created = datetime.datetime.strptime(ticket["created"], "{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d")<br>        done = datetime.datetime.strptime(ticket["done"], "{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d")</p>

<p>lead_time = (done - created).days<br>        cycle_time = (done - datetime.datetime.strptime(<br>            ticket["dev_start"], "{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}Y-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}m-{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}d"<br>        )).days</p>

<p>print(f"{ticket['id']}: Lead={lead_time}d, Cycle={cycle_time}d")</p>

<p># Throughput<br>def throughput(team_tickets):<br>    completed_last_30d = sum(<br>        1 for t in team_tickets <br>        if is_done_recently(t, 30)<br>    )<br>    return completed_last_30d<br></code></pre></p>

<h3>Classes of Service</h3>

<figure class="wp-block-table"><table>
<tr><th>Class</th><th>Priority</th><th>WIP</th><th>Lead Time Target</th></tr>
<tr><td>Expedite</td><td>Crítica</td><td>1</td><td>&lt; 1 dia</td></tr>
<tr><td>Fixed Date</td><td>Alta</td><td>2</td><td>Na data</td></tr>
<tr><td>Standard</td><td>Normal</td><td>∞</td><td>&lt; 5 dias</td></tr>
<tr><td>Intangible</td><td>Baixa</td><td>∞</td><td>Quando possível</td></tr>
</table></figure>

<hr>
<h2>XP (Extreme Programming) e QA</h2>

<h3>Práticas XP</h3>

<h4>Pair Programming</h4>

<pre><code># Pair Programming Roles

<h2>Driver</h2><ol><li>Escreve o código</li>
<li>Focado na implementação</li>
<li>Compartilha tela</li>
</ol>
<h2>Navigator</h2><ol><li>Revisa código em tempo real</li>
<li>Pensa estrategicamente</li>
<li>Busca melhorias</li>
<li>Agenda refatoração</li>
</ol>
<h2>Dicas</h2><ol><li>Troque papéis a cada 30-60 minutos</li>
<li>Mantenha comunicação aberta</li>
<li>Ambos são responsáveis pela qualidade</li>
</ol>
<h2>Benefícios</h2><ol><li>15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} mais lento, mas 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} menos bugs</li>
<li>Transferência de conhecimento</li>
<li>Catches bugs em tempo real</li>
</ol></code></pre>

<h4>TDD em XP</h4>

<pre><code># Ciclo TDD em XP
# Red -&gt; Green -&gt; Refactor (em pares!)

<p># 1. RED: Escrever teste que falha<br>def test_calcular_imposto():<br>    resultado = calcular_imposto(100, 0.1)<br>    assert resultado == 10</p>

<p># 2. GREEN: Fazer passar (mínimo)<br>def calcular_imposto(valor, taxa):<br>    return 10  # Hardcoded</p>

<p># 3. REFACTOR: Melhorar (em par)<br>def calcular_imposto(valor, taxa):<br>    return valor * taxa<br></code></pre></p>

<h4>Continuous Integration</h4>

<pre><code># CI Pipeline XP Style
name: XP CI

<p>on: [push, pull_request]</p>

<p>jobs:<br>  test:<br>    runs-on: ubuntu-latest<br>    steps:<br>      - uses: actions/checkout@v4</p>

<p># 1. Commit pequeno<br>      # 2. Build e test<br>      - run: pip install pytest pytest-cov</p>

<p># 3. Todos testes passando<br>      - run: pytest -v --cov=src --cov-fail-under=80</p>

<p># 4. Integrar frequentemente<br>      - name: Merge if green<br>        if: github.ref == 'main'<br>        run: echo "Ready to merge"<br></code></pre></p>

<hr>
<h2>Métricas Ágeis de QA</h2>

<h3>Defect Metrics</h3>

<pre><code># Defect Metrics
class DefectMetrics:
    def __init__(self, sprints):
        self.sprints = sprints

<p>def defect_leakage(self, sprint):<br>        """Defeitos encontrados em produção vs. antes"""<br>        prod_bugs = sprint.bugs_found_in_prod<br>        total_bugs = sprint.total_bugs</p>

<p>return (prod_bugs / total_bugs) * 100 if total_bugs else 0</p>

<p>def defect_densities(self, sprints):<br>        """Densidade de defeitos por feature"""<br>        return {<br>            sprint.name: len(sprint.defects) / sprint.stories_completed<br>            for sprint in sprints<br>        }</p>

<p>def escape_rate(self, sprint):<br>        """{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442} de defeitos que escaparam para prod"""<br>        escaped = sprint.defects_found_after_release<br>        total = sprint.total_defects</p>

<p>return (escaped / total * 100) if total else 0</p>

<p># Targets<br># Defect Leakage: &lt; 15{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br># Defect Density: &lt; 0.5 per story<br># Escape Rate: &lt; 10{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}<br></code></pre></p>

<h3>Test Velocity</h3>

<pre><code># Test Velocity Metrics

<p>metrics:<br>  - name: "Tests Written per Sprint"<br>    target: 50<br>    current: 47</p>

<p>- name: "Automation Coverage"<br>    target: "80{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}"<br>    current: "72{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}"</p>

<p>- name: "Test Execution Time"<br>    target: "&lt; 30 min&quot;<br>    current: "35 min"</p>

<p>- name: "Test Maintenance Effort"<br>    target: "&lt; 20{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}&quot;<br>    current: "25{6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}"<br></code></pre></p>

<hr>
<h2>Checklist de Práticas Ágeis para QA</h2>

<h3>Sprint</h3><ol><li>[ ] Participar de planning</li>
<li>[ ] Identificar riscos de teste</li>
<li>[ ] Atualizar testes para histórias</li>
<li>[ ] Executar testes</li>
<li>[ ] Reportar bugs</li>
<li>[ ] Participar de review</li>
<li>[ ] Retrospectiva de QA</li>
</ol>
<h3>Continuous</h3><ol><li>[ ] Manter testes atualizados</li>
<li>[ ] Pair testing quando possível</li>
<li>[ ] Code reviews</li>
<li>[ ] CI/CD passing</li>
<li>[ ] Métricas atualizadas</li></ol></ul>

<hr>
<h2>Conclusão</h2>

<p>QA em agile requer adaptação constante e colaboração. As chaves são:<br><ol><li><strong>Integração</strong> - QA não é fase separada</li><br><li><strong>Comunicação</strong> - Time completo é responsável</li><br><li><strong>Automação</strong> - Habilita velocidade</li><br><li><strong>Métricas</strong> - Medir para melhorar</li><br><li><strong>Melhoria</strong> - Retrospectivas e adaptação</li></ol></p>