trecho de código, programa ou aplicação com a intenção de encontrar defeitos ou verificar a corretude de execução em condições controladas. • Não cobrem todas as possibilidades, mas buscam maximizar a confiança de corretude da aplicação. • Testes não provam que um programa está livre de bugs. Com testes é possível evidenciar a existência de defeitos e não a sua ausência. Teste de software?
apontar falhas durante o processo de desenvolvimento. • É um processo a mais para garantir a satisfação das necessidades da aplicação. • É muito importante para garantir a qualidade do software e ganhar a confiança do cliente. • https://www.wired.com/2005/11/historys-worst-software-bugs/ Por que fazer testes?
ajuda a prevenir que modificações na aplicação entrem em conflito com outras partes já implementadas. • Testes são uma documentação de baixo nível de como seu código funciona. • Testes são especificações do comportamento esperado do software. Por que fazer testes?
falhas nos componentes de um sistema. • Segregar e isolar componentes do sistema para testar sua lógica. • Quanto mais cedo no processo de desenvolvimento, melhor. Unit Testing - Objetivos
básicos de desenvolvimento. • Facilita manutenção e refatoração de código. • Como os bugs são encontrados mais cedo, pode poupar tempo de debug em estágios mais avançados de desenvolvimento. • Contribui para que o desenvolvedor escreva código modular e que cada módulo tenha responsabilidades simples. Unit Testing - Vantagens
“testável” para você conseguir escrever testes. Escrevendo um código “testável”: • Evite variáveis de estado global e Singletons. (State is evil) • Se uma unidade precisa de algum recurso externo, ela deve pedir explicitamente por ele em seus parâmetros. (Law of Demeter) • Evite referências globais ao horário ou data atual. • Passe para as funções estritamente o que elas precisam, evite efeitos colaterais e novas instâncias misturadas com lógica. Unit Testing - Escrevendo testes
pegar coisas na geladeira, você pode causar problemas. Você pode esquecer a porta aberta, você pode pegar algo que a mamãe ou o papai não querem que você pegue. Você pode até mesmo estar procurando por algo que nós não temos ou que já passou do prazo de validade. O que você deveria estar fazendo é indicar uma necessidade, "Eu preciso de alguma coisa para beber com o almoço", e então nós nos certificaremos que você tenha algo para beber quando você se sentar para comer." John Munsch Dependency Injection
sistema • Podem “imitar” comportamentos ou interfaces de outros módulos • São úteis para isolar APIs de terceiros, operações de rede e bancos de dados, fazendo com que a unidade testada não acesse componentes do sistema que independem do teste. • Tornam o processo de unit testing mais rápido Fake, Mock e Stub
01 O que o teste deve fazer? 02 Qual é a saída da unidade a ser testada? 03 Como analisar a corretude da saída? 04 Qual é a saída esperada? 05 Unit testing - Roteiro