En este tutorial, exploramos las capacidades avanzadas de PyTest, uno de los marcos de prueba más poderosos de Python. Construimos un miniproyecto completo desde cero que demuestra dispositivos, marcadores, complementos, parametrización y configuración personalizada. Nos centramos en mostrar cómo PyTest puede evolucionar desde un simple ejecutor de pruebas hasta un sistema robusto y extensible para aplicaciones del mundo real. Al final, entendemos no solo cómo escribir pruebas, sino también cómo controlar y personalizar el comportamiento de PyTest para satisfacer las necesidades de cualquier proyecto. Consulta los CÓDIGOS COMPLETOS aquí.
Comenzamos configurando nuestro entorno, importando bibliotecas Python esenciales para el manejo de archivos y la ejecución de subprocesos. Instalamos la última versión de PyTest para garantizar la compatibilidad y luego creamos una estructura de proyecto limpia con carpetas para nuestro código principal, módulos de aplicación y pruebas. Esto nos brinda una base sólida para organizar todo claramente antes de escribir cualquier lógica de prueba. Consulta los CÓDIGOS COMPLETOS aquí.
[pytest]
addopts = -q -ra –maxfail=1 -m “no lento” testpaths = marcadores de pruebas = lento: pruebas lentas (use –runslow para ejecutar) io: pruebas que llegan a la API del sistema de archivos: pruebas que parchean llamadas externas “””).strip()+”\n”) (root / “conftest.py”).write_text(textwrap.dedent(r”’ import os, time, pytest, json def pytest_addoption(parser): parser.addoption(“–runslow”, action=”store_true”, help=”ejecutar pruebas lentas”) def pytest_configure(config): config.addinivalue_line(“marcadores”, “lento: pruebas lentas”) config._summary = {“passed”:0,”failed”:0,”skipped”:0,”slow_ran”:0} def pytest_collection_modifyitems(config, items): if config.getoption(“–runslow”): return skip = pytest.mark.skip(reason=”need –runslow to run”) para el elemento en elementos: si es “lento” en item.keywords: item.add_marker(skip) def pytest_runtest_logreport(report): cfg = report.config._summary if report.when==”call”: if report.passed: cfg[“passed”]+=1 informe elif.fallido: cfg[“failed”]+=1 informe elif. omitido: cfg[“skipped”]+=1 si es “lento” en report.keywords y report.passed: cfg[“slow_ran”]+=1 def pytest_terminal_summary(terminalreporter, exitstatus, config): s=config._summary terminalreporter.write_sep(“=”, “RESUMEN DE SESIÓN (complemento personalizado)”) terminalreporter.write_line(f”Aprobado: {s[‘passed’]} | Error: {s[‘failed’]} | Saltado: {s[‘skipped’]}”) terminalreporter.write_line(f”Ejecución de pruebas lentas: {s[‘slow_ran’]}”) terminalreporter.write_line(“PyTest finalizó exitosamente ✅” si s[“failed”]==0 else “Algunas pruebas fallaron ❌”) @pytest.fixture(scope=”session”) def settings(): return {“env”:”prod”,”max_retries”:2} @pytest.fixture(scope=”function”) def event_log(): logs=[]; registros de rendimiento; print(“\\nREGISTRO DE EVENTOS:”, logs) @pytest.fixture def temp_json_file(tmp_path): p=tmp_path/”data.json”; p.write_text(‘{“msg”:”hola”}’); return p @pytest.fixture def fake_clock(monkeypatch): t={“now”:1000.0}; Monkeypatch.setattr(hora,”hora”,lambda: t[“now”]); devolver t ”’))
Ahora creamos nuestros archivos de configuración y complementos de PyTest. En pytest.ini, definimos marcadores, opciones predeterminadas y rutas de prueba para controlar cómo se descubren y filtran las pruebas. En conftest.py, implementamos un complemento personalizado que rastrea las pruebas aprobadas, fallidas y omitidas, agrega una opción –runslow y proporciona accesorios para recursos de prueba reutilizables. Esto nos ayuda a ampliar el comportamiento principal de PyTest mientras mantenemos nuestra configuración limpia y modular. Consulta los CÓDIGOS COMPLETOS aquí.
Ahora construimos el módulo de cálculo central para nuestro proyecto. En el paquete calc, definimos utilidades matemáticas simples, que incluyen suma, división con manejo de errores y una función de promedio móvil, para demostrar pruebas lógicas. Además de esto, creamos una clase Vector que admite operaciones aritméticas, comprobaciones de igualdad y cálculo de normas, un ejemplo perfecto para probar objetos personalizados y comparaciones usando PyTest. Consulta los CÓDIGOS COMPLETOS aquí.
def test_vector_ops(): v=Vector(1,2,3)+Vector(4,5,6); afirmar v==Vector(5,7,9) ”’)) (root/”tests”/”test_io_api.py”).write_text(textwrap.dedent(”’ importar pytest, sistema operativo desde app.io_utils importar save_json,load_json,timed_operation desde app.api importar fetch_username @pytest.mark.io def test_io(temp_json_file,tmp_path): d={“x”:5}; p=tmp_path/”a.json”; save_json(p,d); afirmar load_json(p)==d afirmar load_json(temp_json_file)=={“msg”:”hi”} def test_timed(capsys): val,dt=operación_cronometrada(lambda x:x*3,7); imprimir(“dt=”,dt); out=capsys.readouterr().out afirmar “dt=” in out y val==21 @pytest.mark.api def test_api(monkeypatch): monopatch.setenv(“API_MODE”,”offline”) afirmar fetch_username(9)==”cached_9″ ”’)) (root/”tests”/”test_slow.py”).write_text(textwrap.dedent(”’ hora de importación, pytest @pytest.mark.slow def test_slow(event_log,fake_clock): event_log.append(f”start@{fake_clock)[‘now’]}”) reloj_falso[“now”]+=3.0 event_log.append(f”end@{fake_clock[‘now’]}”) afirmar len(event_log)==2 ”’))
Agregamos utilidades de aplicaciones livianas para JSON I/O y una API simulada para ejercer comportamientos del mundo real sin servicios externos. Escribimos pruebas enfocadas que utilizan parametrización, xfail, marcadores, tmp_path, capsys y monopatch para validar la lógica y los efectos secundarios. Incluimos una prueba lenta conectada a nuestros dispositivos event_log y fake_clock para demostrar el tiempo controlado y el estado de toda la sesión. Consulta los CÓDIGOS COMPLETOS aquí.
“success” if r2.returncode==0 else “fail”]”contains_slow_tests”: Verdadero, “example_event_log”:[“[email protected]”,”[email protected]”]} resumen_file.write_text(json.dumps(summary,indent=2)) print(“\n📊 RESUMEN FINAL”) print(json.dumps(summary,indent=2)) print(“\n✅ Tutorial completado: todas las pruebas y el resumen se generaron correctamente.”)
Ahora ejecutamos nuestro conjunto de pruebas dos veces: primero con la configuración predeterminada que omite las pruebas lentas y luego nuevamente con el indicador –runslow para incluirlas. Después de ambas ejecuciones, generamos un resumen JSON que contiene los resultados de la prueba, el número total de archivos de prueba y un registro de eventos de muestra. Este resumen final nos brinda una instantánea clara del estado de las pruebas de nuestro proyecto, lo que confirma que todos los componentes funcionan perfectamente de principio a fin.
En conclusión, vemos cómo PyTest nos ayuda a realizar pruebas de manera más inteligente, no más difícil. Diseñamos un complemento que rastrea los resultados, utiliza dispositivos para la gestión del estado y controla las pruebas lentas con opciones personalizadas, todo ello manteniendo el flujo de trabajo limpio y modular. Concluimos con un resumen JSON detallado que demuestra con qué facilidad PyTest puede integrarse con las canalizaciones de análisis y CI modernas. Con esta base, ahora confiamos en ampliar aún más PyTest, combinando cobertura, evaluación comparativa o incluso ejecución paralela para pruebas de nivel profesional a gran escala.
Consulta los CÓDIGOS COMPLETOS aquí. No dude en consultar nuestra página de GitHub para tutoriales, códigos y cuadernos. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 100.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.
Asif Razzaq es el director ejecutivo de Marktechpost Media Inc.. Como emprendedor e ingeniero visionario, Asif está comprometido a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, Marktechpost, que se destaca por su cobertura en profundidad del aprendizaje automático y las noticias sobre aprendizaje profundo que es técnicamente sólida y fácilmente comprensible para una amplia audiencia. La plataforma cuenta con más de 2 millones de visitas mensuales, lo que ilustra su popularidad entre el público.
🙌 Siga MARKTECHPOST: agréguenos como fuente preferida en Google.