Resumo : neste tutorial, você aprenderá como definir testes parametrizados usando o gerenciador de contexto do unittestsubTest()
.
Introdução ao gerenciador de contexto de subteste unittest
Primeiro, crie um novo módulo chamado pricing.py
e defina uma calculate()
função da seguinte forma:
def calculate(price, tax=0, discount=0):
return round((price - discount) * (1+tax), 2)
Linguagem de código: Python ( python )
A calculate()
função calcula o preço líquido a partir do preço, imposto e desconto.
Segundo, crie o test_pricing.py
módulo de teste para testar a calculate()
função:
import unittest
from pricing import calculate
class TestPricing(unittest.TestCase):
def test_calculate(self):
pass
Linguagem de código: Python ( python )
Para testar a calculate()
função, você precisa criar vários casos de teste, por exemplo:
- Tem preço sem imposto e sem desconto
- Tem preço com imposto mas sem desconto
- Tem preço sem imposto e desconto
- Tem preço com imposto e desconto
Para cobrir esses casos, você precisa de vários métodos de teste. Ou você pode definir um único método de teste e fornecer dados de teste a partir de uma lista de casos. Por exemplo:
import unittest
from pricing import calculate
class TestPricing(unittest.TestCase):
def test_calculate(self):
items = (
{'case': 'No tax, no discount', 'price': 10, 'tax': 0, 'discount': 0, 'net_price': 10},
{'case': 'Has tax, no discount', 'price': 10, 'tax': 0.1, 'discount': 0, 'net_price': 10},
{'case': 'No tax, has discount', 'price': 10, 'tax': 0, 'discount': 1, 'net_price': 10},
{'case': 'Has tax, has discount', 'price': 10, 'tax': 0.1, 'discount': 1, 'net_price': 9.9},
)
for item in items:
with self.subTest(item['case']):
net_price = calculate(
item['price'],
item['tax'],
item['discount']
)
self.assertEqual(
net_price,
item['net_price']
)
Linguagem de código: Python ( python )
Execute o teste:
python -m unittest test_pricing -v
Linguagem de código: Python ( python )
Saída:
test_calculate (test_pricing.TestPricing) ... FAIL
======================================================================
FAIL: test_calculate (test_pricing.TestPricing)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\python-unit-testing\test_pricing.py", line 26, in test_calculate
self.assertEqual(
AssertionError: 11.0 != 10
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (failures=1)
Linguagem de código: texto simples ( texto simples )
O problema com esta abordagem é que o teste para após a primeira falha. Para resolver isso, o unittest fornece o subTest()
gerenciador de contexto. Por exemplo:
import unittest
from pricing import calculate
class TestPricing(unittest.TestCase):
def test_calculate(self):
items = (
{'case': 'No tax, no discount', 'price': 10, 'tax': 0, 'discount': 0, 'net_price': 10},
{'case': 'Has tax, no discount', 'price': 10, 'tax': 0.1, 'discount': 0, 'net_price': 10},
{'case': 'No tax, has discount', 'price': 10, 'tax': 0, 'discount': 1, 'net_price': 10},
{'case': 'Has tax, has discount', 'price': 10, 'tax': 0.1, 'discount': 1, 'net_price': 9.9},
)
for item in items:
with self.subTest(item['case']):
net_price = calculate(
item['price'],
item['tax'],
item['discount']
)
self.assertEqual(
net_price,
item['net_price']
)
Linguagem de código: Python ( python )
Execute o teste:
python -m unittest test_pricing -v
Linguagem de código: Python ( python )
Saída:
test_calculate (test_pricing.TestPricing) ...
======================================================================
FAIL: test_calculate (test_pricing.TestPricing) [Has tax, no discount]
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\python-unit-testing\test_pricing.py", line 26, in test_calculate
self.assertEqual(
AssertionError: 11.0 != 10
======================================================================
FAIL: test_calculate (test_pricing.TestPricing) [No tax, has discount]
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\python-unit-testing\test_pricing.py", line 26, in test_calculate
self.assertEqual(
AssertionError: 9 != 10
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=2)
Linguagem de código: texto simples ( texto simples )
Ao utilizar o subTest()
gerenciador de contexto, o teste não parou após a primeira falha. Além disso, mostra uma mensagem muito detalhada após cada falha para que você possa examinar o caso.
A sintaxe do gerenciador de contexto subTest()
O seguinte mostra a subTest()
sintaxe do gerenciador de contexto:
def subTest(self, msg=_subtest_msg_sentinel, **params):
Linguagem de código: Python ( python )
O subTest()
retorna um gerenciador de contexto. O parâmetro opcional message
identifica o bloco fechado do subteste retornado pelo gerenciador de contexto.
Se ocorrer uma falha, o caso de teste será marcado como falhado. No entanto, ele retoma a execução no final do bloco fechado, permitindo que mais códigos de teste sejam executados.
Resumo
- Use o
subTest()
gerenciador de contexto unittest para parametrizar testes.