O servidor está parado, mas o trabalho não precisa parar
A equipe da Cantina Horizonte está fazendo manutenção no ambiente. Por algumas horas, ninguém consegue abrir o sistema.
Mesmo assim, chegaram para revisão uma especificação de requisitos e alguns trechos de código.
Você pode simplesmente esperar o sistema voltar — ou pode começar a procurar problemas agora.
Primeiro, revise sem executar nada
Abra o material abaixo e leia com calma. Não tente rodar código. Não procure uma ferramenta automática. Apenas observe os textos e compare cada trecho com aquilo que já sabemos da Cantina Horizonte.
Prática · revisão inicial
Abrir os materiais para revisão →
Anote o que chamou sua atenção, por que pode ser um problema e o que precisaria ser esclarecido.
Você acabou de testar sem executar o programa
Se você percebeu que dois documentos trazem valores diferentes para o cupom, encontrou um problema antes da execução.
Se leu o código abaixo e percebeu que ele aceita 0 e valores negativos, também encontrou um problema sem executar a função:
def validar_quantidade(quantidade):
return quantidade <= 10A regra conhecida é:
A quantidade deve estar entre 1 e 10, inclusive.
O código verifica apenas o limite superior. Só a leitura já revelou que uma parte da regra ficou de fora.
Esse tipo de trabalho tem um nome
Teste estático
Teste estático é a avaliação de produtos de trabalho sem executar o software que está sendo analisado.
Esses produtos podem ser requisitos, regras de negócio, documentos, diagramas, código-fonte, configurações e outros artefatos do projeto.
A palavra artefato, aqui, significa simplesmente um produto do trabalho da equipe: algo criado durante o projeto e que pode ser revisado.
E quando executamos?
Teste dinâmico
Teste dinâmico acontece quando executamos o software ou uma parte dele e observamos seu comportamento.
Estático
Ler o requisito do cupom e perceber uma contradição.
Revisar o código de quantidade e notar que falta o limite mínimo.
Dinâmico
Abrir a Cantina Horizonte, digitar 0 e observar se o sistema aceita.
Executar uma função e comparar o resultado obtido com o esperado.
Um não substitui o outro. Eles encontram problemas de maneiras diferentes.
Por que procurar cedo?
Imagine que a regra do cupom esteja contraditória desde a documentação.
Se ninguém perceber, o desenvolvedor escolhe uma interpretação, escreve o código, o testador cria casos baseados em outra interpretação e a discussão só aparece depois.
Ao revisar cedo, podemos perguntar antes:
A regra correta é R$ 30,00 ou R$ 40,00?
Resolver a dúvida nesse momento evita que várias partes do projeto avancem sobre uma base diferente.
Revisar não é apenas caçar erro de digitação
Durante uma revisão, vale procurar problemas de vários tipos:
Ambiguidade
“O sistema deve responder rápido.” Quanto é rápido?
Contradição
Um documento diz R$ 30,00 e outro diz R$ 40,00.
Omissão
A regra fala em máximo 10, mas esquece de informar o mínimo.
Inconsistência
O requisito diz uma coisa e o código representa outra.
Também podemos encontrar duplicações desnecessárias, trechos difíceis de entender, informações sem fonte e regras impossíveis de verificar.
Uma revisão pode ser simples
Nem toda revisão precisa de uma reunião formal ou de um documento enorme.
Para um projeto pequeno, uma lista de perguntas já ajuda bastante:
Checklist de revisão
- Existe alguma frase com mais de uma interpretação possível?
- Dois trechos dizem coisas diferentes sobre a mesma regra?
- Falta algum limite, condição ou exceção importante?
- O requisito pode ser verificado de forma objetiva?
- O código representa toda a regra conhecida?
Checklist significa uma lista de verificação: perguntas ou itens que ajudam a lembrar o que precisa ser observado.
Revisão humana e análise automática não enxergam as mesmas coisas
Uma pessoa consegue perceber que “R$ 30,00” e “R$ 40,00” representam uma contradição de negócio porque entende o contexto.
Uma ferramenta de análise estática pode examinar código sem executá-lo e apontar outros sinais, como problemas de sintaxe, trechos nunca usados, padrões perigosos ou violações de regras de código.
A ferramenta conhece a estrutura do código. A equipe conhece a intenção do negócio. Por isso, as duas formas de revisão se complementam.
Mais adiante, quando surgir uma necessidade concreta, poderemos usar ferramentas desse tipo. Aqui o mais importante é entender o raciocínio.
Nem tudo que parece estranho é um defeito
Considere este código:
def calcular_subtotal(preco, quantidade):
resultado = preco * quantidade
valor = resultado
return valorEle pode produzir o resultado correto. Ainda assim, a variável valor não acrescenta informação e pode ser eliminada.
Uma revisão também pode melhorar clareza, simplicidade e manutenibilidade, mesmo quando não encontramos uma falha funcional.
Prática · estático ou dinâmico?
| Situação | Estático ou dinâmico? | Por quê? |
|---|---|---|
| Ler RF-03 e notar que falta uma condição. | Estático | O software não foi executado. |
| Digitar 11 na tela e observar a resposta. | Dinâmico | O sistema foi executado. |
| Comparar dois documentos que descrevem o cupom. | Estático | Estamos revisando artefatos. |
| Executar uma função de cálculo com quantidade 2. | Dinâmico | Há execução do código. |
| Ler um trecho de código e perceber que aceita valores negativos. | Estático | A conclusão veio da revisão do código. |
Agora o problema muda novamente
A revisão estática ajudou a encontrar contradições, omissões e diferenças entre regra e código.
Depois que esses pontos forem esclarecidos, ainda precisaremos executar o sistema.
Só que aparece uma nova dificuldade: para uma quantidade inteira, poderíamos testar 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 — e também 0, -1, -2, 11, 12, 100...
Como escolher poucos valores que tenham boa chance de revelar problemas?
Antes de seguir
Você deve conseguir explicar:
- por que é possível encontrar problemas antes de executar o software;
- a diferença básica entre teste estático e teste dinâmico;
- o que significa artefato e checklist neste contexto;
- por que revisão humana e análise automática podem se complementar.