Cobertura de Testes
## Teste unitário - Já vimos como definir testes unitários para as tarefas do projeto, e.g. Tarefa 1: ```haskell testesTarefa1 :: [Estado] ``` - Sistema de feedback compara o resultado da vossa solução com o resultado esperado e apresenta as diferenças - Técnica *black-box* (não inspeciona o vosso código, apenas utiliza o resultado) --- ## Qualidade dos testes - Como podemos medir quão bons são os testes? - Verificando se consideram todos os casos possíveis - Mas como sabemos quais os casos possíveis? - Utilizando o código como referência
Cobertura do código
Como podemos utilizar o código como referência?
Verificando se é exercitado pelos testes (cobertura)
Código / Testes
## Uma pescadinha-de-rabo-na-boca - Qualidade dos testes depende do código - Cobertura do código depende dos testes - Processo iterativo 1. escreve código / testes 2. corre testes unitários e cobertura 3. adapta código / testes 4. corre testes unitários e cobertura 5. ... --- ## Haskell Program Coverage (HPC) - Vão usar a ferramenta `hpc` para verificar coverage do vosso código para os vossos testes - Para a Tarefa 1, correr dentro da pasta do projeto: ```bash cabal clean && rm -rf t1-feedback.tix cabal run --enable-coverage t1-feedback ./runhpc.sh t1-feedback ``` - No vosso browser, abrir o ficheiro `hpc_index.html` com o relatório gerado --- ## Haskell Program Coverage (HPC) - Técnica *white-box* (olha para o código) - Apresenta % de código exercitado nos testes - Assinala casos suspeitos -
Amarelo:
Código não executado -
Vermelho:
Condições sempre falsas -
Verde:
Condições sempre verdadeiras - Ou **código está a mais** ou **faltam testes**
## Lições #1 - Coverage para cada módulo Haskell - 3 métricas diferentes - Funções de topo, condições e expressões - Coverage alta da `Main` (`Tarefa1Test.hs`)? - **Não** definimos testes! - Coverage baixa da `Tarefa1`? - **Não** executou a função `validaEstado`!
## Lições #2 - Coverage 100%? - Só definimos um teste - Função `validaEstado` retorna sempre `True` - Logo é independente dos testes! - Coverage é uma métrica - **tão fiável** a medir qualidade dos testes - **quanto** o código estiver próximo da lógica desejada
## Lições #3 - 2 testes + 3 funções de validação: - `Mapa`: condição sempre verdadeira - `[Objeto]`: nunca executada para listas não-vazias - `[Minhoca]`: nada reportado, tudo bem? - Estamos a verificar se todas as minhocas têm uma posição - Coverage: nos testes há minhocas com e sem posições - Mas **não** é o que pede o enunciado!