Tutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales

  1. Inicio
  2. Blog
  3. Automatización de pruebas

Automatización de pruebas

Tutorial de Pytest para principiantes: Aparatos, parametrización y ejemplos reales

Pytest le permite escribir pruebas de Python con funciones simples y declaraciones de afirmación simples. Cree un pequeño conjunto de pruebas paso a paso, lea resultados de fallos reales y conozca las funciones que utilizará todos los días.

10 min de lectura
Tutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales

Puntos clave

  • Pytest encuentra funciones denominadas test_* y las verifica con declaraciones simples assert.
  • Los accesorios proporcionan configuración y limpieza reutilizables, solicitadas simplemente nombrándolas como argumentos.
  • @pytest.mark.parametrize ejecuta una prueba con muchas entradas.
  • Coloque aparatos compartidos en conftest.py y no necesitará importarlos.

Si ha evitado escribir pruebas porque le parecen una tarea ardua, este tutorial de pytest debería hacerle cambiar de opinión. Pytest elimina la mayor parte de la ceremonia: no hay clases de las que heredar ni métodos de aserción especiales que recordar. Una prueba puede constar de solo dos líneas.

Construiremos un pequeño carrito de compras y lo probaremos paso a paso. Ejecutamos todo en Python 3.13 con pytest 9.2 y el resultado que se muestra es real, aunque recortamos las rutas de los archivos y los detalles de tiempo que diferirán en su máquina.

¿Por qué pytest?

Python viene con unittest, que funciona bien, pero pytest suele ser la opción más conveniente. Aquí está el mismo cheque en cada uno:

Tarea prueba unitaria pytest
comprobar la igualdad self.assertEqual(a, b) afirmar a == b
Verificar una excepción self.assertRaises(...) pytest.raises(...)
Estructura de prueba Una clase que hereda de TestCase Una función simple
Configuración y limpieza setUp y tearDown métodos Accesorios reutilizables
Muchas entradas subTest bucles parametrizar

Pytest también puede ejecutar sus pruebas unittest existentes, para que pueda cambiar gradualmente. También tiene un gran ecosistema de complementos, que incluye pytest-cov para cobertura y pytest-xdist para ejecuciones paralelas.

Instalar pytest

Primero cree un entorno virtual, como se explica en nuestro tutorial del entorno virtual de Python, y luego instálelo:

pip install pytest
pytest --version

# pytest 9.2.0

Cree una carpeta de proyecto que contenga dos archivos, cart.py y test_cart.py. Pytest encuentra pruebas automáticamente siguiendo reglas de nomenclatura: archivos llamados test_*.py o *_test.py, funciones que comienzan con test y clases que comienzan con Test. Si una prueba no se selecciona, lo primero que se debe verificar es que el nombre no coincida.

El código a probar

# cart.py
class Cart:
    def __init__(self):
        self.items = []

    def add(self, name, price, qty=1):
        if qty < 1:
            raise ValueError("qty must be at least 1")
        self.items.append((name, price, qty))

    def total(self, discount=0):
        subtotal = sum(price * qty for _, price, qty in self.items)
        return round(subtotal * (1 - discount / 100), 2)

Tus primeras pruebas

# test_cart.py
from cart import Cart

def test_empty_cart_is_free():
    assert Cart().total() == 0

Esa es una prueba completa. Ejecute pytest desde la carpeta del proyecto e informará una prueba aprobada. Si recibe un error de importación, ejecútelo como python -m pytest, lo que agrega la carpeta actual a la ruta de importación.

Fallos de lectura

Aquí es donde realmente brilla pytest. Aquí hay una prueba con un valor esperado deliberadamente incorrecto:

def test_wrong_total():
    c = Cart()
    c.add("Keyboard", 1500)
    assert c.total() == 1400

Y esto es lo que imprimió cuando lo ejecutamos:

    def test_wrong_total():
        c = Cart()
        c.add("Keyboard", 1500)
>       assert c.total() == 1400
E       assert 1500.0 == 1400
E        +  where 1500.0 = total()

FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================

El > marca la línea fallida y las líneas E muestran los valores reales. No fue necesario agregar un mensaje personalizado, porque pytest reescribe las declaraciones assert para que puedan informar lo que compararon. Hace lo mismo con listas y diccionarios, señalando exactamente qué elementos difieren.

Excepciones de prueba

El manejo de errores también es un comportamiento y merece pruebas. pytest.raises pasa solo si el bloque genera la excepción esperada:

import pytest

