Série: Fundamentos de Engenharia de Software | Parte 13 de 19 > Ministrada na Universidade Potiguar (UnP) em 2010
Nessa aula, mergulhamos em Testes de Software—não como uma lista burocrática de tipos ou uma exigência de QA, mas como uma atividade estratégica e criativa presente em todas as fases do desenvolvimento. Reforcei que testar não é um passo no fim do processo: é parte do próprio design. Um bom engenheiro precisa considerar o teste como ferramenta essencial, não como tarefa de outra equipe.
Começamos com uma provocação: “Testar não prova que o sistema funciona. Prova que ele não falha sempre.” Isso muda a mentalidade: não estamos buscando perfeição, e sim projetando confiança.
Testar é uma Forma de Aprender
Introduzimos os testes como um mecanismo de aprendizado. Pedi aos alunos que listassem cinco motivos para testar. Surgiram respostas como: “descobrir bugs”, “verificar se o sistema funciona”, “ganhar confiança”.
Discutimos como testes expõem ambiguidade nos requisitos, falhas de integração e até problemas de usabilidade. Mostrei como escrever testes antes do código ajuda a esclarecer escopo.
Exemplo de teste unitário para cálculo de entrega:
@Test
public void testExpressDeliveryCalculation() {
DeliveryCalculator calculator = new DeliveryCalculator();
int days = calculator.calculate("express", 120);
assertEquals(1, days);
}
Esse teste força a definir o que significa “entrega expressa” e quais regras guiam o cálculo. Um bom teste antecipa falhas antes que virem frustração de cliente.
Tipos de Testes e Quando Usá-los
Cobrimos vários tipos de teste: unitário, integração, sistema, aceitação, UI, desempenho, segurança. Em vez de definições prontas, desafiei cada grupo a relacionar um tipo de teste a um bug real que já haviam enfrentado. Gerou ótimos debates.
Falamos sobre responsabilidade:
- Desenvolvedores escrevem testes unitários e de integração.
- Times de teste fazem os testes de sistema, UI e exploratórios.
- Usuários validam via testes de aceitação.
Escrevemos juntos um teste funcional para login:
def test_user_login():
user = create_user("maria@example.com", "secure123")
response = client.post("/login", data={"email": "maria@example.com", "password": "secure123"})
assert response.status_code == 200
assert b"Bem-vinda, Maria" in response.data
Esse tipo de teste valida o comportamento esperado sem se prender à implementação.
Construindo Confiança com Testes
Apresentei o problema do “Sorvete de Testes”: muitos testes de UI, poucos testes de unidade. Discutimos a Pirâmide de Testes e como equilibrar esforço, velocidade e confiabilidade.
Os alunos analisaram seus projetos e propuseram melhorias no uso de testes. Um grupo percebeu que não havia qualquer teste de desempenho, apesar da importância de resposta rápida no app deles.
Mostrei como evoluir uma suíte de testes de forma sustentável. Usamos o seguinte exemplo TDD de regra de precificação:
describe PricingEngine do
it "applies 10% discount for students" do
price = PricingEngine.new(base: 100, user_type: "student").final_price
expect(price).to eq(90)
end
end
Mesmo um único teste pode direcionar decisões arquiteturais e escolhas de refatoração.
Atividade Prática com Testes
Para fechar, formei times de teste. Cada equipe recebeu o desafio de criar uma suíte mínima de testes para um recurso de e-commerce, com:
- Um requisito
- Um fluxo de usuário
- Uma restrição (ex: resposta em até 2s)
Compartilharam estratégias, ferramentas e bugs descobertos. Criamos um mural coletivo de “erros encontrados por testes”—um lembrete visual de que testes não são custo, e sim lente de aprendizado.
Facilitadores podem usar esse exercício em onboarding, retrospectivas ou hackathons. Ele ativa a responsabilidade pelo teste como ferramenta de entendimento e melhoria.
Publicado como parte do diário da disciplina de Engenharia de Software. Hoje aprendemos que testar não é sobre provar perfeição—é sobre projetar confiança e construir sistemas que evoluem com elegância.
Navegação da Série
- Introdução: Parte 1 - Por que Engenharia de Software?
- Anterior: Parte 12 - Requisitos & Testes
- Próxima: Parte 14 - Desenvolvimento Orientado a Testes
- Atual: Parte 13 - Testes de Software
- Série completa: Por que Engenharia de Software? | Domando a Complexidade | Modelo Cascata | Modelos Evolucionários | Mentalidade Ágil | Scrum Produtividade | Ciclo Scrum | XP Qualidade & Coragem | XP Princípios & Práticas | XP na Prática | Domain-Driven Design | Requisitos & Testes | Testes de Software | Desenvolvimento Orientado a Testes | Testes Unitários com JUnit