Práctica con el framework Pytest - 1 - Instalación - Aserciones con assertpy - Ejecución de pruebas

Tutorial de Pytest

Instalación de pytest

pip install pytest


Creación de archivos de prueba

pytest busca automáticamente archivos Python que comiencen o terminen con 'test' en el directorio actual

Archivo test_01.py

# fun1 es la función que vamos a probar: recibe un parámetro y lo incrementa en 1
def fun1(x):
    """
    Supongamos que por error escribimos 0.1 en lugar de 1 durante el desarrollo
    :param x:
    :return:
    """
    return x + 0.1


def test_fun1():
    assert fun1(10) == 11


Ejecutamos desde PyCharm haciendo clic derecho

Resultado de ejecución:

============================= test session starts =============================
collecting ... collected 1 item

test_01.py::test_fun1 FAILED                                             [100%]
test_01.py:10 (test_fun1)
10.1 != 11

Expected :11
Actual   :10.1
<Click to see difference>

def test_fun1():
>       assert fun1(10) == 11
E       assert 10.1 == 11
E        +  where 10.1 = fun1(10)

test_01.py:12: AssertionError


Mejora en las aserciones

Creamos otro archivo test_02.py

from assertpy import assert_that  # Recordar instalar con pip install


# fun1 es la función que vamos a probar: recibe un parámetro y lo incrementa en 1
def fun1(x):
    """
    Supongamos que por error escribimos 0.1 en lugar de 1 durante el desarrollo
    :param x:
    :return:
    """
    return x + 0.1


def test_fun1():
    assert fun1(10) == 11
    
def test_fun2():
    assert_that(fun1(10)).is_equal_to(11)


Importante: Los nombres de los casos de prueba no deben repetirse

Solo vemos la salida del caso test_fun2:

============================= test session starts =============================
collecting ... collected 1 item

test_02.py::test_fun2 FAILED                                             [100%]
test_02.py:13 (test_fun2)
def test_fun2():
>       assert_that(fun1(10)).is_equal_to(11)
E       AssertionError: Expected <10.1> to be equal to <11>, but was not.

test_02.py:15: AssertionError


Agregamos un nuevo caso de prueba en test_02.py

def test_fun3():
    assert_that(fun1(10)).is_instance_of(int)


Salida resultante:

test_02.py::test_fun3 FAILED                                             [100%]
test_02.py:17 (test_fun3)
def test_fun3():
>       assert_that(fun1(10)).is_instance_of(int)
E       AssertionError: Expected <10.1:float> to be instance of class <int>, but was not.

test_02.py:19: AssertionError


La razón para usar la librería de aserciones assertpy se vuelve evidente después de escribir muchas aserciones, ¡es realmente útil!

Para aprender más sobre assertpy, puedes revisar su repositorio en GitHub, seguiremos explorando sus capacidades en futuras entradas

Métodos comunes para ejecutar pruebas

  1. Ejecutar todas las pruebas desde PyCharm haciendo clic derecho
  2. Ejecutar una prueba específica desde PyCharm (verificar configuración en la esquina superior izquierda)
  3. Desde terminal (PowerShell)
pytest  .\test_02.py


  1. Usar Python directamente, requiere añadir código en test.py
if __name__ == '__main__':
    pytest.main(['./test_03.py'])


Luego ejecutar desde terminal:

python .\test_03.py


Vamos a explicar detalladamente el cuarto método, ya que será común en proyectos reales (porque nuestros scripts automatizados deben funcionar en máquinas sin instalaciones previas de pip, pytest o PyCharm). Creamos test_03.py

from assertpy import assert_that
import pytest


# fun1 es la función que vamos a probar: recibe un parámetro y lo incrementa en 1
def fun1(x):
    """
    Supongamos que por error escribimos 0.1 en lugar de 1 durante el desarrollo
    :param x:
    :return:
    """
    return x + 0.1


def test_fun4():
    print('Este caso falla, este mensaje se imprimirá')
    assert_that(fun1(10)).is_equal_to(11)


def test_fun5():
    print('Este caso pasa, este mensaje no se imprimirá')
    assert_that(fun1(10)).is_instance_of(float)


if __name__ == '__main__':
    pytest.main(['./test_02_01.py::test_fun5'])  # No ejecutar todo con: pytest.main(['./']) 


Ejecutamos desde terminal:

python .\test_03.py


Resultado:

Nota: En esta salida no aparece nuestro mensaje de impresión, aunque test_fun5 tiene un print

Hasta aquí llegamos hoy, mañana continuaremos hablando sobre cómo usar print dentro de pytest

Etiquetas: pytest assertpy testing Python Unit Testing

Publicado el 9-27 18:41