🧪 CAPÍTULO 16: QUALIDADE DE SOFTWARE (SQA)


🎯 1. Objetivos de Aprendizagem & Competências

Estimativa de Dedicação: 2 horas de estudo autoguiado.
Ao final deste capítulo, você será capaz de:

  • 🔹 Compreender os fundamentos de Software Quality Assurance (SQA) e as 8 características de qualidade da norma ISO/IEC 25010.
  • 🔹 Avaliar a Complexidade Ciclomática de McCabe e o índice de manutenibilidade de bases de código.
  • 🔹 Executar ferramentas de análise estática de código (Linters, Flake8, Ruff e Radon) no ecossistema Python 3.11+.
  • 🔹 Instituir Quality Gates e métricas de governança em esteiras de integração contínua.

🏢 2. Cenário Corporativo & Estudo de Caso (TecProExpress)

Na TecProExpress, após 1 ano de entregas aceleradas, o sistema central tornou-se lento e qualquer nova alteração gerava bugs inesperados em outros módulos não relacionados. O tempo médio para corrigir uma falha simples saltou de 2 horas para 4 dias úteis.

O Desafio: Como Engenheiro de Qualidade de Software (SQA Lead), você deve auditar a base de código utilizando a norma ISO/IEC 25010 e ferramentas de análise estática, estabelecendo métricas de complexidade e bloqueando deploys de código com alto débito técnico.


🧠 3. Fundamentação Teórica & Modelos Visuais

3.1. As 8 Características de Qualidade da Norma ISO/IEC 25010

A norma internacional ISO/IEC 25010 estrutura a qualidade de produto de software em 8 dimensões complementares:

flowchart TD
    root["🌐 ISO/IEC 25010: Qualidade de Produto de Software"]
    
    root --> C1["1. Adequação Funcional<br>(Completeza, Correção)"]
    root --> C2["2. Eficiência de Performance<br>(Tempo, Recursos, Capacidade)"]
    root --> C3["3. Compatibilidade<br>(Coexistência, Interoperabilidade)"]
    root --> C4["4. Usabilidade<br>(Operabilidade, Acessibilidade)"]
    root --> C5["5. Confiabilidade<br>(Maturidade, Tolerância a Falhas)"]
    root --> C6["6. Segurança<br>(Confidencialidade, Integridade)"]
    root --> C7["7. Manutenibilidade<br>(Modularidade, Reusabilidade, Testabilidade)"]
    root --> C8["8. Portabilidade<br>(Adaptabilidade, Instalabilidade)"]
    
    style root fill:#eff6ff,stroke:#2563eb,stroke-width:2px
    style C1 fill:#f0fdf4,stroke:#16a34a
    style C2 fill:#f0fdf4,stroke:#16a34a
    style C3 fill:#fffbeb,stroke:#d97706
    style C4 fill:#fffbeb,stroke:#d97706
    style C5 fill:#fee2e2,stroke:#ef4444
    style C6 fill:#fee2e2,stroke:#ef4444
    style C7 fill:#ede7f6,stroke:#7c3aed
    style C8 fill:#ede7f6,stroke:#7c3aed

3.2. Complexidade Ciclomática de Thomas McCabe

Mede o número de caminhos linearmente independentes no fluxo de controle de um método: $$\text{Complexidade } V(G) = E - N + 2P$$ (Onde $E$ = arestas, $N$ = nós de decisão e $P$ = componentes conexos).

flowchart TD
    subgraph MCCABE ["COMPLEXIDADE CICLOMÁTICA E RISCO"]
        R1["1 a 10: Código Simples (Baixo Risco)"]
        R2["11 a 20: Complexidade Moderada (Risco Médio)"]
        R3["21 a 50: Alta Complexidade (Alto Risco / Difícil Testar)"]
        R4["> 50: Código Não-Testável (Risco Crítico / Refatorar Urgente)"]
    end
    style R1 fill:#dcfce7,stroke:#16a34a
    style R2 fill:#fef3c7,stroke:#d97706
    style R3 fill:#fee2e2,stroke:#ef4444
    style R4 fill:#b91c1c,stroke:#7f1d1d,color:#fff

💻 4. Aplicação Prática & Código Executável (Python 3.11+)

📋 Pré-requisitos e Instalação

Este exemplo utiliza o módulo ast (Abstract Syntax Trees) nativo da biblioteca padrão do Python:

python --version  # Requer Python 3.11 ou superior

💻 Código Completo e Autocontido (sqa_analisador_qualidade.py)

Implementação de analisador estático de complexidade ciclomática de McCabe $V(G)$ via AST em Python 3.11+:

"""
Módulo: sqa_analisador_qualidade.py
Domínio: Auditoria estática de código e cálculo de complexidade ciclomática.
"""
import ast

class AnalisadorComplexidade(ast.NodeVisitor):
    def __init__(self):
        self.complexidade = 1 # Caminho base linear

    def visit_If(self, node):
        self.complexidade += 1
        self.generic_visit(node)

    def visit_For(self, node):
        self.complexidade += 1
        self.generic_visit(node)

    def visit_While(self, node):
        self.complexidade += 1
        self.generic_visit(node)

