Resumo : neste tutorial, você aprenderá como usar o comando de cobertura unittest do Python para gerar um relatório de cobertura de teste.
O que é uma cobertura de teste
A cobertura de teste é uma razão entre o número de linhas executadas por pelo menos um caso de teste e o número total de linhas da base de código:
test coverage = lines of code executed / total number of lines
A cobertura de teste também é conhecida como cobertura de código.
A cobertura de teste é frequentemente usada para avaliar a qualidade de um conjunto de testes. Se a cobertura do teste for baixa, por exemplo, 5%, é um indicador de que você não está testando o suficiente.
No entanto, o inverso pode não ser verdade. Por exemplo, 100% de cobertura de teste não é garantia de que você tenha um bom conjunto de testes. Em outras palavras, um conjunto de testes com alta cobertura ainda pode ser de baixa qualidade.
Exemplo de cobertura Unittest
Usaremos a seguinte estrutura de projeto para demonstrar a unittest
cobertura. Observe que você pode obter o código-fonte neste tutorial .
D:\python-unit-testing
├── shapes
| ├── circle.py
| ├── shape.py
| └── square.py
└── test
├── test_circle.py
├── test_square.py
└── __init__.py
Para gerar um relatório de cobertura, são necessários dois passos:
Primeiro, execute o módulo de cobertura para gerar os dados de cobertura:
python -m coverage run -m unittest
Segundo, transforme os dados de cobertura em um relatório:
python -m coverage report
Saída:
Name Stmts Miss Cover
-----------------------------------------
shapes\circle.py 9 0 100%
shapes\shape.py 4 0 100%
shapes\square.py 9 0 100%
test\__init__.py 0 0 100%
test\test_circle.py 14 0 100%
test\test_square.py 14 0 100%
-----------------------------------------
TOTAL 50 0 100%
Linguagem de código: texto simples ( texto simples )
Para gerar o relatório de cobertura em formato HTML, você altera a opção do módulo de cobertura para HTML assim:
python -m coverage html
Saída:
Wrote HTML report to htmlcov\index.html
Linguagem de código: CSS ( css )
A saída indica a localização do relatório de cobertura HTML htmlcov\index.html
na pasta do projeto.
Se você abrir o arquivo index.html da htmlcov
pasta, ele terá a seguinte aparência:
Examinando o relatório detalhado da cobertura unittest
Primeiro, adicione o perimeter()
método à Circle
classe da seguinte forma:
import math
from .shape import Shape
class Circle(Shape):
def __init__(self, radius: float) -> None:
if radius < 0:
raise ValueError('The radius cannot be negative')
self._radius = radius
def area(self) -> float:
return math.pi * math.pow(self._radius, 2)
def perimeter(self) -> float:
return 2 * math.pi * self._radius
Linguagem de código: Python ( python )
Em seguida, reúna os dados de cobertura executando o seguinte comando:
python -m coverage run -m unittest
Em seguida, gere o relatório de cobertura executando o seguinte comando:
python -m coverage report
Saída:
Name Stmts Miss Cover
-----------------------------------------
shapes\circle.py 11 1 91%
shapes\shape.py 4 0 100%
shapes\square.py 9 0 100%
test\__init__.py 0 0 100%
test\test_circle.py 14 0 100%
test\test_square.py 14 0 100%
-----------------------------------------
TOTAL 52 1 98%
Linguagem de código: texto simples ( texto simples )
A cobertura agora é de 98% no total e 91% no shape\circle.py
módulo. Isso ocorre porque o perimeter()
método não foi testado.
Depois disso, gere o relatório de cobertura em formato HTML:
python -m coverage html
O circle.py
tem 11 declarações. O teste executa 10 deles e perde uma instrução. Portanto, a cobertura do teste é de 11/10 ~ 91%.
Por fim, clique no circle.py
módulo para obter o relatório detalhado:
Resumo
- Use o
python -m coverage run -m unittest
comando para coletar dados de cobertura e opython -m coverage report
comando para gerar um relatório de cobertura. - Use
python -m coverage html
para gerar o relatório de cobertura de teste em formato HTML.