Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🧬 PriceCalculator - Teste de Mutação em .NET

📖 Contexto do Projeto

Este é um projeto educacional que demonstra a diferença entre cobertura de testes e qualidade de testes.

O projeto implementa uma calculadora de preços com desconto simples, mas usa-a para ilustrar um conceito crucial:

Cobertura de testes 100% ≠ Testes bons/adequados

Mesmo quando todas as linhas de código são executadas pelos testes, eles podem não estar detectando bugs reais. Este projeto mostra essa lacuna usando:

  • Coverlet: Mede a cobertura de código que os casos de teste cobrem
  • Stryker: Aplica mutações propositais ao código para verificar se os testes conseguem detectá-las

📁 Estrutura do Projeto

T1/
├── lib/
│   ├── PriceCalculator.cs          # Código da biblioteca (a lógica a testar)
│   └── PriceCalculator.csproj      # Projeto de produção (.NET)
├── tests/
│   ├── PriceCalculatorTest.cs      # Testes unitários (xUnit)
│   └── PriceCalculatorTest.csproj  # Projeto de testes (.NET)
├── PriceCalculator.sln             # Solução que agrupa os projetos
├── coveragereport/                 # Relatório de cobertura (Coverlet)
├── StrykerOutput/                  # Relatório de mutação (Stryker)
└── README.md                        # Este arquivo

🚀 Instalação e Preparação

Passo 1: Restaurar ferramentas locais

dotnet tool restore

Isto instala Stryker e ReportGenerator como ferramentas locais no projeto.

Passo 2: Restaurar dependências

dotnet restore

✅ Rodando os Testes

Execute os testes xUnit para validar que a lógica está funcionando:

dotnet test tests/PriceCalculatorTest.csproj

Resultado esperado: 3 testes passando

O que está sendo testado:

  • ✅ Cálculo correto de desconto (100 - 10% = 90)
  • ✅ Validação de desconto inválido (< 0 ou > 100)
  • ✅ Validação de preço inválido (≤ 0)

📊 Medindo Cobertura com Coverlet

Coverlet é um instrumento de cobertura de código open-source que mede quantas linhas de código são executadas pelos testes. Diferentemente do Stryker que valida a qualidade dos testes, Coverlet mede apenas a quantidade de código testado.

O que Coverlet faz:

  • ✅ Rastreia quais linhas foram executadas
  • ✅ Rastreia quais branches (caminhos) foram executados
  • ✅ Gera relatórios em múltiplos formatos (Cobertura XML, JSON, etc.)
  • NÃO valida se os testes realmente detectam bugs

Passo 1: Rodar testes com coleta de cobertura

dotnet test tests/PriceCalculatorTest.csproj --settings .runsettings --collect:"XPlat Code Coverage"

Isto gera um arquivo XML em tests/TestResults/*/coverage.cobertura.xml

Passo 2: Gerar relatório HTML

reportgenerator -reports:"**/coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:Html

Passo 3: Visualizar o relatório

Start-Process "coveragereport/index.html"

Resultado esperado: ~96% de cobertura de linhas


🧬 Teste de Mutação com Stryker

Stryker é muito mais rigoroso que cobertura. Ele modifica seu código propositalmente (cria mutantes) e verifica se os testes detectam essas modificações.

Como funciona:

  1. Stryker aplica mutações ao código (ex: <= vira <, * vira /)
  2. Roda os testes para cada mutação
  3. Se os testes ainda passam, significa que o teste não detectou o bug
  4. Calcula o kill score: percentual de mutações detectadas

Executar Stryker

dotnet stryker

Resultado esperado:

  • 11 mutantes mortos (testes detectaram)
  • 5 mutantes vivos (testes não detectaram)
  • Kill Score: 68.75% ← Mesmo com cobertura alta!

Visualizar o relatório

Após a execução, abra o relatório gerado:

Start-Process "StrykerOutput/*/reports/mutation-report.html"

💡 O Ponto Principal

Observe o contraste:

Métrica Resultado
Cobertura de Linhas (Coverlet) ~96% ✅
Kill Score (Stryker) 68.75% ❌

Mesmo com 96% de cobertura de linhas e 100% de cobertura de branchs, apenas 68.75% dos mutantes foram detectados. Isto demonstra que:

  • ✅ Todas as linhas foram executadas
  • ❌ Mas os testes não validam todos os comportamentos
  • ❌ Se esses "mutantes" fossem bugs reais, os testes desse projeto não os pegariam

📚 Referências

Para entender melhor os conceitos por trás deste projeto:


📝 Observações

  • Se você clonar este repositório em outra máquina, execute dotnet tool restore para restaurar ferramentas locais
  • Os relatórios gerados (coveragereport/ e StrykerOutput/) são ignorados pelo git
  • Este é um projeto de propósito educacional

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages