Saltar a contenido

Pruebas 🚔

Callisto incluye pytest, una herramienta que facilita la escritura de pruebas de forma sencilla y flexible, favoreciendo la detección de errores en el código. Y puede escalarse para soportar pruebas funcionales complejas para aplicaciones y bibliotecas.

La configuración para pytest está definida en el archivo pyproject.toml, en el apartado de tool.pytest.ini_options.

[tool.pytest.ini_options]
minversion = "8.0"
addopts = "--strict-config --maxfail=10 -rA -vv --cache-clear --durations=5 --durations-min=3"
testpaths = [
  "tests",
]
markers = [
  "py311: marks tests that require Python 3.11 or higher",
  "contrib: marks tests that require 'contrib' modules",
  "utils: marks tests that require 'utils' modules",
  "http_rest: marks tests that require 'running backend'",
  "testing: marks tests during development",
  "backend: marks tests that require 'running backend again'"
]

Nota

Los comandos listados a continuación están definidos en el archivo pyproject.toml, en el apartado de tool.poetry-exec-plugin.commands.

Ejecutar todas las pruebas

Para tener en cuenta

Este comando requiere que el BackEnd de servicios se este ejecutando.

$ poetry exec test-all

Ejecutar todas las pruebas sin iniciar el BackEnd

$ poetry exec test-no-back

Creando tus propios conjuntos de prueba con pytest

Callisto ubica todos los archivos de pruebas, en la carpeta tests, ubicada en la carpeta raíz del proyecto, para iniciar, crea un archivo de prueba, que comience con el prefijo test_, veamos un ejemplo:

1
2
3
4
5
├── tests/
│   ├── app/
│   │   ├── utils/
│   │   │   ├── __init__.py
│   │   │   └── test_commons.py

ya creado nuestro archivo, define funciones que comiencen también con test_, ejemplo:

def test_common_validate_email():
    ...

Ahora utilizaremos @pytest.mark, un decorador en pytest, que se utiliza para "marcar" pruebas con una etiqueta específica, en este caso, "utils". Esta etiqueta puede servir para organizar y agrupar pruebas relacionadas, facilitando su ejecución o filtrado.

Nota

En el apartado de tool.pytest.ini_options. comentado mas arriba, se detallan las marcas utilizadas en Callisto. Si deseas agregar una nueva marca, deberás registrarla en ese apartado.

1
2
3
@pytest.mark.utils
def test_common_validate_email():
    ...

Finalmente dentro de nuestra función de prueba, utiliza assert, inspect, callable... entre otras funciones de utilidad, para comprobar el comportamiento de tu código.

def test_common_validate_email():
    # valida si la función esta definida
    assert validate_email is not None

    # valida si es una función propiamente dicha
    assert inspect.isfunction(validate_email)

    # valida si la función se puede invocar
    assert callable(validate_email)

    # inicia la prueba, llama a la función
    # `validate_email` y le pasa un parámetro
    result = validate_email("user@example.com")

    # valida si el resultado no es nulo
    assert result is not None

    # valida la respuesta y verifica
    # si el email enviado, es un email valido
    assert result is True

Para tener en cuenta

Puedes ejecutar tus pruebas invocando a pytest con el nombre de la marca, para evitar ejecutar las demás pruebas del resto del BackEnd, ejemplo:

poetry run pytest -m utils

Ahora veamos como queda el archivo de prueba ya completo:

# -*- coding: utf-8 -*-

import inspect
import pytest
from app.utils.commons import validate_email


@pytest.mark.utils
def test_common_validate_email():
    assert validate_email is not None
    assert inspect.isfunction(validate_email)
    assert callable(validate_email)

    result = validate_email("user@example.com")
    assert result is not None
    assert result is True

Lectura recomendada