def test_rejects_zero_qty():
    with pytest.raises(ValueError, match="at least 1"):
        Cart().add("Pen", 10, qty=0)

El argumento opcional match verifica el mensaje usando una expresión regular, por lo que un ValueError diferente no pasará por accidente. Para aprender cómo generar y manejar errores como este, lea nuestra guía para el manejo de excepciones de Python.

Accesorios: configuración reutilizable

La mayoría de las pruebas necesitan algo preparado primero. Un accesorio es una función que lo proporciona. Decórelo con @pytest.fixture y cualquier prueba que lo nombre como argumento recibirá el resultado:

@pytest.fixture
def cart():
    c = Cart()
    c.add("Keyboard", 1500)
    c.add("Mouse", 500, qty=2)
    return c

def test_total(cart):
    assert cart.total() == 2500

Cada prueba recibe un carro nuevo de forma predeterminada, por lo que las pruebas no pueden afectarse entre sí. Pytest hace coincidir el nombre del argumento con el nombre del dispositivo y usted nunca llama al dispositivo usted mismo. @pytest.fixture es un decorador, que explicamos en Explicación de los decoradores de Python.

Limpieza con rendimiento

Utilice yield en lugar de return cuando necesite limpiar después. El código después de yield se ejecuta cuando finaliza la prueba, incluso si falló:

@pytest.fixture
def temp_db():
    print("\nopen db")
    yield {"users": []}
    print("close db")

def test_db(temp_db):
    assert temp_db["users"] == []

Ejecutar con -s para mostrar la salida impresa confirmó que el pedido estaba abierto, probado y luego cerrado.

Alcance del accesorio y conftest.py

De forma predeterminada, un dispositivo se ejecuta una vez por prueba. Para configuraciones costosas, como una base de datos o un navegador, cambie su vida útil con scope:

Alcance Creado una vez por
function (predeterminado) prueba
clase clase de prueba
módulo Archivo
paquete Paquete
sesión Ejecución de prueba completa

Coloque los aparatos utilizados por varios archivos en un archivo llamado conftest.py. Pytest lo carga automáticamente, por lo que las pruebas pueden usar sus dispositivos sin importarlos. Sin embargo, tenga cuidado con los ámbitos compartidos, porque un cambio realizado en una prueba puede filtrarse a la siguiente.

Parametrizar: una prueba, muchas entradas

En lugar de copiar una prueba para cada valor, enumere los casos:

@pytest.mark.parametrize("discount, expected", [
    (0, 2500),
    (10, 2250),
    (100, 0),
])
def test_discount(cart, discount, expected):
    assert cart.total(discount) == expected

Cada fila se convierte en su propia prueba, y puede ver esto en el resultado detallado de nuestra ejecución del archivo completo:

test_cart.py::test_total PASSED                        [ 16%]
test_cart.py::test_discount[0-2500] PASSED             [ 33%]
test_cart.py::test_discount[10-2250] PASSED            [ 50%]
test_cart.py::test_discount[100-0] PASSED              [ 66%]
test_cart.py::test_rejects_zero_qty PASSED             [ 83%]
test_cart.py::test_empty_cart_is_free PASSED           [100%]

============================== 6 passed in 0.05s ==============================

Si una fila falla, las demás aún se ejecutan y el nombre le indica exactamente qué valores causaron el problema. Observe que combinamos la parametrización con el dispositivo cart. Para elegir valores que probablemente encuentren errores, utilice el análisis de valores límite.

Consejo: Cuando sus parámetros sean largos o poco claros, pase ids=["none", "ten", "full"] para darle a cada caso un nombre legible en el informe.

Accesorios incorporados útiles

Pytest incluye varios accesorios ya preparados. Estos dos son especialmente útiles y ambos aprobaron nuestra carrera:

def test_write_report(tmp_path):
    report = tmp_path / "report.txt"
    report.write_text("passed")
    assert report.read_text() == "passed"

def read_mode():
    return os.environ.get("APP_MODE", "dev")

def test_mode(monkeypatch):
    monkeypatch.setenv("APP_MODE", "staging")
    assert read_mode() == "staging"

tmp_path proporciona a cada prueba una carpeta temporal única, por lo que las pruebas nunca tocan archivos reales. monkeypatch cambia las variables o atributos de entorno y deshace el cambio cuando finaliza la prueba. Otro útil es capsys, que captura la salida impresa para que puedas comprobarla.

Marcadores: saltar y xfail

Los marcadores agregan etiquetas y comportamiento a las pruebas:

