Estático e Dinâmico 4. Teste de Fumaça 5. Teste unitário 6. Caminho (In)feliz 7. Mocks 8. Fixtures e Factories 9. Teste de Regressão 10. Teste de Integração 11. Performance 12. Cobertura 13. Mutantes 14. Teste de Propriedade
e deve responder na saída algumas perguntas sobre a qualidade do programa testado. Exemplo dessas perguntas: Funciona de acordo com a especificação? Consegue lidar com exceções? Executa em tempo razoável?
o código fonte? O interpretador consegue interpretar o código fonte? O processo fica em execução? O servidor está escutando na porta 8002? A homepage do website abre?
a execução de testes mais sofisticados e demorados. Pode ser usado quando o software avaliado não tem nenhum tipo de teste, pois é uma forma rápida e barata de evitar o deploy de software completamente quebrado.
para usuários com domínio de e‑mail "falso". Precisamos validar no cadastro se o domínio de e‑mail do usuário está numa lista de domínios bloqueados, em caso positivo devemos bloquear esse cadastro. Implementar uma função para validar um endereço de e‑mail.
de execução em que não ocorre nada fora do esperado, de modo que uma rotina siga até o final sem a ocorrência de nenhuma exceção. A entrada chega no formato esperado e a interação com outros sistemas (ou até mesmo outras unidades) ocorre de modo ideal.
para testar uma unidade que precisa interagir com outras unidades. O objetivo dessas ferramentas é evitar a necessidade de uma interação, imitando o comportamento da outra unidade: recebe os mesmos parâmetros e produz uma saída conhecida.
not functional languages. Because the problem with object‑ oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle. Joe Armstrong Mock te dá o poder de construir uma selva virtual.
mas ainda estamos recebendo usuários com e‑mail de spam. Parece que serviços desse tipo surgem com frequência então precisamos usar uma lista atualizada. Assinamos um serviço pra isso, a nossa validação de e‑mail agora deve consultar a lista de bloqueio dessa API: https://spamminator.it/api/v1/domains
def valid_mail(mail_address): if not isinstance(mail_address, str): return False if '@' not in mail_address: return False _, domain = mail_address.split('@') return domain not in _blocked_domains()
interagir com alguma rotina custosa. Facilita a validação de resultados pois permite manipulá‑los. É possível checar se e quantas vezes o código chamou a unidade mockada.
qualquer banana: 1. Construir a selva digital (contextualizar) 2. Interagir com a banana (executar o código) 3. Validar o estado final da banana (rodar as asserções) 4. Destruir a selva (destruir o contexto)
ao banco de dados (com ORM) é comum durante a fase de contextualização de casos de teste criar várias entradas no banco de dados. Fixtures e Factories são duas ferramentas que podem facilitar esse trabalho.
inseridos no banco de dados antes de cada caso de teste. Factories Métodos auxiliares para popular o banco de dados dinamicamente. Gera dados para serem inseridos e permite especificar alguns parâmetros.
ou durante testes manuais 2. Descubra a origem do bug 3. Escreva um teste para reproduzir o bug (o teste deve falhar) 4. Escreva a correção para o bug (agora o teste deve passar)
o funcionamento isolado das unidades do software. O foco dos testes de integração é testar o comportamento geral do software, testando as unidades trabalhando em conjunto.
containers: Um script para subir os containers e interagir com o sistema, validando a saída e se possível validando se os microserviços individualmente interagiram uns com os outros de modo correto.
fácil criá‑los a partir de casos de uso Cobre grande área do código de modo relevante Desvantagens: São caros para rodar (recursos e tempo) Podem ser difíceis de implementar se o ecossistema não tiver um bom ferramental
da necessidade de uma grande refatorada Traz confiança quanto à qualidade geral do software Desvantagens A vontade de atingir cobertura de 100% pode ser cara Não garante que o software tenha menos bugs
código com alguma pequena alteração. Original: if user.role == 'admin' user.permissions << 'delete' end Mutante: if user.role != 'admin' user.permissions << 'delete' end
somente com o código original e falhe com todos os mutantes testados. O racional é que se o caso de teste passar com um determinado mutante, o código está incorreto ou o teste não valida corretamente o comportamento do código. http://cosmic‑ray.readthedocs.io/en/latest/theory.html https://github.com/mbj/mutant
Escreve‑se alguns exemplos de entradas possíveis e depois a conferência da saída. A ideia dos testes de propriedade é descrever o que é possível receber de entrada e deixar o computador gerar entradas aleatórias.