Organizando código e executando unittest

Resumo : neste tutorial, você aprenderá como organizar o código de teste e como usar os vários comandos para executar testes de unidade.

Organizando código

Se você tiver alguns módulos , poderá criar módulos de teste e colocá-los no mesmo diretório.

Na prática, você pode ter muitos módulos organizados em pacotes . Portanto, é importante manter o código de desenvolvimento e o código de teste mais organizados.

É uma boa prática manter o código de desenvolvimento e o código de teste em diretórios separados. E você deve colocar o código de teste em um diretório chamado testpara torná-lo óbvio.

Para fins de demonstração, criaremos um projeto de exemplo com a seguinte estrutura:

D:\python-unit-testing
├── shapes
|  ├── circle.py
|  ├── shape.py
|  └── square.py
└── test
   ├── test_circle.py
   ├── test_square.py
   └── __init__.pyLinguagem de código:  Python  ( python )

Primeiro, crie os diretórios shapese testna pasta do projeto ( python-unit-testing).

Segundo, crie três módulos shape.py, circle.pye square.pymódulos e coloque-os no shapesdiretório.

forma.py

from abc import ABC, abstractmethod


class Shape(ABC):
    @abstractmethod
    def area() -> float:
        passLinguagem de código:  Python  ( python )

A Shapeclasse é uma classe abstrata que possui o area()método. É a classe base da classe Circleand Square.

círculo.py

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)Linguagem de código:  Python  ( python )

A Circleclasse também herda da Shapeclasse. Implementa o area()método que retorna a área do círculo.

quadrado.py

import math
from .shape import Shape


class Square(Shape):
    def __init__(self, length: float) -> None:
        if length < 0:
            raise ValueError('The length cannot be negative')
        self._length = length

    def area(self) -> float:
        return math.pow(self._length, 2)Linguagem de código:  Python  ( python )

Assim como a Circleclasse, a Squareclasse possui o area()método que retorna a área do quadrado.

Terceiro, crie os módulos test_circle.pye test_square.pyteste e coloque-os na testpasta:

test_circle.py

import unittest
import math

from shapes.circle import Circle
from shapes.shape import Shape


class TestCircle(unittest.TestCase):
    def test_circle_instance_of_shape(self):
        circle = Circle(10)
        self.assertIsInstance(circle, Shape)

    def test_create_circle_negative_radius(self):
        with self.assertRaises(ValueError):
            circle = Circle(-1)

    def test_area(self):
        circle = Circle(2.5)
        self.assertAlmostEqual(circle.area(), math.pi * 2.5*2.5)Linguagem de código:  Python  ( python )

O test_circlemódulo usa o Circlee Shapedos módulos de circleteste shapeno shapespacote.

test_square.py

import unittest

from shapes.square import Square
from shapes.shape import Shape


class TestSquare(unittest.TestCase):

    def test_create_square_negative_length(self):
        with self.assertRaises(ValueError):
            square = Square(-1)

    def test_square_instance_of_shape(self):
        square = Square(10)
        self.assertIsInstance(square, Shape)

    def test_area(self):
        square = Square(10)
        area = square.area()
        self.assertEqual(area, 100)Linguagem de código:  Python  ( python )

O test_squaremódulo usa as classes Squaree Shapedos módulos squaree shapedo shapespacote.

É importante criar um __init__.pyarquivo e colocá-lo na testpasta. Caso contrário, os comandos da seção a seguir não funcionarão conforme o esperado.

Executando testes unitários

O módulo unittest fornece muitas maneiras de executar testes de unidade.

1) Executando todos os testes

Para executar todos os testes no testdiretório, execute o seguinte comando na pasta do diretório do projeto ( python-unit-testing):

python -m unittest discover -vLinguagem de código:  Python  ( python )

O discoveré um subcomando que encontra todos os testes do projeto.

Saída:

test_area (test_circle.TestCircle) ... ok
test_circle_instance_of_shape (test_circle.TestCircle) ... ok
test_create_circle_negative_radius (test_circle.TestCircle) ... ok
test_area (test_square.TestSquare) ... ok
test_create_square_negative_length (test_square.TestSquare) ... ok
test_square_instance_of_shape (test_square.TestSquare) ... ok

----------------------------------------------------------------------
Ran 6 tests in 0.002s

OKLinguagem de código:  Python  ( python )

2) Executando um único módulo de teste

Para executar um único módulo de teste, use o seguinte comando:

python -m unittest test_package.test_module -vLinguagem de código:  Python  ( python )

Por exemplo, execute todos os testes no test_circlemódulo do testpacote:

python -m unittest test.test_circle -vLinguagem de código:  Python  ( python )

Saída:

test_area (test.test_circle.TestCircle) ... ok
test_circle_instance_of_shape (test.test_circle.TestCircle) ... ok     
test_create_circle_negative_radius (test.test_circle.TestCircle) ... ok

---------------------------------------------------------------------- 
Ran 3 tests in 0.000s

OKLinguagem de código:  Python  ( python )

3) Executando uma única classe de teste

Um módulo de teste pode ter múltiplas classes. Para executar uma única classe de teste em um módulo de teste, use o seguinte comando:

python -m unittest test_package.test_module.TestClass -vLinguagem de código:  Python  ( python )

Por exemplo, o comando a seguir testa a TestSquareclasse do test_squaremódulo do pacote de teste:

python -m unittest test.test_circle.TestCircle -vLinguagem de código:  Python  ( python )

Saída:

test_area (test.test_square.TestSquare) ... ok
test_create_square_negative_length (test.test_square.TestSquare) ... ok
test_square_instance_of_shape (test.test_square.TestSquare) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OKLinguagem de código:  Python  ( python )

4) Executando um único método de teste

Para executar um único método de teste de uma classe de teste, use o seguinte comando:

python -m unittest test_package.test_module.TestClass.test_method -vLinguagem de código:  Python  ( python )

Por exemplo, o comando a seguir testa o test_area()método da TestCircleclasse:

python -m unittest test.test_circle.TestCircle.test_area -vLinguagem de código:  Python  ( python )

Saída:

test_area (test.test_circle.TestCircle) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OKLinguagem de código:  Python  ( python )

Resumo

  • Coloque o código de desenvolvimento e o código de teste em diretórios separados. É uma boa prática armazenar o código de teste no diretório de teste.
  • Use o comando python -m unittest discover -vpara descobrir e executar todos os testes.
  • Use o comando python -m unittest test_package.test_module -vpara executar um único módulo de teste.
  • Use o comando python -m unittest test_package.test_module.TestClass -vpara executar uma única classe de teste.
  • Use o comando python -m unittest test_package.test_module.TestClass.test_method-v para executar um único método de teste.

Deixe um comentário

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