@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
    assert False

@pytest.mark.xfail(reason="floating point")
def test_rounding():
    assert 0.1 + 0.2 == 0.3

skip no ejecuta la prueba en absoluto. xfail lo ejecuta pero espera un error, por lo que un problema conocido no interrumpe la compilación. Con las otras pruebas adicionales en el mismo archivo, nuestra ejecución se resumió como 3 passed, 1 skipped, 1 xfailed. Por cierto, esa prueba de redondeo realmente falla: en aritmética de coma flotante, 0,1 + 0,2 no es exactamente 0,3. Utilice pytest.approx(0.3) al comparar decimales.

También puede crear sus propios marcadores, como @pytest.mark.slow, y ejecutar solo aquellos con pytest -m slow, o omitirlos con -m "not slow". Registre marcadores personalizados en su archivo de configuración para evitar advertencias.

Banderas de línea de comando útiles

Comando que hace
pytest-v Mostrar el nombre de cada prueba
pytest -q Mostrar un resumen más corto
pytest -x Detente ante el primer fracaso
descuento pytest -k Ejecute pruebas cuyos nombres coincidan con una palabra
pytest -s Mostrar print salida
pytest --lf Vuelva a ejecutar solo los últimos fallos.
pytest-pdb Abra el depurador en caso de error.
pytest test_cart.py::test_total Ejecute una prueba específica

Ejecutando pytest en CI

Las pruebas son más valiosas cuando se ejecutan automáticamente en cada cambio. Un trabajo mínimo de GitHub Actions se ve así:

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: "3.13"
  - run: pip install -r requirements.txt
  - run: python -m pytest

Pytest sale con un código distinto de cero cuando las pruebas fallan, que es lo que hace que la canalización se detenga. No ejecutamos este archivo de flujo de trabajo, así que adáptelo a su proyecto. Nuestra guía de CI/CD de GitHub Actions explica los detalles. Pytest también funciona bien para pruebas de navegador, como muestran nuestro tutorial de Selenium Python y el tutorial del modelo de objetos de página.

Conclusión

Ahora tiene lo que necesita para la mayoría de los conjuntos de pruebas de Python: afirmaciones simples, accesorios para configuración, parametrización para variaciones y algunas banderas para velocidad. Empiece poco a poco. Elija una función en la que haya corregido un error recientemente y escriba primero una prueba para ese error. Si no está seguro de qué probar en cada nivel, lea acerca de pruebas unitarias frente a pruebas de integración.

Preguntas frecuentes

¿Para qué se utiliza pytest?

Pytest es un marco de prueba de Python. Se utiliza para pruebas unitarias, de integración y API, y también funciona bien con herramientas de navegador como Selenium y Playwright.

¿Pytest es mejor que unittest?

Muchos equipos lo prefieren por su sintaxis más simple, sus accesorios y sus fallas más claras. unittest no necesita instalación y pytest también puede ejecutar pruebas unittest existentes.

¿Qué es un accesorio en pytest?

Un dispositivo es una función que prepara algo que una prueba necesita, como datos o una conexión. Las pruebas lo reciben nombrándolo como argumento.

¿Qué es conftest.py?

Es un archivo especial para compartir dispositivos y ganchos entre archivos de prueba. Pytest lo carga automáticamente, por lo que sus dispositivos no necesitan una declaración de importación.

¿Por qué pytest no encuentra mis pruebas?

Generalmente es una cuestión de nombres. Los archivos deben llamarse test_*.py o *_test.py, y las funciones deben comenzar con test. También verifique que lo ejecutó desde la carpeta correcta.

sigue aprendiendo

Trabajar con Stack Quora

¿Necesitas ayuda con pruebas, WordPress o SEO?

Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.

Sigue leyendo

Más guías sobre testing, IA y desarrollo moderno

¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.

Inteligencia artificial

Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas

Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…

Leer artículo →
DevOps

Explicación de las variables de entorno: archivos .env, secretos y configuración bien hechos

Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…

Leer artículo →
Desarrollo de software

Explicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429

La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …

Leer artículo →
Automatización de pruebas

Burlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan

Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…

Leer artículo →
Pruebas de software

Explicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%

Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…

Leer artículo →
Bases de datos y SQL

DELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno

DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…

Leer artículo →
Bases de datos y SQL

Vistas SQL explicadas: cree, use y evite los errores, con ejemplos

Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…

Leer artículo →
Desarrollo de software

Interfaz TypeScript versus tipo: diferencias reales, probadas con el compilador

Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…

