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 pytest → import oxytest as pytest
- from pytest import ... → from oxytest import ...
- from pytest import approx, raises → (imports multi-módulo)
- Aliases (import pytest as pt → import 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.