UnitTest Framework - Módulo Py.test

Fue en 2004 que Holger Krekel renombró su stdpaquete, cuyo nombre se confundía a menudo con el de la biblioteca estándar que se envía con Python, con el nombre (solo un poco menos confuso) 'py'. Aunque el paquete contiene varios subpaquetes, ahora se lo conoce casi en su totalidad por su marco py.test.

El marco py.test ha establecido un nuevo estándar para las pruebas de Python y se ha vuelto muy popular entre muchos desarrolladores en la actualidad. Los modismos elegantes y Pythonic que introdujo para la escritura de prueba han hecho posible que las suites de prueba se escriban en un estilo mucho más compacto.

py.test es una alternativa no estándar al módulo unittest estándar de Python. A pesar de ser una herramienta de prueba extensible y con todas las funciones, cuenta con una sintaxis simple. Crear un conjunto de pruebas es tan fácil como escribir un módulo con un par de funciones.

py.test se ejecuta en todos los sistemas operativos POSIX y WINDOWS (XP / 7/8) con las versiones de Python 2.6 y superiores.

Instalación

Utilice el siguiente código para cargar el módulo pytest en la distribución actual de Python, así como una utilidad py.test.exe. Las pruebas se pueden ejecutar con ambos.

pip install pytest

Uso

Simplemente puede usar la declaración de aserción para afirmar las expectativas de la prueba. La introspección de aserción de pytest informará inteligentemente los valores intermedios de la expresión de aserción, liberándolo de la necesidad de aprender los muchos nombres deJUnit legacy methods.

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

Utilice la siguiente línea de comando para ejecutar la prueba anterior. Una vez que se ejecuta la prueba, el siguiente resultado se muestra en la consola:

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 ====================

La prueba también se puede ejecutar desde la línea de comandos al incluir el módulo pytest usando el interruptor –m.

python -m pytest test_sample.py

Agrupar varias pruebas en una clase

Una vez que comienza a tener más de unas pocas pruebas, a menudo tiene sentido agrupar las pruebas de manera lógica, en clases y módulos. Escribamos una clase que contenga dos pruebas:

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

Se mostrará el siguiente resultado de la prueba:

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 ======================