Leer artículo →
Desarrollo de software

Python *args y **kwargs explicados: funciones flexibles con ejemplos claros

Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…

Leer artículo →
Desarrollo de software

Funciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas

Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…

Leer artículo →
Inteligencia artificial

¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar

¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…

Leer artículo →
DevOps

Monitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos

Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…

Leer artículo →
DevOps

Docker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta

Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…

Leer artículo →
Automatización de pruebas

TDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una

TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …

Leer artículo →
Pruebas de software

Pruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales

Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…

Leer artículo →
Bases de datos y SQL

Valores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar

Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…

Leer artículo →
Bases de datos y SQL

Declaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes

CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…

Leer artículo →
Desarrollo de software

¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico

¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…

Leer artículo →
Desarrollo de software

Explicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos

El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…

Leer artículo →
Desarrollo de software

Explicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales

Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…

Leer artículo →
Inteligencia artificial

¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla

¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…

Leer artículo →
DevOps

Implementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir

Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…

Leer artículo →
Automatización de pruebas

Pruebas inestables: qué las causa y cómo solucionarlas para siempre

Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…

Leer artículo →
Pruebas de software

Pruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6

Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…

Leer artículo →
Pruebas de software

Caso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno

Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…

Leer artículo →
Bases de datos y SQL

Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…

Leer artículo →
Bases de datos y SQL

SQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado

SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …

Leer artículo →
Desarrollo de software

Tutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera

Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…

Leer artículo →
Desarrollo de software

Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…

Leer artículo →
Desarrollo de software

Clases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales

Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…

Leer artículo →
Inteligencia artificial

¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones

¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…

Leer artículo →
DevOps

Comandos de Linux para principiantes: la guía esencial de terminal con ejemplos

Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…

Leer artículo →
Automatización de pruebas

Selenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir

Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…

Leer artículo →
Pruebas de software

Partición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos

Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …

Leer artículo →
Pruebas de software

Severidad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales

Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…

Leer artículo →
Bases de datos y SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos

Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…

Leer artículo →
Bases de datos y SQL

Transacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento

Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…

Leer artículo →
Desarrollo de software

Hoja de trucos de comandos de Git: los comandos que realmente usas, con ejemplos

Una hoja de referencia de comandos de Git agrupada por tarea: configuración, preparación, ramas, controles remotos, almacenamiento, historial y desh…

Leer artículo →
Desarrollo de software

Explicación de las promesas de JavaScript: luego, captura, Promise.all y errores comunes

Las promesas de JavaScript se explican con el código que ejecutamos: estados, luego y cadenas de captura, manejo de errores, Promise.all, allSettled…

Leer artículo →
Desarrollo de software

Tutorial del diccionario Python: métodos, ejemplos y patrones comunes

Un tutorial de diccionario de Python con el código que ejecutamos: crear, leer y actualizar dictados, métodos clave, fusión, comprensión, patrones d…

Leer artículo →
Inteligencia artificial

¿Qué es el RAG? Generación de recuperación aumentada explicada con un ejemplo práctico

¿Qué es RAG? Generación de recuperación aumentada explicada paso a paso: indexación, fragmentación, incrustaciones, recuperación, un pequeño ejemplo…

Leer artículo →
DevOps

Tutorial de Terraform para principiantes: infraestructura como código desde el primer archivo hasta los módulos

Un tutorial de Terraform para principiantes: comience sin una cuenta en la nube, aprenda init, planifique y aplique, luego variables, resultados, es…

Leer artículo →
DevOps

Docker vs Kubernetes: diferencias clave, cómo funcionan juntos y cuál necesita

Docker vs Kubernetes explicó: qué hace cada uno, la misma aplicación se ejecuta con ambos, se comparan Docker Compose y Swarm, los Dockershim cambia…

Leer artículo →
Automatización de pruebas

Tutorial de Pytest para principiantes: accesorios, parametrización y ejemplos reales

Un tutorial de pytest para principiantes con pruebas que ejecutamos en pytest 9.2: afirmaciones, accesorios, parametrización, conftest, marcadores, …

Leer artículo →
Pruebas de software

Ciclo de vida de pruebas de software (STLC): 6 fases, criterios de entrada y salida, ejemplo

Se explicó el ciclo de vida de las pruebas de software: seis fases de STLC con criterios de entrada y salida, entregables, un ejemplo de función de …

Leer artículo →
Desarrollo de software

Git merge vs rebase: diferencias, ejemplos y cuándo usar cada uno

Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.

Leer artículo →
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.

Leer artículo →