Cobertura de teste unitário Python

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 unittestcobertura. 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.htmlLinguagem de código:  CSS  ( css )

A saída indica a localização do relatório de cobertura HTML htmlcov\index.htmlna pasta do projeto.

Se você abrir o arquivo index.html da htmlcovpasta, ele terá a seguinte aparência:

cobertura de teste unitário python

Examinando o relatório detalhado da cobertura unittest

Primeiro, adicione o perimeter()método à Circleclasse 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.pymó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.pytem 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.pymódulo para obter o relatório detalhado:

Resumo

  • Use o python -m coverage run -m unittestcomando para coletar dados de cobertura e o python -m coverage reportcomando para gerar um relatório de cobertura.
  • Use python -m coverage htmlpara gerar o relatório de cobertura de teste em formato HTML.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *