Estrutura UnitTest - Módulo Py.test

Foi em 2004 que Holger Krekel rebatizou seu stdpacote, cujo nome era frequentemente confundido com o da Biblioteca Padrão que acompanha o Python, com o nome (apenas um pouco menos confuso) 'py'. Embora o pacote contenha vários subpacotes, agora é conhecido quase inteiramente por sua estrutura py.test.

A estrutura py.test configurou um novo padrão para testes Python e se tornou muito popular entre muitos desenvolvedores hoje. As expressões elegantes e Pythônicas que ele introduziu para a escrita de teste tornaram possível que as suítes de teste fossem escritas em um estilo muito mais compacto.

py.test é uma alternativa sem clichês ao módulo unittest padrão do Python. Apesar de ser uma ferramenta de teste extensível e cheia de recursos, ela se orgulha de uma sintaxe simples. Criar um conjunto de testes é tão fácil quanto escrever um módulo com algumas funções.

py.test é executado em todos os sistemas operacionais POSIX e WINDOWS (XP / 7/8) com Python versões 2.6 e superiores.

Instalação

Use o código a seguir para carregar o módulo pytest na distribuição Python atual, bem como um utilitário py.test.exe. Os testes podem ser executados usando ambos.

pip install pytest

Uso

Você pode simplesmente usar a instrução assert para afirmar as expectativas de teste. a introspecção assert de pytest relatará de forma inteligente os valores intermediários da expressão assert, liberando você da necessidade de aprender os muitos nomes deJUnit legacy methods.

# content of test_sample.py
def func(x):
   return x + 1
   
def test_answer():
   assert func(3) == 5

Use a seguinte linha de comando para executar o teste acima. Depois que o teste é executado, o seguinte resultado é exibido no console -

C:\Python27>scripts\py.test -v test_sample.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyth
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 1 items
test_sample.py::test_answer FAILED
================================== FAILURES =====================
_________________________________ test_answer _________________________________
   def test_answer():
>  assert func(3) == 5
E     assert 4 == 5
E     + where 4 = func(3)
test_sample.py:7: AssertionError
========================== 1 failed in 0.05 seconds ====================

O teste também pode ser executado a partir da linha de comando incluindo o módulo pytest usando o switch –m.

python -m pytest test_sample.py

Agrupando vários testes em uma classe

Quando você começa a ter mais do que alguns testes, geralmente faz sentido agrupar os testes de forma lógica, em classes e módulos. Vamos escrever uma classe contendo dois testes -

class TestClass:
   def test_one(self):
      x = "this"
      assert 'h' in x
   def test_two(self):
      x = "hello"
      assert hasattr(x, 'check')

O seguinte resultado do teste será exibido -

C:\Python27>scripts\py.test -v test_class.py
============================= test session starts =====================
platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:\Pyt
on27\python.exe
cachedir: .cache
rootdir: C:\Python27, inifile:
collected 2 items
test_class.py::TestClass::test_one PASSED
test_class.py::TestClass::test_two FAILED
================================== FAILURES =====================
_____________________________ TestClass.test_two ______________________________
self = <test_class.TestClass instance at 0x01309DA0>

   def test_two(self):
      x = "hello"
>  assert hasattr(x, 'check')
E     assert hasattr('hello', 'check')

test_class.py:7: AssertionError
===================== 1 failed, 1 passed in 0.06 seconds ======================