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
- Ejecutar todas las pruebas desde PyCharm haciendo clic derecho
- Ejecutar una prueba específica desde PyCharm (verificar configuración en la esquina superior izquierda)
- Desde terminal (PowerShell)
pytest .\test_02.py
- 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_fun5tiene un print
Hasta aquí llegamos hoy, mañana continuaremos hablando sobre cómo usar print dentro de pytest