Que Es OpenAPI?
La especificacion OpenAPI (anteriormente conocida como Swagger) es un formato estandar para describir APIs REST. Define cada aspecto de una API en un documento legible por maquinas: endpoints, metodos HTTP, parametros de request, formatos de response, autenticacion y modelos de datos.
Un spec de OpenAPI sirve como contrato entre proveedores y consumidores de la API. Como tester, es tu fuente de verdad sobre lo que la API deberia hacer.
OpenAPI vs. Swagger
- Swagger fue el nombre original, creado por SmartBear
- OpenAPI se convirtio en el nombre estandar despues de que la especificacion fue donada a la Linux Foundation
- Swagger UI y Swagger Editor son herramientas que trabajan con specs OpenAPI
- Version actual: OpenAPI 3.1 (alineada con JSON Schema)
Leyendo una Especificacion OpenAPI
Los specs OpenAPI se escriben en YAML o JSON. Aqui un ejemplo simplificado:
openapi: 3.1.0
info:
title: API de Gestion de Usuarios
version: 1.0.0
description: API para gestionar usuarios
servers:
- url: https://api.example.com/v1
paths:
/users:
get:
summary: Listar todos los usuarios
parameters:
- name: page
in: query
schema:
type: integer
default: 1
- name: limit
in: query
schema:
type: integer
default: 20
maximum: 100
responses:
'200':
description: Respuesta exitosa
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
post:
summary: Crear un nuevo usuario
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUser'
responses:
'201':
description: Usuario creado
'400':
description: Error de validacion
components:
schemas:
User:
type: object
required: [id, name, email]
properties:
id:
type: integer
name:
type: string
minLength: 1
maxLength: 100
email:
type: string
format: email
role:
type: string
enum: [admin, user, viewer]
createdAt:
type: string
format: date-time
CreateUser:
type: object
required: [name, email]
properties:
name:
type: string
minLength: 1
email:
type: string
format: email
role:
type: string
enum: [admin, user, viewer]
default: user
Secciones Clave
| Seccion | Proposito |
|---|---|
info | Titulo, version, descripcion de la API |
servers | URLs base para diferentes ambientes |
paths | Endpoints con metodos y parametros |
components/schemas | Modelos de datos reutilizables |
security | Requisitos de autenticacion |
Fundamentos de JSON Schema
JSON Schema define la estructura y reglas de validacion para datos JSON. OpenAPI usa JSON Schema para bodies de request y response.
Tipos y Restricciones Comunes
# String con restricciones
name:
type: string
minLength: 1
maxLength: 255
pattern: "^[A-Za-z ]+$"
# Numero con rango
age:
type: integer
minimum: 0
maximum: 150
# Enum (valores permitidos)
status:
type: string
enum: [active, inactive, suspended]
# Array con tipo de item
tags:
type: array
items:
type: string
minItems: 1
maxItems: 10
uniqueItems: true
# Campo nullable
deletedAt:
type: ["string", "null"]
format: date-time
Casos de Test desde el Schema
Cada restriccion del schema genera casos de test:
| Regla del Schema | Test Positivo | Test Negativo |
|---|---|---|
required: [name] | Incluir campo name | Omitir campo name |
minLength: 1 | Enviar "A" | Enviar "" (vacio) |
maxLength: 100 | Enviar 100 caracteres | Enviar 101 caracteres |
minimum: 0 | Enviar 0 | Enviar -1 |
enum: [a, b, c] | Enviar "a" | Enviar "d" |
type: integer | Enviar 42 | Enviar "cuarenta y dos" |
format: email | Enviar a@b.com | Enviar no-es-email |
Validacion de Schema en Practica
Validando con Postman
Usa la validacion de JSON Schema integrada de Postman:
// En tab Tests
const schema = {
type: "object",
required: ["id", "name", "email"],
properties: {
id: { type: "number" },
name: { type: "string" },
email: { type: "string", format: "email" },
role: { type: "string", enum: ["admin", "user", "viewer"] }
},
additionalProperties: false
};
pm.test("Response coincide con schema", function () {
const response = pm.response.json();
const valid = tv4.validate(response, schema);
pm.expect(valid).to.be.true;
});
Validando con Python (jsonschema)
import jsonschema
import requests
schema = {
"type": "object",
"required": ["id", "name", "email"],
"properties": {
"id": {"type": "integer"},
"name": {"type": "string", "minLength": 1},
"email": {"type": "string", "format": "email"}
}
}
response = requests.get("https://api.example.com/users/1")
data = response.json()
try:
jsonschema.validate(instance=data, schema=schema)
print("Validacion de schema exitosa")
except jsonschema.ValidationError as e:
print(f"Validacion de schema fallida: {e.message}")
Testing Automatizado de Schema con Schemathesis
Schemathesis genera casos de test automaticamente desde tu spec OpenAPI:
pip install schemathesis
# Ejecutar contra una API activa
schemathesis run https://api.example.com/openapi.json
# Con verificaciones especificas
schemathesis run https://api.example.com/openapi.json \
--checks all \
--stateful=links
Automaticamente testea valores limite, tipos invalidos, campos faltantes y mas — todo derivado del spec.
Estrategia de Testing Basada en Specs
Testing de Spec vs. Implementacion
- La implementacion coincide con el spec? — Validar que las respuestas reales cumplan con los schemas documentados
- El spec esta completo? — Buscar endpoints, campos o codigos de error no documentados
- Las restricciones se aplican? — Verificar que las validaciones de minLength, maxLength, enum, format realmente funcionen
- Los casos borde se manejan? — Testear campos nullable, campos opcionales, propiedades adicionales
Bugs Comunes de Schema
| Bug | Como Encontrarlo |
|---|---|
| Campos requeridos faltantes en response | Validar contra schema |
| Tipos de datos incorrectos retornados | La validacion de schema detecta string vs integer |
| Campos no documentados en response | Usar additionalProperties: false |
| Valores enum no aplicados | Enviar valores enum invalidos en requests |
| Formato no validado | Enviar email, fecha, URI malformados |
Ejercicio Practico
- Lee un spec: Explora el spec de API Petstore en Swagger UI. Identifica todos los endpoints, schemas y campos requeridos.
- Escribe un JSON Schema para un objeto producto con: id (integer), name (string, 1-200 chars), price (number, min 0), category (enum), inStock (boolean).
- Valida responses: Usa Postman para enviar requests a JSONPlaceholder y escribe tests de validacion de schema para los endpoints
/postsy/users. - Encuentra violaciones del spec: Envia datos invalidos intencionalmente y verifica que la API retorne errores de validacion apropiados segun el spec.
Puntos Clave
- Las especificaciones OpenAPI definen el contrato completo de una API — endpoints, parametros, schemas de request/response y autenticacion
- JSON Schema provee reglas de validacion (tipos, rangos, patrones, campos requeridos) que mapean directamente a casos de test
- Cada restriccion del schema genera tanto escenarios de test positivos como negativos
- Herramientas automatizadas como Schemathesis pueden generar tests completos directamente desde specs OpenAPI
- La validacion de schema detecta automaticamente incompatibilidades de tipos de datos, campos faltantes y violaciones de contrato