Cómo Implementar Testing de Contratos API: Mejores Prácticas para APIs Fiables

Ashley Goolam

Ashley Goolam

18 November 2025

Cómo Implementar Testing de Contratos API: Mejores Prácticas para APIs Fiables

¿Alguna vez te has encontrado en una situación en la que tu aplicación frontend se rompe repentinamente porque la API de backend cambió de forma inesperada? Tales interrupciones pueden propagarse por todo tu sistema, llevando a usuarios frustrados y a sesiones de depuración frenéticas. Aquí es precisamente donde entra en juego el Testing de Contrato de API, un enfoque metódico que asegura la armonía entre los productores y los consumidores de API. En esta guía, profundizaremos en los matices del Testing de Contrato de API, explorando sus fundamentos, desafíos y estrategias de automatización. Al final, apreciarás por qué el Testing de Contrato de API no es solo algo deseable, sino un pilar fundamental del desarrollo de software robusto. Embárcate con nosotros en este viaje, descubriendo cómo integrar el Testing de Contrato de API sin problemas en tus flujos de trabajo.

💡
¿Quieres una excelente herramienta de Testing de API que genere hermosa Documentación de API?

¿Quieres una plataforma integrada, todo en uno, para que tu equipo de desarrollo trabaje en conjunto con máxima productividad?

Apidog satisface todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
botón

¿Qué es el Testing de Contrato de API?

El testing de contrato de API asegura que la interfaz acordada entre un proveedor de API y sus consumidores se mantenga consistente a medida que los sistemas evolucionan. Definido a través de especificaciones OpenAPI o Swagger, este contrato describe la estructura esperada de la solicitud y la respuesta (endpoints, métodos, esquemas, encabezados y códigos de estado), muy parecido a un acuerdo formal en el que ambas partes confían.

El testing de contrato de API generalmente toma dos formas. Los Contratos Impulsados por el Consumidor (CDC) definen las expectativas desde el punto de vista del consumidor para prevenir fallos de integración en los microservicios. Los contratos definidos por el proveedor, creados por el equipo de la API, cubren todas las interacciones soportadas para una validación más amplia. A diferencia de las pruebas funcionales o unitarias, estas pruebas se centran estrictamente en la interfaz de la API, no en la lógica subyacente.

La Importancia del Testing de Contrato de API

¿Por qué priorizar el testing de contrato de API en tu ciclo de desarrollo? Un pequeño cambio en la API puede causar fallos importantes en cascada. Validar los contratos a tiempo asegura una comunicación consistente entre los servicios y previene problemas mucho antes de que lleguen a producción.

Los beneficios clave del testing de contrato de API incluyen:

En entornos rápidos e iterativos como el comercio electrónico o el SaaS, el testing de contrato de API se vuelve esencial para ofrecer aplicaciones estables, predecibles y fáciles de usar.

Desafíos del Testing Manual de Contrato de API

La ejecución manual del testing de contrato de API se vuelve rápidamente impráctica a medida que las API crecen. Crear solicitudes manualmente, verificar las respuestas contra las especificaciones y validar encabezados o códigos de error es lento, propenso a errores y difícil de escalar.

Los desafíos clave del testing manual de contrato de API incluyen:

Estas limitaciones resaltan por qué la automatización del testing de contrato de API es esencial para un desarrollo de API rápido y confiable. Las verificaciones manuales lentas e inconsistentes socavan la confianza en la estabilidad de la API.

Primeros Pasos con el Testing de Contrato de API en Apidog

¿Listo para aprovechar el Testing de Contrato de API en tus proyectos? Apidog, una plataforma integral de desarrollo de API, lo simplifica con validación de esquemas incorporada y capacidades de scripting, convirtiéndolo en un punto de entrada ideal.

Para habilitar el Testing de Contrato de API en Apidog, comienza importando tu especificación OpenAPI o creando un nuevo proyecto. Apidog autogenera pruebas a partir de los esquemas, agilizando la configuración.

creating a new project in Apidog

