Subteste de teste unitário do Python

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.pye 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.pymódulo de teste para testar a calculate()função:

import unittest

from pricing import calculate


class TestPricing(unittest.TestCase):
    def test_calculate(self):
        passLinguagem 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 -vLinguagem 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 -vLinguagem 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 messageidentifica 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.

Deixe um comentário

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