def calcular_complexidade_codigo(codigo_fonte: str) -> int:
    arvore_sintatica = ast.parse(codigo_fonte)
    analisador = AnalisadorComplexidade()
    analisador.visit(arvore_sintatica)
    return analisador.complexidade

if __name__ == "__main__":
    print("--- Auditoria Estática de Complexidade Ciclomática (SQA) ---")
    
    codigo_exemplo = """
def calcular_frete_complicado(peso, distancia, expresso, vip):
    if peso > 10:
        if distancia > 100:
            if expresso:
                return 150.0
            elif vip:
                return 120.0
    return 50.0
"""
    v_g = calcular_complexidade_codigo(codigo_exemplo)
    print(f"📊 Complexidade Ciclomática V(G) do método: {v_g}")
    if v_g <= 10:
        print("✅ Qualidade Aprovada: Método com baixa complexidade e alta testabilidade.")
    else:
        print("⚠️ Alerta SQA: Método com excesso de bifurcações aninhadas. Refatore!")

🚀 Como Executar

Execute o script diretamente no terminal:

python sqa_analisador_qualidade.py

🖥️ Saída Esperada no Terminal

--- Auditoria Estática de Complexidade Ciclomática (SQA) ---
📊 Complexidade Ciclomática V(G) do método: 5
✅ Qualidade Aprovada: Método com baixa complexidade e alta testabilidade.

💡 5. Checkpoint de Engenharia & Boas Práticas

Boas Práticas & Anti-Patterns

  • Quality Gates no CI: Configure ferramentas como Ruff, Flake8 e Pytest no GitHub Actions. Se a complexidade ultrapassar o limite ou a cobertura cair abaixo de 80%, a esteira deve abortar o pull request.
  • Anti-Pattern Arrow Anti-Pattern: Evite métodos com múltiplos níveis de if/else aninhados em formato de seta (>) que elevam a complexidade ciclomática. Use Guard Clauses (retornos antecipados).

🔗 6. Conexão com os Projetos Integradores

Projeto IntegradorComo o conceito deste capítulo é aplicado no PI
PI-01: ManuTrackAplicação de SQA e testes unitários garantindo que o cálculo de OEE seja matematicamente exato.
PI-05: ParkFlowQualidade de Confiabilidade: tarifação temporal testada para frações de hora e viradas de dia.

🧪 7. Quiz de Fixação e Autoavaliação (Formative Assessment)

🧪 Quiz de Autoavaliação — Capítulo 16

1. De acordo com a norma ISO/IEC 25010, qual característica de qualidade avalia a facilidade com que o software pode ser modificado, corrigido e adaptado a novas demandas?

  • A) Portabilidade.
  • B) Manutenibilidade (Maintainability).
  • C) Usabilidade.
  • D) Tolerância a Falhas.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: Manutenibilidade compreende a modularidade, reusabilidade, analisabilidade, modificabilidade e testabilidade do código-fonte ao longo do seu ciclo de vida.


2. A métrica de 'Complexidade Ciclomática' de McCabe é utilizada principalmente para:

  • A) Medir o preço de licença de um software na nuvem.
  • B) Quantificar o número de caminhos de execução independentes no código, indicando o risco e o número mínimo de testes necessários.
  • C) Contar a quantidade de bytes gravados no disco rígido.
  • D) Calcular a velocidade da memória RAM.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: Quanto maior a complexidade ciclomática (mais if, while, for), mais difícil é entender, manter e testar o código, exigindo maior número de casos de teste.


3. O que é um 'Quality Gate' em uma esteira moderna de DevOps / CI?

  • A) Uma catraca física na porta da sala dos desenvolvedores.
  • B) Um conjunto automatizado de critérios e limites de qualidade (cobertura de testes, ausência de vulnerabilidades, linter) que um código deve satisfazer para ser aprovado no merge.
  • C) Um firewall de rede local.
  • D) Um contrato assinado pelo cliente.
💡 Ver Resposta e Justificativa

Resposta Correta: B
Justificativa: Quality Gates impedem que código com problemas de conformidade, falhas de segurança ou sem testes automatizados chegue aos branches principais e ao ambiente de produção.


🛠️ 8. Ponte para a Ação: Laboratório Prático

🎯 Próximo Passo Prático

Coloque esta teoria em prática executando o roteiro de laboratório autoguiado:
👉 ATIVIDADE 09: QUALIDADE E TESTES COM PYTEST


📌 9. Resumo Executivo & Key Takeaways

  • SQA Sistêmico: A qualidade deve ser construída e garantida em todas as fases do processo, não apenas testada no final.
  • ISO/IEC 25010: Modelo internacional com 8 características canônicas para auditoria de software.
  • Complexidade Ciclomática: Métodos com $V(G) \le 10$ são sustentáveis; métodos acima de 20 devem ser refatorados imediatamente.
  • Quality Gates: Automação com linters e testes bloqueando commits de baixa qualidade na esteira de CI.