🧪 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
- 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/elseaninhados em formato de seta (>) que elevam a complexidade ciclomática. Use Guard Clauses (retornos antecipados).
🔗 6. Conexão com os Projetos Integradores
| Projeto Integrador | Como o conceito deste capítulo é aplicado no PI |
|---|---|
| PI-01: ManuTrack | Aplicação de SQA e testes unitários garantindo que o cálculo de OEE seja matematicamente exato. |
| PI-05: ParkFlow | Qualidade 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
🧪 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
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.