Saltar a contenido

Referencia de API

Ejecutor de Tests

pytest.main(args=None)

Ejecuta tests con los argumentos dados. Retorna código de salida (0 = todos pasaron).

import oxytest as pytest
exit_code = pytest.main(["-v", "tests/"])

pytest.discover_tests(root_dir, pattern=None)

Descubre tests en un directorio. Retorna lista de objetos TestItem.

from oxytest import discover_tests
tests = discover_tests("tests/")

pytest.run_tests(tests, num_workers=None, nocapture=False)

Ejecuta tests en paralelo usando el pool de hilos Rayon.

pytest.run_tests_sequential(tests, nocapture=False)

Ejecuta tests secuencialmente en el hilo actual.

Aserciones

pytest.approx(expected, rel=None, abs=None, nan_ok=False)

Aserta igualdad aproximada para números de punto flotante.

assert 0.1 + 0.2 == pytest.approx(0.3)

pytest.raises(expected_exception, match=None)

Aserta que un bloque lanza una excepción.

with pytest.raises(ValueError, match="inválido"):
    int("literal inválido")

Reescritura de Asserts

Oxytest reescribe automáticamente los assert para producir mensajes detallados:

# En vez de: AssertionError
# Obtienes: AssertionError: assert 1 == 2
#                               1 == 2
assert x == y

# Con --showlocals:
#   AssertionError: assert 1 == 2
#                   1 == 2
#
#   Locals:
#     x = 1
#     y = 2

Fixtures

pytest.fixture(scope="function", params=None, autouse=False, name=None)

Decorador para definir un fixture.

@pytest.fixture
def base_datos():
    db = crear_base_datos()
    yield db
    db.cerrar()

@pytest.fixture(scope="module", autouse=True)
def setup_once():
    print("ejecuta una vez por módulo")

Yield Fixtures

Los yield fixtures ejecutan teardown automáticamente:

@pytest.fixture
def recurso():
    print("setup")
    yield valor
    print("teardown")  # se ejecuta después del test

Fixtures Integrados

Fixture Descripción
tmp_path Directorio temporal (pathlib.Path), limpiado tras el test
tmpdir Directorio temporal (str), legado
capsys Capturar stdout/stderr durante el test
capfd Capturar descriptores de archivo durante el test
monkeypatch Modificar atributos, entorno y diccionarios
def test_con_tmp_path(tmp_path):
    d = tmp_path / "subdir"
    d.mkdir()
    assert d.exists()

def test_captura(capsys):
    print("hola")
    out, err = capsys.readouterr()
    assert "hola" in out

Marcadores

pytest.mark.parametrize(argnames, argvalues)

Ejecuta un test múltiples veces con diferentes argumentos.

@pytest.mark.parametrize("x,esperado", [(1, 2), (3, 6)])
def test_doble(x, esperado):
    assert x * 2 == esperado

pytest.mark.skip(reason=None)

Salta un test.

@pytest.mark.skip(reason="no implementado")
def test_pendiente():
    pass

pytest.mark.skipif(condition, reason=None)

Salta un test condicionalmente.

import sys
@pytest.mark.skipif(sys.version_info < (3, 10), reason="necesita 3.10+")
def test_nueva_funcionalidad():
    pass

pytest.mark.xfail(reason=None, condition=None, raises=None, strict=None)

Marca un test como que se espera que falle.

@pytest.mark.xfail(reason="problema conocido")
def test_inestable():
    assert False

pytest.mark.usefixtures(*names)

Aplica fixtures a un test o clase sin inyectarlos como parámetros.

@pytest.mark.usefixtures("base_datos")
class TestSuite:
    def test_consulta(self):
        ...  # fixture base_datos está activo

@pytest.mark.usefixtures("setup")
def test_con_setup():
    ...

Utilidades

pytest.skip(reason)

Salta el test actual de forma imperativa.

pytest.fail(reason)

Falla el test actual de forma imperativa.

pytest.importorskip(modname, minversion=None, reason=None)

Importa un módulo o salta si no está disponible.

pytest.set_trace()

Inicia un depurador (usa pdb).

pytest.exit(exit_code=0)

Sale de la sesión de tests.

pytest.param(values, id=None, marks=None)

Crea un argumento parametrizado con id o marcas personalizadas.

@pytest.mark.parametrize("x", [
    pytest.param(1, id="uno"),
    pytest.param(2, marks=pytest.mark.skip),
])
def test_valores(x):
    ...

Sistema de Plugins

hookimpl(tryfirst=False, trylast=False, hookwrapper=False)

Decorador para implementaciones de hooks de plugins.

from oxytest import hookimpl

@hookimpl
def pytest_addoption(parser):
    parser.addoption("--mi-flag", action="store_true")

@hookimpl(tryfirst=True)
def pytest_configure(config):
    value = config.getoption("--mi-flag")

hookspec(tryfirst=False, trylast=False)

Decorador para definir especificaciones de hooks.

Config

Contiene opciones CLI parseadas y estado del plugin.

from oxytest import Config
config = Config(opts)
value = config.getoption("--mi-flag")

Parser

Interfaz tipo argparse para hooks pytest_addoption.

parser.addoption("--mi-flag", action="store_true", help="...")

PluginManager

Gestiona registro de plugins y llamadas a hooks.

from oxytest import get_plugin_manager
pm = get_plugin_manager()
pm.load_entry_point_plugins()

get_plugin_manager()

Obtiene la instancia singleton del gestor de plugins.

Herramienta de Migración

# Previsualizar migración de pytest → oxytest
oxytest migrate src/ --dry-run

# Realizar migración
oxytest migrate src/

# Reversa: oxytest → pytest
oxytest migrate src/ --reverse

# Solo verificar (código 1 si encuentra imports de pytest)
oxytest migrate src/ --check

Flags de CLI

Flag Descripción
-v, --verbose Aumentar verbosidad
-q, --quiet Salida silenciosa
-x, --exitfirst Detener en el primer fallo
-k EXPR Filtrar tests por expresión clave
--tb=estilo Estilo de traceback (short, long, native, no)
-n WORKERS Número de workers paralelos (auto = CPUs)
--junitxml=RUTA Generar reporte JUnit XML
-s No capturar stdout/stderr
--maxfail=N Detener después de N fallos
-p PLUGIN Cargar plugin (repetible)
--ignore=RUTA Ignorar ruta de test (repetible)
--collect-only, --co Solo recolectar tests
--durations=N Mostrar N tests más lentos
-r[caracteres] Resumen extra (-rA, -rf, -rs)
--showlocals Mostrar variables locales en tracebacks
--strict-markers Marcadores desconocidos causan error
--rootdir=RUTA Directorio raíz para descubrimiento
--fixtures Listar fixtures disponibles
--markers Listar marcadores registrados
--setup-show Imprimir setup/teardown de fixtures
--cache-clear Limpiar caché antes de ejecutar
--lf, --last-failed Solo tests que fallaron antes
--ff, --failed-first Fallos primero, luego el resto
--pdb Depurador post-mortem al fallar
--trace Depurador antes de cada test
--cov[=FUENTE] Medir cobertura de código
--cov-report=TIPO Tipo de reporte (term, html, xml)
--cov-config=ARCHIVO Archivo de configuración para coverage
--cov-branch Habilitar cobertura de ramas
--cov-fail-under=N Fallar si cobertura menor a N%
--cov-append Añadir a datos de cobertura existentes
--version Mostrar versión
-h, --help Mostrar ayuda

Códigos de Salida

Código Significado
0 Todos los tests pasaron
1 Algunos tests fallaron
2 Error de ejecución de tests
4 No se recolectaron tests