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 test
para 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__.py
Linguagem de código: Python ( python )
Primeiro, crie os diretórios shapes
e test
na pasta do projeto ( python-unit-testing
).
Segundo, crie três módulos shape.py
, circle.py
e square.py
módulos e coloque-os no shapes
diretório.
forma.py
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area() -> float:
pass
Linguagem de código: Python ( python )
A Shape
classe é uma classe abstrata que possui o area()
método. É a classe base da classe Circle
and 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 Circle
classe também herda da Shape
classe. 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 Circle
classe, a Square
classe possui o area()
método que retorna a área do quadrado.
Terceiro, crie os módulos test_circle.py
e test_square.py
teste e coloque-os na test
pasta:
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_circle
módulo usa o Circle
e Shape
dos módulos de circle
teste shape
no shapes
pacote.
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_square
módulo usa as classes Square
e Shape
dos módulos square
e shape
do shapes
pacote.
É importante criar um __init__.py
arquivo e colocá-lo na test
pasta. 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 test
diretório, execute o seguinte comando na pasta do diretório do projeto ( python-unit-testing
):
python -m unittest discover -v
Linguagem 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
OK
Linguagem 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 -v
Linguagem de código: Python ( python )
Por exemplo, execute todos os testes no test_circle
módulo do test
pacote:
python -m unittest test.test_circle -v
Linguagem 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
OK
Linguagem 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 -v
Linguagem de código: Python ( python )
Por exemplo, o comando a seguir testa a TestSquare
classe do test_square
módulo do pacote de teste:
python -m unittest test.test_circle.TestCircle -v
Linguagem 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
OK
Linguagem 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 -v
Linguagem de código: Python ( python )
Por exemplo, o comando a seguir testa o test_area()
método da TestCircle
classe:
python -m unittest test.test_circle.TestCircle.test_area -v
Linguagem de código: Python ( python )
Saída:
test_area (test.test_circle.TestCircle) ... ok
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Linguagem 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 -v
para descobrir e executar todos os testes. - Use o comando
python -m unittest test_package.test_module -v
para executar um único módulo de teste. - Use o comando
python -m unittest test_package.test_module.TestClass -v
para 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.