Automock Interaction-based Mock Code Generation Renato Miceli Costa Ribeiro renato@lsd.ufcg.edu.br Setembro de 2009
Introdução: construindo testes Fazer testes é importante! Testes ajudam a identificar falhas no software. Vários tipos de teste: Unidade; Integração; Aceitação; Sistema. Diferentes tipos de teste focam em identificar diferentes falhas no software.
Introdução: refatorando código Identificar falhas VS identificar faltas. Isolamento: um dos princípios de testes de unidade. Como eliminar as dependências de uma classe sob teste?
Introdução: testes podem ser custosos Ainda, as dependências podem causar efeitos colaterais no teste: Assincronia; Multithreading; Demora em execução; Suscetível às condições do ambiente. E, muitas vezes, as próprias dependências não existem ainda!
Introdução: acesso a banco de dados
Introdução: Stubs Solução inicial: usar Stubs! Stubs são classes que implementam a mesma interface das dependências da classe sob teste. As respostas esperadas para cada invocação das dependências são determinadas estaticamente em código; O comportamento se estabelece em tempo de compilação. Mas se houver muitos dependentes, e muitas classes de teste, quantos Stubs haveriam...
Introdução: Objetos Mock Outra solução: usar Objetos Mock! Mocks são objetos que implementam a mesma interface das dependências da classe sob teste. As respostas esperadas para cada invocação das dependências são determinadas dinamicamente em código; O comportamento se estabelece em tempo de execução.
Introdução: Testes com Objetos Mock São mais efetivos, por fornecer informação precisa do comportamento das dependências. Tendem a executar mais rapidamente. Simulam um ambiente real sem os efeitos colaterais do próprio ambiente. Isolam a classe sob teste, de modo que se torna mais fácil a identificação das faltas do software.
Introdução: Por outro lado... São custosos de se escrever: é necessário escrever um passo-a-passo de todas as expectativas das dependências. Testadores requerem bastante experiência com o sistema, de modo que entendam e saibam todas as interações que ocorrem entre os objetos no cenário de teste. Qualquer mudança no código causa mudanças profundas em testes com Objetos Mock.
Solução: Automock Desenvolvida no ano de 2008, no âmbito do projeto AutoTest, no Laboratório de Sistemas Distribuídos (LSD). Ferramenta de apoio ao desenvolvimento de testes. Gera automaticamente testes com Objetos Mock a partir de outros testes. Identifica as dependências da classe sob teste e as converte em Objetos Mock. Cataloga as interações entre os objetos no teste original em tempo de execução para determinar o comportamento dos Objetos Mock. Evita os malefícios do uso de Mocks, mantendo-se somente seus benefícios.
Funcionamento do Automock
Validação da Técnica Qual a redução de esforço do testador ao usar o Automock? Quanto em tempo se ganha no desenvolvimento de código Mock ao usar o Automock? Podemos assegurar que o teste original e o oriundo do Automock têm a mesma semântica?
Abordagens Análise de semântica: Testes de mutação; Cobertura; Resultado da execução. Análise de esforço e tempo: Experimentação; Estimadores. Softwares candidatos a experimentação: OurBackup (atividades A); Hidrogis (atividades B); OurGrid (atividades C).
Cronograma
Equipe e Ambiente de Estágio Supervisora Técnica: Sabrina de Figueirêdo Souto (mestranda) Supervisor Acadêmico: Dalton Serey Guerrero (Professor Dr.) O estágio será desenvolvido no Laboratório de Sistemas Distribuídos (LSD), bloco CO da UFCG.
Resultados Esperados Sinal positivo sobre o Automock promover ganhos sobre a construção manual de código Mock. Compilar os resultados e a experiência obtidos no estágio em um artigo científico para publicação.
Dúvidas? Obrigado