Para un ejemplo práctico, usaremos el proyecto de demostración Pet Store de Apidog, un clásico para la exploración de API. Inicia Apidog, selecciona el proyecto "Demo Pet" y navega al endpoint GET "/pet/{petId}" (nota: la consulta usa "/get/pets/{id}", pero alineándose con el estándar de Petstore, es "/pet/{petId}"). Establece el entorno en "petstore env" o "localmock" a través del desplegable superior izquierdo.

selecting an environment

Luego, ejecuta la solicitud. Deberías recibir una respuesta como:

{
  "id": 1,
  "category": {
    "id": 1,
    "name": "dogs"
  },
  "name": "doggie",
  "photoUrls": [],
  "tags": [],
  "status": "available"
}

Esto establece el escenario para la validación del contrato.

Dirígete a la pestaña "Test Cases" y crea un nuevo conjunto haciendo clic en "Add Case".

add test cases

En la sección de pre-procesadores, añade un script personalizado para definir tu esquema JSON y variables:

Paso 1: Ve a Pre-Processors

creating a custom test script in Apidog

Paso 2: Añade el código JS personalizado

adding custom js test script code in Apidog
// Set petId if not set (as string)
if (!pm.environment.get("petId")) {
  pm.environment.set("petId", "1");
}

// Define JSON schema for the pet response
const petSchema = {
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "id": { "type": "integer" },
    "category": {
      "type": "object",
      "properties": {
        "id": { "type": "integer" },
        "name": { "type": "string" }
      },
      "required": ["id", "name"],
      "additionalProperties": true
    },
    "name": { "type": "string" },
    "photoUrls": {
      "type": "array",
      "items": { "type": "string", "format": "uri" },
      "minItems": 0
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": "string" }
        },
        "required": ["id", "name"],
        "additionalProperties": true
      },
      "minItems": 0
    },
    "status": {
      "type": "string",
      "enum": ["available", "pending", "sold"]
    }
  },
  "required": ["id", "name", "photoUrls", "status"],
  "additionalProperties": true
};

// Store the schema in an environment variable (stringify it)
pm.environment.set("pet_schema", JSON.stringify(petSchema));

// (Optional) log to console for debugging
console.log("Pre-processor: petId =", pm.environment.get("petId"));

A continuación, en los post-procesadores, pega el script de validación:

add a custom post processors script
// Use AJV for schema validation
var Ajv = require('ajv');
var ajv = new Ajv({ allErrors: true, logger: console });

// Retrieve schema from environment
var raw = pm.environment.get("pet_schema");
var schema;
try {
  schema = (typeof raw === 'string') ? JSON.parse(raw) : raw;
} catch (err) {
  pm.test('Schema is valid JSON', function() {
    pm.expect(false, 'pet_schema is not valid JSON: ' + err.message).to.be.true;
  });
  // Stop further tests
  return;
}

// Parse the response body as JSON
var responseData;
try {
  responseData = pm.response.json();
} catch (err) {
  pm.test('Response is valid JSON', function() {
    pm.expect(false, 'Response body is not JSON: ' + err.message).to.be.true;
  });
  return;
}

// Test status code
pm.test('Status code is 200', function() {
  pm.expect(pm.response.status).to.eql("OK");
});

// Validate schema
pm.test('Response matches pet schema', function() {
  var valid = ajv.validate(schema, responseData);
  if (!valid) {
    console.log('AJV Errors:', ajv.errors);
  }
  pm.expect(valid, 'Response does not match schema, see console for errors').to.be.true;
});

// Additional assertions
pm.test('Returned id matches requested petId', function() {
  var requested = pm.environment.get("petId");
  // petId is stored as string, but id in response is integer
  var requestedNum = Number(requested);
  if (!isNaN(requestedNum)) {
    pm.expect(responseData.id).to.eql(requestedNum);
  } else {
    pm.expect(String(responseData.id)).to.eql(String(requested));
  }
});

pm.test('Name is a string', function() {
  pm.expect(responseData.name).to.be.a('string');
});

pm.test('Status is one of expected values', function() {
  pm.expect(responseData.status).to.be.oneOf(['available', 'pending', 'sold']);
});

// Optional: more detailed checks (category, photoUrls, tags)
pm.test('Category has id and name', function() {
  pm.expect(responseData.category).to.have.property('id');
  pm.expect(responseData.category).to.have.property('name');
});

