Saltar a contenido

Migración de pytest a oxytest

Oxytest está diseñado como un reemplazo directo de pytest. En la mayoría de los casos, migrar es tan simple como cambiar una línea de código.

Migración Rápida

1. Instalar oxytest

pip install oxytest

2. Reemplazar el import

Antes (pytest):

import pytest

Después (oxytest):

import oxytest as pytest

Eso es todo. Tus tests existentes deberían funcionar sin cambios.

3. Actualizar tu CI/CD

Reemplaza pytest por oxytest en tu configuración de CI:

# GitHub Actions
- name: Run tests
  run: oxytest -v -n auto

4. Actualizar puntos de entrada

# Antes
import pytest
pytest.main(["-v", "tests/"])

# Después
import oxytest as pytest
pytest.main(["-v", "tests/"])

5. Migración automática con oxytest migrate

Oxytest incluye una herramienta de migración integrada que reescribe tus imports automáticamente:

# Previsualizar cambios (dry run)
oxytest migrate src/ --dry-run

# Realizar migración (pytest → oxytest)
oxytest migrate src/

# Migración reversa (oxytest → pytest)
oxytest migrate src/ --reverse

# Solo verificar — código 1 si quedan imports de pytest
oxytest migrate src/ --check

La herramienta maneja: - import pytestimport oxytest as pytest - from pytest import ...from oxytest import ... - from pytest import approx, raises → (imports multi-módulo) - Aliases (import pytest as ptimport oxytest as pt) - Omite comentarios y strings

Qué Funciona de Inmediato

Característica Estado
pytest.main()
pytest.approx()
pytest.raises()
pytest.fixture()
pytest.mark.parametrize()
pytest.mark.skip()
pytest.mark.skipif()
pytest.mark.xfail()
pytest.mark.usefixtures()
pytest.skip()
pytest.fail()
pytest.importorskip()
pytest.set_trace()
Fixture tmp_path
Fixture capsys
Fixture capfd
Fixture monkeypatch
conftest.py
Clases de tests
Yield fixtures con teardown
Fixtures autouse=True
Reescritura de asserts con diffs
Sistema de plugins (pytest_addoption, pytest_configure, etc.)
Flags -v, -q, -x
Filtro -k
Ejecución paralela -n (integrada)
Salida JUnit XML
Control de captura -s

Diferencias

1. Ejecución paralela integrada

No necesitas pytest-xdist:

# pytest (requiere plugin)
pip install pytest-xdist
pytest -n 4

# oxytest (integrado)
oxytest -n 4

2. Descubrimiento de tests más rápido

Oxytest usa escaneo AST (Árbol de Sintaxis Abstracta) en lugar de importar módulos. Esto hace que el descubrimiento sea 10-100x más rápido para proyectos grandes. La desventaja es que algunos patrones de generación dinámica de tests (como atributos __test__ en __init__) pueden no ser descubiertos.

3. Soporte de cobertura

oxytest tiene soporte nativo de --cov (requiere pip install coverage o pip install oxytest[cov]). Usa --cov=FUENTE para medir cobertura, o ejecuta coverage run -m oxytest para usar sin configuración.

Comparación de Flags CLI

pytest oxytest Notas
pytest oxytest Mismo comportamiento
-v -v
-q -q
-x -x
-k -k
--tb=short --tb=short
--tb=long --tb=long
--tb=native --tb=native
--tb=no --tb=no
--junitxml --junitxml
-s -s
--maxfail --maxfail
-n -n Integrado, sin plugin
--ignore --ignore
--collect-only --collect-only (+ --co)
--durations --durations
-r -r
--showlocals --showlocals
--strict-markers --strict-markers
--rootdir --rootdir
--fixtures --fixtures
--markers --markers
--setup-show --setup-show
--cache-clear --cache-clear
--lf --lf
--ff --ff
-p plugins -p plugins ✅ Integrado, sin plugin
--cov --cov ✅ Requiere coverage.py (dep. opcional)
--pdb --pdb ✅ También --trace
--cov-report --cov-report
--cov-branch --cov-branch
--cov-fail-under --cov-fail-under

4. Integración con VSCode

Oxytest incluye un plugin VSCode integrado (JSON-RPC 2.0 sobre pipe nominal). Cuando VSCode ejecuta -p vscode_pytest, oxytest carga su propia implementación. No se necesita el plugin vscode-pytest.

5. Configuración via pyproject.toml

Oxytest lee la configuración de [tool.oxytest] en pyproject.toml:

[tool.oxytest]
addopts = "-v --tb=short"
testpaths = ["tests/"]

Las flags de CLI tienen prioridad. No se necesita archivo de configuración separado ni setup.cfg. Consulta Uso para todas las opciones soportadas.

Solución de Problemas

¿Test no encontrado?

Asegúrate de que tus archivos de test sigan la convención: test_*.py o *_test.py.

¿Fixture no encontrado?

Oxytest soporta fixtures integrados (tmp_path, capsys, monkeypatch) y fixtures definidos con @pytest.fixture. Asegúrate de que tu conftest.py esté en el directorio correcto.

¿Error de importación?

Oxytest ejecuta tests en el mismo proceso. Si tienes efectos secundarios a nivel de módulo en tus archivos de test, pueden comportarse de manera diferente. Usa conftest.py para configuración compartida.