pm.test('At least one photo URL', function() {
  pm.expect(responseData.photoUrls).to.be.an('array').that.is.not.empty;
});

pm.test('Tags are valid objects', function() {
  pm.expect(responseData.tags).to.be.an('array');
  if (responseData.tags.length > 0) {
    responseData.tags.forEach(function(tag) {
      pm.expect(tag).to.have.property('id');
      pm.expect(tag).to.have.property('name');
    });
  }
});

Haz clic en "Run" para ejecutar. Apidog muestra los resultados a la derecha: "Passed" o "Failed", con detalles expandibles. Una ejecución exitosa podría mostrar:

Respuesta de la API:

API response
{
  "id": 1,
  "category": {
    "id": 1,
    "name": "dog"
  },
  "name": "Jasper",
  "photoUrls": [
    "https://loremflickr.com/400/400?lock=7187959506185006"
  ],
  "tags": [
    {
      "id": 3,
      "name": "Yellow"
    }
  ],
  "status": "available"
}

Pruebas Pasadas:

  1. El código de estado es 200
  2. La respuesta coincide con el esquema de la mascota
  3. El id devuelto coincide con el petId solicitado
  4. El nombre es una cadena de texto
  5. El estado es uno de los valores esperados
  6. La categoría tiene id y nombre
  7. Al menos una URL de foto
  8. Las etiquetas son objetos válidos
View api contract test results

Para simular un fallo, altera la prueba del código de estado para esperar un número (200) en lugar de "OK",

change js test script

luego vuelve a ejecutar y observa el error de aserción.

the assertion error

Guarda el conjunto para ejecuciones de regresión. La interfaz intuitiva de Apidog, con integración de AJV para la verificación de esquemas, democratiza el Testing de Contrato de API, convirtiendo las validaciones complejas en tareas rutinarias.

Preguntas Frecuentes

P1. ¿Qué distingue el Testing de Contrato de API del testing de integración?

Res: El Testing de Contrato de API valida el contrato de la interfaz sin ejecutar la lógica de negocio, mientras que el testing de integración examina cómo interactúan los servicios, incluyendo el flujo de datos y las dependencias.

P2. ¿Puede aplicarse el Testing de Contrato de API a las API de GraphQL?

Res: Sí, aunque diseñado principalmente para REST, herramientas como Pact soportan esquemas GraphQL, centrándose en las estructuras de consulta/respuesta y las mutaciones.

P3. ¿Con qué frecuencia debería ejecutarse el Testing de Contrato de API en un pipeline de CI/CD?

Res: Idealmente, en cada commit o pull request para detectar problemas a tiempo, con ejecuciones nocturnas para una cobertura completa.

P4. ¿Qué pasa si mi equipo carece de una especificación OpenAPI para el testing de contrato?

Res: Comienza generando una a partir del código existente utilizando herramientas como Swagger Codegen, luego refínala colaborativamente para establecer la base.

P5. ¿Es el Testing de Contrato de API adecuado para API heredadas?

Res: Absolutamente; adapta las especificaciones para documentar el comportamiento actual y luego automatiza las pruebas para protegerte contra regresiones durante la modernización.

Conclusión

Al concluir nuestra exploración, se hace evidente que el Testing de Contrato de API es la piedra angular para API fiables y escalables en un mundo interconectado. Desde mitigar el trabajo manual tedioso hasta potenciar salvaguardas automatizadas, equipa a los equipos para innovar sin miedo. Adopta herramientas como Apidog para elevar tu práctica y observa cómo tus aplicaciones ganan resiliencia y eficiencia. Ya sea refinando contratos existentes o forjando nuevos, el camino hacia una gobernanza superior de API comienza con una única prueba bien definida.

💡
¿Quieres una excelente herramienta de Testing de API que genere hermosa Documentación de API?

¿Quieres una plataforma integrada, todo en uno, para que tu equipo de desarrollo trabaje en conjunto con máxima productividad?

Apidog satisface todas tus demandas y reemplaza a Postman a un precio mucho más asequible!
botón

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs

Cómo Implementar Testing de Contratos API: Mejores Prácticas para APIs Fiables