<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Roobia</title>
    <description>The latest articles on DEV Community by Roobia (@roobia).</description>
    <link>https://dev.to/roobia</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2197084%2F1d72640c-64d4-4f30-a828-302a9e3360b0.jpg</url>
      <title>DEV Community: Roobia</title>
      <link>https://dev.to/roobia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roobia"/>
    <language>en</language>
    <item>
      <title>Cómo Usar Insomnia para Probar una API</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:32:10 +0000</pubDate>
      <link>https://dev.to/roobia/como-usar-insomnia-para-probar-una-api-2n9k</link>
      <guid>https://dev.to/roobia/como-usar-insomnia-para-probar-una-api-2n9k</guid>
      <description>&lt;p&gt;Insomnia es un cliente API de Kong para enviar solicitudes e inspeccionar respuestas. Soporta HTTP, REST, GraphQL, gRPC, SOAP y WebSocket desde una interfaz limpia. Es útil cuando necesita probar APIs sin usar una herramienta pesada tipo IDE, pero con suficientes funciones para depurar, parametrizar y automatizar verificaciones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía probará una API en Insomnia de principio a fin: creará una colección, enviará una solicitud, inspeccionará la respuesta, configurará entornos para cambiar URLs base y tokens, y escribirá aserciones con suites de pruebas. Los ejemplos usan JSONPlaceholder para que pueda seguirlos sin configurar backend propio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalar Insomnia y crear una solicitud
&lt;/h2&gt;

&lt;p&gt;Descargue Insomnia desde &lt;a href="https://insomnia.rest/download" rel="noopener noreferrer"&gt;el sitio oficial de Kong&lt;/a&gt; e instálelo en su plataforma.&lt;/p&gt;

&lt;p&gt;Al abrirlo por primera vez, Insomnia le preguntará si desea iniciar sesión. Puede trabajar localmente sin cuenta si no necesita sincronización en la nube. Insomnia almacenará sus datos en su máquina.&lt;/p&gt;

&lt;p&gt;Para crear su primera solicitud:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra Insomnia.&lt;/li&gt;
&lt;li&gt;Haga clic en &lt;strong&gt;Crear&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccione &lt;strong&gt;Colección de solicitudes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Asigne un nombre, por ejemplo: &lt;code&gt;Pruebas de la API de usuario&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dentro de la colección, haga clic en &lt;strong&gt;+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Elija &lt;strong&gt;Solicitud HTTP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure el método como &lt;code&gt;GET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Introduzca esta URL:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Haga clic en &lt;strong&gt;Enviar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Insomnia mostrará:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código de estado HTTP.&lt;/li&gt;
&lt;li&gt;Tiempo de respuesta.&lt;/li&gt;
&lt;li&gt;Tamaño de la respuesta.&lt;/li&gt;
&lt;li&gt;Cuerpo de respuesta formateado.&lt;/li&gt;
&lt;li&gt;Encabezados recibidos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para respuestas JSON grandes, use el filtro JSONPath en el panel de respuesta. Por ejemplo, si desea inspeccionar solo el email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurar métodos, parámetros y autenticación
&lt;/h2&gt;

&lt;p&gt;Una solicitud real suele necesitar cuerpo, parámetros, encabezados o autenticación. Insomnia agrupa estas opciones en pestañas debajo de la barra de URL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enviar un cuerpo JSON
&lt;/h3&gt;

&lt;p&gt;Para probar un endpoint &lt;code&gt;POST&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cambie el método a &lt;code&gt;POST&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Abra la pestaña &lt;strong&gt;Cuerpo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccione &lt;strong&gt;JSON&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Escriba el payload:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Daniel Okafor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"daniel.okafor@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando selecciona JSON, Insomnia configura automáticamente el encabezado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Añadir parámetros de consulta
&lt;/h3&gt;

&lt;p&gt;Use la pestaña &lt;strong&gt;Consulta&lt;/strong&gt; para añadir query params sin editar manualmente la URL.&lt;/p&gt;

&lt;p&gt;Por ejemplo, en lugar de escribir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/posts?userId=1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nombre&lt;/th&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Esto facilita activar, desactivar o modificar parámetros durante las pruebas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Añadir encabezados
&lt;/h3&gt;

&lt;p&gt;Use la pestaña &lt;strong&gt;Encabezados&lt;/strong&gt; para valores como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Accept: application/json
X-Request-Id: test-123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto es útil para probar negociación de contenido, trazabilidad o comportamiento condicionado por headers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurar autenticación
&lt;/h3&gt;

&lt;p&gt;Abra la pestaña &lt;strong&gt;Auth&lt;/strong&gt; y seleccione el esquema que usa su API. Insomnia soporta, entre otros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bearer Token.&lt;/li&gt;
&lt;li&gt;Basic Auth.&lt;/li&gt;
&lt;li&gt;API Key.&lt;/li&gt;
&lt;li&gt;OAuth 1.0.&lt;/li&gt;
&lt;li&gt;OAuth 2.0.&lt;/li&gt;
&lt;li&gt;AWS IAM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para una API protegida por token:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra &lt;strong&gt;Auth&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccione &lt;strong&gt;Bearer Token&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pegue el token o use una variable de entorno.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mejor que escribir el token directamente, use una variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{ _.auth_token }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así evita duplicar credenciales en cada solicitud.&lt;/p&gt;

&lt;p&gt;Si necesita validar qué códigos de estado debería devolver su API, consulte esta referencia sobre &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;códigos de estado HTTP que las API REST deberían usar&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurar entornos y variables
&lt;/h2&gt;

&lt;p&gt;Los entornos evitan repetir valores como URLs base, tokens o IDs de prueba. En Insomnia, un entorno es un objeto JSON asociado a una colección.&lt;/p&gt;

&lt;p&gt;Para crear uno:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra el desplegable de entorno en la parte superior de la barra lateral.&lt;/li&gt;
&lt;li&gt;Seleccione &lt;strong&gt;Administrar entornos&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Edite el &lt;strong&gt;Entorno Base&lt;/strong&gt; o cree subentornos.&lt;/li&gt;
&lt;li&gt;Añada variables en formato JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://jsonplaceholder.typicode.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-token-here"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora puede reemplazar una URL fija como esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por una URL parametrizada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {{ _.base_url }}/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando cambie el entorno activo, todas las solicitudes que usen &lt;code&gt;{{ _.base_url }}&lt;/code&gt; apuntarán al nuevo destino.&lt;/p&gt;

&lt;p&gt;Un patrón común es crear entornos como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.dev.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev-token"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.staging.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"staging-token"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prod-token"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encadenar solicitudes con etiquetas de plantilla
&lt;/h2&gt;

&lt;p&gt;Insomnia también soporta &lt;strong&gt;etiquetas de plantilla&lt;/strong&gt;. Son funciones que puede insertar en campos de solicitud para generar o extraer valores dinámicos.&lt;/p&gt;

&lt;p&gt;Puede usarlas para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generar timestamps.&lt;/li&gt;
&lt;li&gt;Crear UUIDs.&lt;/li&gt;
&lt;li&gt;Reutilizar valores de entorno.&lt;/li&gt;
&lt;li&gt;Extraer datos desde una respuesta anterior.&lt;/li&gt;
&lt;li&gt;Encadenar login + solicitudes protegidas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de flujo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cree una solicitud &lt;code&gt;POST /login&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La respuesta devuelve un token:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;En otra solicitud protegida, configure el encabezado:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer &amp;lt;token extraído de /login&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con la etiqueta de respuesta, Insomnia puede ejecutar la solicitud de login si es necesario, leer el valor con JSONPath como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$.token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y reutilizarlo en las solicitudes siguientes.&lt;/p&gt;

&lt;p&gt;Este enfoque mantiene el flujo declarativo y evita escribir scripts de unión solo para pasar datos entre requests.&lt;/p&gt;

&lt;p&gt;Para organizar verificaciones relacionadas, revise este &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ejemplo de caso de prueba de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escribir suites de pruebas con aserciones
&lt;/h2&gt;

&lt;p&gt;Enviar una solicitud manualmente sirve para depurar. Para verificar automáticamente que una API sigue funcionando, use las &lt;strong&gt;suites de pruebas&lt;/strong&gt; de Insomnia. En algunas versiones aparecen como &lt;strong&gt;Pruebas Unitarias&lt;/strong&gt; dentro de una colección.&lt;/p&gt;

&lt;p&gt;Para crear una suite:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra su colección.&lt;/li&gt;
&lt;li&gt;Cambie a la vista &lt;strong&gt;Pruebas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cree una &lt;strong&gt;suite de pruebas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Añada una prueba.&lt;/li&gt;
&lt;li&gt;Seleccione la solicitud que debe ejecutarse.&lt;/li&gt;
&lt;li&gt;Escriba las aserciones en JavaScript.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Insomnia usa Chai para las aserciones y expone &lt;code&gt;insomnia.send()&lt;/code&gt; para ejecutar la solicitud asociada.&lt;/p&gt;

&lt;p&gt;Ejemplo mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo con validación del cuerpo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sincere@april.biz&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para la solicitud:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La respuesta incluye un email como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Leanne Graham"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sincere@april.biz"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por eso la aserción anterior valida tanto el estado como un campo específico del payload.&lt;/p&gt;

&lt;p&gt;También puede validar encabezados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Organizar suites de pruebas
&lt;/h2&gt;

&lt;p&gt;A medida que crece la colección, no conviene tener todas las pruebas mezcladas. Use una estructura por recurso o dominio funcional.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Suites
├── Users
│   ├── GET /users/:id devuelve 200
│   ├── GET /users/:id devuelve estructura esperada
│   └── GET /users/:id inexistente devuelve 404
├── Posts
│   ├── GET /posts devuelve lista
│   └── POST /posts valida payload requerido
└── Auth
    ├── POST /login devuelve token
    └── POST /login con credenciales inválidas devuelve 401
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mantenga cada prueba enfocada en un comportamiento. Evite pruebas demasiado amplias como “la API funciona”, porque cuando fallen no sabrá qué se rompió.&lt;/p&gt;

&lt;p&gt;Buen patrón:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mejor aún, si el endpoint devuelve un cuerpo de error estable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para profundizar en qué conviene validar, consulte la guía sobre &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API&lt;/a&gt;. Para estructurar suites más grandes, revise el artículo sobre &lt;a href="http://apidog.com/blog/test-suites-api-test-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;suites de pruebas para la automatización de pruebas de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejecutar pruebas desde la línea de comandos con Inso
&lt;/h2&gt;

&lt;p&gt;La interfaz gráfica es útil durante el desarrollo, pero CI/CD necesita ejecución sin GUI. Insomnia incluye una herramienta de línea de comandos llamada &lt;strong&gt;Inso&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Después de exportar o sincronizar su colección, puede ejecutar una suite desde la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inso run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"User API tests"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si alguna prueba falla, Inso devuelve un código de salida distinto de cero. Esto permite que una pipeline marque el build como fallido.&lt;/p&gt;

&lt;p&gt;Ejemplo conceptual para CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inso run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"User API tests"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"API tests failed"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En una pipeline, el flujo típico sería:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalar Inso.&lt;/li&gt;
&lt;li&gt;Obtener la colección o proyecto.&lt;/li&gt;
&lt;li&gt;Seleccionar el entorno correcto.&lt;/li&gt;
&lt;li&gt;Ejecutar la suite.&lt;/li&gt;
&lt;li&gt;Fallar la compilación si alguna aserción falla.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Inso también puede lintar especificaciones de API y generar reportes de prueba en formatos estándar, por lo que no se limita a ejecutar suites.&lt;/p&gt;

&lt;p&gt;Para el patrón general de automatización, consulte esta guía sobre &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;automatización de pruebas de API en CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  El cambio a la nube en Insomnia 8 y una alternativa
&lt;/h2&gt;

&lt;p&gt;Insomnia 8 se movió hacia un modelo &lt;strong&gt;cloud-first&lt;/strong&gt;. Por defecto, impulsaba a los usuarios a crear una cuenta de Kong y almacenar proyectos en la nube.&lt;/p&gt;

&lt;p&gt;Esto frustró a parte de la comunidad, porque versiones anteriores permitían un flujo completamente local y cómodo para trabajo sin conexión. Versiones posteriores restauraron una opción local más clara, como &lt;strong&gt;Scratch Pad&lt;/strong&gt;, pero el cambio hizo que algunos equipos evaluaran alternativas, especialmente en entornos donde los datos no pueden salir de la organización.&lt;/p&gt;

&lt;p&gt;Si ese es su caso, &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; es una opción a considerar. Es una plataforma API todo en uno para diseño, depuración, mocking, pruebas y documentación. También permite importar exportaciones de Insomnia para no empezar desde cero.&lt;/p&gt;

&lt;p&gt;Apidog permite construir aserciones visualmente sin escribir JavaScript, pero sigue admitiendo scripts cuando los necesita. Al mantener la especificación de API, los datos de prueba y el servidor mock en un mismo proyecto, las pruebas pueden mantenerse alineadas con el contrato real de la API.&lt;/p&gt;

&lt;p&gt;Puede &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; e importar una colección de Insomnia para compararlos lado a lado. Para revisar más opciones, esta lista de &lt;a href="http://apidog.com/blog/online-api-testing-tools-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas de prueba de API en línea gratuitas&lt;/a&gt; cubre varias alternativas.&lt;/p&gt;

&lt;p&gt;Insomnia sigue siendo un cliente potente y enfocado, especialmente para desarrolladores individuales y equipos pequeños que valoran una interfaz mínima y un inicio rápido. La mejor elección depende de cómo trabaja su equipo y de cuánto del ciclo de vida de la API quiere centralizar en una sola herramienta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Es Insomnia gratuito?
&lt;/h3&gt;

&lt;p&gt;Insomnia tiene un nivel gratuito para uso individual, incluyendo envío de solicitudes y ejecución local de suites de pruebas. Los planes de pago añaden colaboración en equipo y mayores límites de sincronización en la nube. También puede trabajar localmente si no desea usar sincronización.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué protocolos soporta Insomnia?
&lt;/h3&gt;

&lt;p&gt;Insomnia soporta HTTP, REST, GraphQL, gRPC, SOAP y WebSocket. La configuración cambia según el protocolo, pero la inspección de respuestas y las pruebas basadas en HTTP siguen un flujo similar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo escribo aserciones en Insomnia?
&lt;/h3&gt;

&lt;p&gt;Use las suites de pruebas. Abra la vista &lt;strong&gt;Pruebas&lt;/strong&gt; en una colección, cree una suite y añada pruebas. Cada prueba ejecuta una solicitud con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;insomnia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego valide con &lt;code&gt;expect&lt;/code&gt; al estilo Chai:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puede analizar el cuerpo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ¿Qué cambió en Insomnia 8?
&lt;/h3&gt;

&lt;p&gt;Insomnia 8 adoptó un modelo &lt;strong&gt;cloud-first&lt;/strong&gt; por defecto, solicitando iniciar sesión con una cuenta de Kong y sincronizar proyectos en la nube. A algunos usuarios no les gustó el flujo obligatorio de cuenta ni el alejamiento de una aplicación puramente local. Versiones posteriores añadieron opciones locales más claras.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo ejecutar pruebas de Insomnia en una pipeline de CI?
&lt;/h3&gt;

&lt;p&gt;Sí. Use Inso, la herramienta de línea de comandos de Insomnia. Exporte o sincronice su colección y ejecute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;inso run &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;nombre de la suite&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si una prueba falla, Inso devuelve un código de salida distinto de cero, por lo que CI puede fallar la compilación automáticamente.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Simular una API para Pruebas: Guía Práctica</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:31:40 +0000</pubDate>
      <link>https://dev.to/roobia/como-simular-una-api-para-pruebas-guia-practica-5392</link>
      <guid>https://dev.to/roobia/como-simular-una-api-para-pruebas-guia-practica-5392</guid>
      <description>&lt;p&gt;Las pruebas que dependen de una API en vivo fallan por motivos externos a tu código: un servidor de prueba caído, un rate limit de terceros, datos modificados por otro equipo o una respuesta lenta. Simular la API elimina esa fragilidad: sustituyes el endpoint real por un mock controlado que devuelve la respuesta que necesitas, de forma repetible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía vas a implementar un flujo práctico para simular una API en pruebas: definir el esquema, generar respuestas mock, levantar un servidor de simulación, apuntar tus tests al mock y cubrir rutas de error difíciles de reproducir con un backend real. Usaremos una API pequeña de gestión de pedidos con el endpoint &lt;code&gt;GET /orders/{id}&lt;/code&gt;, pero el patrón aplica a cualquier API REST o GraphQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo simular la API
&lt;/h2&gt;

&lt;p&gt;Simula la API cuando quieres probar tu propio código, no la red ni el backend real.&lt;/p&gt;

&lt;p&gt;Casos típicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests unitarios de clientes HTTP.&lt;/li&gt;
&lt;li&gt;Tests de integración de frontend/backend contra contratos conocidos.&lt;/li&gt;
&lt;li&gt;Validación de parsing de respuestas.&lt;/li&gt;
&lt;li&gt;Manejo de errores como &lt;code&gt;404&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt;, &lt;code&gt;500&lt;/code&gt; o timeouts.&lt;/li&gt;
&lt;li&gt;Pruebas de retry, fallback y mensajes de error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mantén la API real para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pruebas de contrato.&lt;/li&gt;
&lt;li&gt;Una capa pequeña de end-to-end.&lt;/li&gt;
&lt;li&gt;Verificaciones periódicas contra producción o staging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La división práctica es:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock&lt;/strong&gt;: velocidad, aislamiento y control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API real&lt;/strong&gt;: confirmar que el contrato sigue siendo válido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para profundizar, revisa estos recursos sobre &lt;a href="http://apidog.com/blog/api-mocking-use-cases?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;escenarios donde la simulación de API vale la pena&lt;/a&gt; y la diferencia entre un &lt;a href="http://apidog.com/blog/mock-server-vs-real-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;servidor simulado y un servidor real&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flujo de trabajo en cinco pasos
&lt;/h2&gt;

&lt;p&gt;Simular una API para pruebas suele seguir el mismo proceso:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define el esquema&lt;/strong&gt; de la API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Genera respuestas simuladas&lt;/strong&gt; estáticas o dinámicas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ejecuta un servidor de simulación&lt;/strong&gt; accesible por URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apunta tus pruebas al mock&lt;/strong&gt; usando una URL base configurable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prueba rutas de error&lt;/strong&gt; que el backend real no expone bajo demanda.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El ejemplo base será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /orders/{id}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 1: Define el esquema
&lt;/h2&gt;

&lt;p&gt;Un mock solo es útil si respeta la forma real de la respuesta. Empieza por un contrato. Si ya tienes un documento &lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI&lt;/a&gt;, úsalo. Si no, define el endpoint que vas a probar.&lt;/p&gt;

&lt;p&gt;Ejemplo mínimo para &lt;code&gt;GET /orders/{id}&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;/orders/{id}&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;id&lt;/span&gt;
          &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path&lt;/span&gt;
          &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;responses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;200'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;application/json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;object&lt;/span&gt;
                &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;string&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pending&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;shipped&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;delivered&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;array&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;object&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="err"&gt;  &lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;404'&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Order not found&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este esquema te da dos beneficios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El mock sabe qué campos debe devolver.&lt;/li&gt;
&lt;li&gt;Tus tests tienen una fuente de verdad compartida con el backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando el contrato cambia, actualizas el esquema y regeneras las respuestas mock desde ahí. Esa disciplina es clave para mantener confiables las &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de contrato de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 2: Genera respuestas simuladas
&lt;/h2&gt;

&lt;p&gt;Puedes usar dos tipos de respuestas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Respuestas estáticas
&lt;/h3&gt;

&lt;p&gt;Son payloads JSON fijos. Úsalas cuando necesitas aserciones exactas.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order_8842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_keyboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Son ideales para tests como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Respuestas dinámicas
&lt;/h3&gt;

&lt;p&gt;Se generan por solicitud. En lugar de devolver siempre el mismo &lt;code&gt;total&lt;/code&gt;, el mock puede producir valores realistas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UUIDs para &lt;code&gt;id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Un valor válido del enum para &lt;code&gt;status&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cantidades monetarias plausibles para &lt;code&gt;total&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Arrays con tamaños variables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto ayuda a detectar errores que un fixture único puede ocultar, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parsers que fallan con strings largos.&lt;/li&gt;
&lt;li&gt;Campos opcionales ausentes.&lt;/li&gt;
&lt;li&gt;Arrays vacíos.&lt;/li&gt;
&lt;li&gt;Valores nulos inesperados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La mayoría de equipos combina ambas estrategias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estáticas&lt;/strong&gt; para tests deterministas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dinámicas&lt;/strong&gt; para cobertura más amplia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, puedes generar endpoints mock desde el esquema. Apidog interpreta nombres de campos como &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt; o &lt;code&gt;avatar&lt;/code&gt; y devuelve datos acordes al tipo esperado.&lt;/p&gt;

&lt;p&gt;Si escribes payloads a mano, evita fixtures demasiado artificiales como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mejor usa datos parecidos a producción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"order_8842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shipped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_keyboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mechanical Keyboard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;99.99&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku_mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wireless Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"quantity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Paso 3: Ejecuta el servidor de simulación
&lt;/h2&gt;

&lt;p&gt;Una respuesta mock necesita servirse desde una URL. Tienes dos opciones principales.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opción A: servidor mock local
&lt;/h3&gt;

&lt;p&gt;Úsalo para tests unitarios e integración local. Es rápido, no depende de red externa y evita estado compartido.&lt;/p&gt;

&lt;p&gt;Con &lt;a href="https://github.com/stoplightio/prism" rel="noopener noreferrer"&gt;Prism&lt;/a&gt;, puedes levantar un mock desde un archivo OpenAPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prism mock openapi.yaml
&lt;span class="c"&gt;# Mock server listening on http://127.0.0.1:4010&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego puedes probarlo con &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://127.0.0.1:4010/orders/order_8842
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción B: servidor mock en la nube
&lt;/h3&gt;

&lt;p&gt;Úsalo cuando el mock debe ser accesible desde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una app móvil.&lt;/li&gt;
&lt;li&gt;Un runner de CI.&lt;/li&gt;
&lt;li&gt;Un colaborador externo.&lt;/li&gt;
&lt;li&gt;Otro equipo sin acceso a tu máquina.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apidog ofrece una URL de simulación alojada por proyecto, útil para compartir el mismo endpoint mock entre varias personas o dispositivos.&lt;/p&gt;

&lt;p&gt;Para ejecución automatizada de tests, prefiere local cuando sea posible. Para demos, pruebas entre dispositivos o colaboración remota, usa mock en la nube.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 4: Apunta tus pruebas al mock
&lt;/h2&gt;

&lt;p&gt;No hardcodees la URL de producción en tus tests. Haz que la URL base sea configurable.&lt;/p&gt;

&lt;p&gt;Ejemplo de cliente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// orderClient.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/orders/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Order &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; not found`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Unexpected API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test apuntando al mock:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// orderClient.test.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getOrder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./orderClient.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;API_BASE_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://127.0.0.1:4010&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;parses a shipped order&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_8842&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En local:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://127.0.0.1:4010 npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En CI puedes apuntar la misma suite a otro entorno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;API_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://mock.example.com npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El código de producción no necesita saber si está usando un mock o una API real. Solo recibe una URL base. Este mismo patrón aplica cuando &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;automatizas las pruebas de API en CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 5: Prueba las rutas de error
&lt;/h2&gt;

&lt;p&gt;Este es el mayor valor de un mock: puedes forzar respuestas que un backend real no produce cuando tú quieres.&lt;/p&gt;

&lt;p&gt;Configura escenarios como estos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Escenario&lt;/th&gt;
&lt;th&gt;La simulación devuelve&lt;/th&gt;
&lt;th&gt;Qué verificas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Registro faltante&lt;/td&gt;
&lt;td&gt;&lt;code&gt;404&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;El cliente lanza un error claro de "no encontrado"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fallo del servidor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;El cliente reintenta y luego usa un fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rate limit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;429&lt;/code&gt; con &lt;code&gt;Retry-After&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;El cliente espera el tiempo correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Respuesta lenta&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; después de 5s&lt;/td&gt;
&lt;td&gt;El cliente aplica timeout y se recupera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cuerpo inválido&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;200&lt;/code&gt; con JSON defectuoso&lt;/td&gt;
&lt;td&gt;El cliente falla sin crashear&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ejemplo de test para &lt;code&gt;404&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;throws a clear error when order does not exist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_404&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rejects&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toThrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Order order_404 not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de test para &lt;code&gt;500&lt;/code&gt; con retry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;retries when the API returns 500&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOrderWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las reglas avanzadas de simulación de Apidog permiten devolver respuestas distintas según la solicitud. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /orders/order_404&lt;/code&gt; devuelve &lt;code&gt;404&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /orders/order_timeout&lt;/code&gt; responde con retraso.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /orders/order_8842&lt;/code&gt; devuelve &lt;code&gt;200&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así puedes cubrir la ruta feliz y los fallos desde un único endpoint mock. Combínalo con buenas &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API&lt;/a&gt; para verificar comportamiento, no solo códigos de estado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organiza los mocks en una suite creciente
&lt;/h2&gt;

&lt;p&gt;Un mock para un endpoint es fácil. Cien mocks repartidos en una suite se vuelven difíciles de mantener si no hay estructura.&lt;/p&gt;

&lt;p&gt;Buenas prácticas:&lt;/p&gt;

&lt;h3&gt;
  
  
  Agrupa por servicio real
&lt;/h3&gt;

&lt;p&gt;Organiza los mocks según el servicio que representan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mocks/
  orders/
    order-shipped.json
    order-not-found.json
    order-rate-limited.json
  payments/
    payment-approved.json
    payment-declined.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No los agrupes por test individual. Si cambia la API de pedidos, quieres actualizar una carpeta, no veinte archivos dispersos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nombra fixtures por escenario
&lt;/h3&gt;

&lt;p&gt;Usa nombres que expliquen el caso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;order-shipped.json
order-delivered.json
order-not-found.json
order-rate-limited.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así, cuando falle un test, el fixture ya comunica la intención.&lt;/p&gt;

&lt;h3&gt;
  
  
  Versiona los mocks junto a los tests
&lt;/h3&gt;

&lt;p&gt;Los mocks son parte de la prueba. Deben pasar por code review igual que el código de test.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usa una respuesta base
&lt;/h3&gt;

&lt;p&gt;Evita copiar payloads completos para cada test. Define una respuesta base y cambia solo el campo relevante.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order_8842&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shipped&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;149.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sku_keyboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;sku&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sku_mouse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pendingOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;baseOrder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este enfoque reduce duplicación y hace que los cambios de contrato sean más fáciles de aplicar. La misma disciplina que mantiene una &lt;a href="http://apidog.com/blog/test-suites-api-test-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;suite de pruebas para la automatización de API&lt;/a&gt; también mantiene sanos tus mocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mantén la simulación alineada con la API real
&lt;/h2&gt;

&lt;p&gt;El riesgo principal de un mock es la deriva del contrato.&lt;/p&gt;

&lt;p&gt;Ejemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El backend renombra &lt;code&gt;total&lt;/code&gt; a &lt;code&gt;amount&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Se agrega un campo obligatorio.&lt;/li&gt;
&lt;li&gt;Cambia un enum.&lt;/li&gt;
&lt;li&gt;Un campo deja de aceptar &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La estructura de &lt;code&gt;items&lt;/code&gt; cambia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tus mocks no se actualizan, la suite puede seguir en verde mientras producción falla.&lt;/p&gt;

&lt;p&gt;Para evitarlo:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Genera mocks desde el mismo esquema
&lt;/h3&gt;

&lt;p&gt;Usa el mismo OpenAPI que publica el backend. Si el contrato cambia, el mock debe regenerarse desde esa fuente.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ejecuta pruebas de contrato contra la API real
&lt;/h3&gt;

&lt;p&gt;Mantén una suite pequeña que valide que la API viva sigue respetando el esquema.&lt;/p&gt;

&lt;p&gt;Ejemplo de estrategia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tests/
  unit/           -&amp;gt; usan mock local
  integration/    -&amp;gt; usan mock local o mock cloud
  contract/       -&amp;gt; usan API real de staging
  e2e/            -&amp;gt; usan API real con pocos casos críticos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Revisa mocks en cada pull request
&lt;/h3&gt;

&lt;p&gt;Si una PR cambia una respuesta de API, debe cambiar también:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El esquema OpenAPI.&lt;/li&gt;
&lt;li&gt;Los fixtures mock.&lt;/li&gt;
&lt;li&gt;Las pruebas afectadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trata la simulación como parte del contrato, no como un helper temporal.&lt;/p&gt;

&lt;p&gt;Si quieres un entorno que concentre esquema, mock server y pruebas, puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt;. También puedes comparar alternativas en esta lista de &lt;a href="http://apidog.com/blog/rest-api-mocking-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas de simulación de API REST&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Debería simular la API para cada prueba?
&lt;/h3&gt;

&lt;p&gt;No. Simula en pruebas unitarias e integración cuando estás validando tu propio código. Mantén un conjunto pequeño de pruebas de contrato y end-to-end contra la API real para confirmar que el mock sigue alineado con producción.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre una respuesta mock estática y dinámica?
&lt;/h3&gt;

&lt;p&gt;Una respuesta estática es un JSON fijo y predecible. Es útil para aserciones exactas.&lt;/p&gt;

&lt;p&gt;Una respuesta dinámica se genera por solicitud con valores realistas. Es útil para descubrir errores que un único fixture no detectaría.&lt;/p&gt;

&lt;p&gt;Lo habitual es usar ambas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo aseguro que mi mock siga siendo preciso?
&lt;/h3&gt;

&lt;p&gt;Genera el mock desde el mismo esquema que usa el backend, idealmente OpenAPI. Luego ejecuta pruebas de contrato programadas contra la API real. Si esas pruebas fallan, el contrato o el mock deben actualizarse.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puede un mock simular respuestas lentas o fallidas?
&lt;/h3&gt;

&lt;p&gt;Sí. Puedes configurar respuestas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;500 Internal Server Error&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;429 Too Many Requests&lt;/code&gt; con &lt;code&gt;Retry-After&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;200 OK&lt;/code&gt; con retraso.&lt;/li&gt;
&lt;li&gt;JSON mal formado.&lt;/li&gt;
&lt;li&gt;Timeouts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto permite probar lógica de retries, fallback y manejo de errores sin romper un backend real.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Servidor mock local o en la nube?
&lt;/h3&gt;

&lt;p&gt;Usa mock local para ejecuciones de test: es rápido, aislado y sin latencia externa.&lt;/p&gt;

&lt;p&gt;Usa mock en la nube cuando necesites acceso desde una app móvil, CI remoto, otro equipo o colaboradores externos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Probar APIs con Postman: Guía Práctica Paso a Paso</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:39 +0000</pubDate>
      <link>https://dev.to/roobia/como-probar-apis-con-postman-guia-practica-paso-a-paso-3g39</link>
      <guid>https://dev.to/roobia/como-probar-apis-con-postman-guia-practica-paso-a-paso-3g39</guid>
      <description>&lt;p&gt;Postman es una de las herramientas más usadas para enviar solicitudes HTTP y validar el comportamiento de una API. Sirve para comprobaciones rápidas, pruebas con scripts, ejecución de colecciones y validaciones que pueden integrarse en flujos de CI. Si desarrolla o consume APIs, conviene dominar el flujo básico: crear solicitudes, parametrizarlas, escribir aserciones y ejecutarlas como suite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía probará una API en Postman con un flujo práctico: enviar una solicitud, revisar la respuesta, escribir pruebas, usar variables para cambiar entre entornos y ejecutar una colección completa con Collection Runner. Los ejemplos usan una API pública, así que puede seguirlos sin preparar un backend propio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Postman y envíe su primera solicitud
&lt;/h2&gt;

&lt;p&gt;Descargue Postman desde &lt;a href="https://www.postman.com/downloads/" rel="noopener noreferrer"&gt;el sitio oficial&lt;/a&gt; e instale la aplicación de escritorio. Puede usarla sin cuenta para trabajar localmente, aunque iniciar sesión permite sincronizar colecciones entre dispositivos.&lt;/p&gt;

&lt;p&gt;Para crear su primera solicitud:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra Postman.&lt;/li&gt;
&lt;li&gt;Haga clic en &lt;strong&gt;Nuevo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccione &lt;strong&gt;Solicitud HTTP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Elija el método &lt;code&gt;GET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Introduzca este endpoint:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Haga clic en &lt;strong&gt;Enviar&lt;/strong&gt;. En el panel de respuesta revise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código de estado: &lt;code&gt;200 OK&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tiempo de respuesta&lt;/li&gt;
&lt;li&gt;Tamaño de la respuesta&lt;/li&gt;
&lt;li&gt;Cuerpo de la respuesta en formato JSON&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cambie entre las vistas &lt;strong&gt;Pretty&lt;/strong&gt;, &lt;strong&gt;Raw&lt;/strong&gt; y &lt;strong&gt;Preview&lt;/strong&gt; para ver el cuerpo formateado o sin procesar.&lt;/p&gt;

&lt;p&gt;Para probar un &lt;code&gt;POST&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cambie el método a &lt;code&gt;POST&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Abra la pestaña &lt;strong&gt;Cuerpo&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccione &lt;strong&gt;raw&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Elija &lt;strong&gt;JSON&lt;/strong&gt; como formato.&lt;/li&gt;
&lt;li&gt;Pegue una carga útil como esta:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Maria Chen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maria.chen@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman añadirá automáticamente el encabezado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si la API requiere autenticación, agregue encabezados en la pestaña &lt;strong&gt;Encabezados&lt;/strong&gt;, por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{auth_token}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si necesita una referencia sobre qué códigos esperar en una API REST, consulte la guía sobre &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;códigos de estado HTTP que las API REST deberían usar&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organice las solicitudes en colecciones
&lt;/h2&gt;

&lt;p&gt;Una solicitud aislada sirve para una verificación rápida. Para pruebas reales, agrupe solicitudes relacionadas en una &lt;strong&gt;colección&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo de flujo de colección:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear usuario&lt;/li&gt;
&lt;li&gt;Obtener usuario&lt;/li&gt;
&lt;li&gt;Actualizar usuario&lt;/li&gt;
&lt;li&gt;Eliminar usuario&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para crear una colección:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra &lt;strong&gt;Colecciones&lt;/strong&gt; en la barra lateral.&lt;/li&gt;
&lt;li&gt;Haga clic en el icono &lt;strong&gt;+&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use un nombre específico, por ejemplo: &lt;code&gt;Pruebas de humo de la API de Usuario&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guarde cada solicitud con &lt;strong&gt;Ctrl/Cmd + S&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Asigne nombres claros a las solicitudes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Puede usar carpetas dentro de una colección para separar responsabilidades:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pruebas de humo de la API de Usuario
├── Autenticación
│   └── Login
├── Usuarios
│   ├── Crear usuario
│   ├── Obtener usuario
│   ├── Actualizar usuario
│   └── Eliminar usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las colecciones también son la unidad que se comparte. Puede exportarlas como JSON o compartirlas mediante enlace si usa sincronización en la nube. Esto permite que otros miembros del equipo ejecuten exactamente las mismas solicitudes.&lt;/p&gt;

&lt;p&gt;Además, una colección puede tener scripts compartidos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Script de pre-solicitud&lt;/strong&gt;: se ejecuta antes de cada solicitud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Script de prueba&lt;/strong&gt;: se ejecuta después de cada respuesta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de script de pre-solicitud para agregar una marca de tiempo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;timestamp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de prueba a nivel de colección para limitar el tiempo de respuesta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response time is acceptable&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseTime&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;below&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto evita repetir la misma lógica en cada solicitud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escriba pruebas en la pestaña Pruebas
&lt;/h2&gt;

&lt;p&gt;Enviar una solicitud le muestra qué respondió la API. Una &lt;strong&gt;prueba&lt;/strong&gt; le dice automáticamente si esa respuesta es correcta.&lt;/p&gt;

&lt;p&gt;En Postman, las pruebas se escriben en el área &lt;strong&gt;Scripts&lt;/strong&gt; de una solicitud. En versiones anteriores, esta sección aparecía como la pestaña &lt;strong&gt;Tests&lt;/strong&gt;. Postman ejecuta estos scripts después de recibir la respuesta.&lt;/p&gt;

&lt;p&gt;El patrón principal es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nombre de la prueba&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// aserción&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplos útiles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Verificar código de estado&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code is 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Verificar tiempo de respuesta&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response is under 500ms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseTime&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;below&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Verificar un campo del cuerpo JSON&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User has the expected email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;maria.chen@example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Verificar un encabezado&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type is JSON&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Postman usa sintaxis de Chai para las aserciones, por lo que puede usar expresiones como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;above&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;be&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;below&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de hacer clic en &lt;strong&gt;Enviar&lt;/strong&gt;, revise la pestaña &lt;strong&gt;Resultados de la prueba&lt;/strong&gt;. Cada prueba aparecerá en verde o rojo.&lt;/p&gt;

&lt;p&gt;Buenas prácticas al escribir pruebas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombre cada &lt;code&gt;pm.test&lt;/code&gt; según el comportamiento que valida.&lt;/li&gt;
&lt;li&gt;Verifique lo que realmente rompería a un consumidor de la API.&lt;/li&gt;
&lt;li&gt;Valide código de estado, estructura del cuerpo y campos importantes.&lt;/li&gt;
&lt;li&gt;Evite depender de valores volátiles, como timestamps generados por el servidor.&lt;/li&gt;
&lt;li&gt;Use el panel &lt;strong&gt;Snippets&lt;/strong&gt; para insertar aserciones comunes rápidamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de prueba más robusta para una respuesta de usuario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Response has a valid user shape&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para profundizar en el diseño de aserciones, consulte &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;las aserciones de API y cómo escribirlas bien&lt;/a&gt;. Para estructurar validaciones como casos de prueba, revise el &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ejemplo de caso de prueba de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use entornos y variables
&lt;/h2&gt;

&lt;p&gt;No conviene codificar una URL como esta en todas las solicitudes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;https://api.staging.example.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si luego necesita apuntar a producción, tendría que editar cada endpoint. Para evitarlo, use &lt;strong&gt;entornos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Un entorno es un conjunto de variables con nombre.&lt;/p&gt;

&lt;p&gt;Cree un entorno de staging:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra el gestor de entornos.&lt;/li&gt;
&lt;li&gt;Cree un entorno llamado &lt;code&gt;Staging&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Agregue una variable &lt;code&gt;base_url&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Asigne este valor:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://jsonplaceholder.typicode.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego cambie su solicitud a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {{base_url}}/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora puede crear otro entorno llamado &lt;code&gt;Production&lt;/code&gt; con otro valor para &lt;code&gt;base_url&lt;/code&gt;. Al cambiar el entorno activo desde el menú superior derecho, la misma colección apuntará a otro servidor.&lt;/p&gt;

&lt;p&gt;Las variables también sirven para pasar datos entre solicitudes. Por ejemplo, una solicitud de login puede guardar un token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Save the auth token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auth_token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después, cualquier solicitud puede usarlo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer {{auth_token}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este patrón permite probar flujos encadenados:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Iniciar sesión.&lt;/li&gt;
&lt;li&gt;Guardar token.&lt;/li&gt;
&lt;li&gt;Crear recurso autenticado.&lt;/li&gt;
&lt;li&gt;Consultar recurso.&lt;/li&gt;
&lt;li&gt;Eliminar recurso.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postman ofrece varios alcances de variables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Alcance&lt;/th&gt;
&lt;th&gt;Uso recomendado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Variables de entorno&lt;/td&gt;
&lt;td&gt;Valores que cambian entre staging, producción o local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables de colección&lt;/td&gt;
&lt;td&gt;Valores compartidos por una colección&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables globales&lt;/td&gt;
&lt;td&gt;Valores disponibles en todas partes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variables locales&lt;/td&gt;
&lt;td&gt;Valores temporales durante una ejecución&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use el alcance más limitado posible. Esto reduce errores al cambiar de entorno o ejecutar colecciones compartidas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejecute una colección completa con el Collection Runner
&lt;/h2&gt;

&lt;p&gt;Hacer clic en &lt;strong&gt;Enviar&lt;/strong&gt; en cada solicitud no escala. Para ejecutar una suite completa, use &lt;strong&gt;Collection Runner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra una colección.&lt;/li&gt;
&lt;li&gt;Haga clic en &lt;strong&gt;Ejecutar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Seleccione el entorno.&lt;/li&gt;
&lt;li&gt;Defina el número de iteraciones.&lt;/li&gt;
&lt;li&gt;Adjunte un archivo de datos si lo necesita.&lt;/li&gt;
&lt;li&gt;Haga clic en &lt;strong&gt;Ejecutar&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postman ejecutará las solicitudes de arriba hacia abajo y mostrará un resumen de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solicitudes ejecutadas&lt;/li&gt;
&lt;li&gt;Pruebas aprobadas&lt;/li&gt;
&lt;li&gt;Pruebas fallidas&lt;/li&gt;
&lt;li&gt;Errores por solicitud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El orden de las solicitudes importa. Para flujos autenticados, coloque primero la solicitud de login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Login
2. Crear usuario
3. Obtener usuario
4. Actualizar usuario
5. Eliminar usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así, &lt;code&gt;Login&lt;/code&gt; puede guardar &lt;code&gt;auth_token&lt;/code&gt; y las demás solicitudes pueden reutilizarlo.&lt;/p&gt;

&lt;p&gt;También puede preparar y limpiar datos durante la ejecución:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Crear recurso de prueba
2. Ejecutar validaciones
3. Eliminar recurso de prueba
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto convierte la colección en un recorrido automatizado de extremo a extremo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pruebas basadas en datos
&lt;/h3&gt;

&lt;p&gt;Collection Runner permite adjuntar archivos CSV o JSON. Cada fila se convierte en una iteración.&lt;/p&gt;

&lt;p&gt;Ejemplo CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;email,password,expected_status
user@example.com,correct-password,200
user@example.com,wrong-password,401
missing@example.com,password,404
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la solicitud puede usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{email}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{password}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y en la prueba:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code matches expected result&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iterationData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expected_status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este enfoque evita duplicar solicitudes para probar muchas combinaciones de entrada.&lt;/p&gt;

&lt;p&gt;El artículo sobre &lt;a href="http://apidog.com/blog/data-driven-api-testing-tool-csv-json?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de API basadas en datos con CSV y JSON&lt;/a&gt; cubre el patrón con más detalle. Para ejecutar la misma colección en CI sin interfaz gráfica, Postman proporciona Newman, descrito en la comparación &lt;a href="http://apidog.com/blog/what-is-the-difference-between-newman-and-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Newman versus Postman&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde Postman se vuelve pesado y qué considerar
&lt;/h2&gt;

&lt;p&gt;Postman funciona bien para pruebas exploratorias y suites pequeñas o medianas. A medida que el proyecto crece, suelen aparecer dos fricciones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Las aserciones viven en JavaScript, lo que puede dificultar el trabajo de QA o perfiles no desarrolladores.&lt;/li&gt;
&lt;li&gt;El diseño de API, las pruebas, el mocking y la documentación pueden quedar separados, aumentando el riesgo de divergencia entre contrato y pruebas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; es una plataforma API todo en uno que aborda esos puntos. Importa colecciones de Postman directamente, permite construir aserciones visuales sin código y también admite scripts cuando se necesitan. Al centralizar diseño, depuración, mocking, pruebas y documentación sobre una misma fuente de verdad, ayuda a mantener las pruebas alineadas con la especificación real de la API.&lt;/p&gt;

&lt;p&gt;Si está evaluando alternativas, el resumen de &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alternativas a Postman para pruebas de API&lt;/a&gt; compara ventajas y desventajas. También puede &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; e importar una colección existente para compararlo con su flujo actual.&lt;/p&gt;

&lt;p&gt;Esto no significa que deba abandonar Postman. Sigue siendo una opción sólida para comprobaciones rápidas y equipos que ya lo usan. Lo importante es elegir la herramienta adecuada para el tamaño del flujo, el perfil del equipo y el nivel de automatización que necesita.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Necesito escribir código para probar APIs en Postman?
&lt;/h3&gt;

&lt;p&gt;Para enviar solicitudes y leer respuestas, no. Para aserciones automatizadas, sí. La pestaña de pruebas usa JavaScript y el objeto &lt;code&gt;pm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Puede empezar copiando snippets integrados de Postman, por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Status code is 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si necesita un constructor visual de aserciones sin código, una plataforma dedicada como Apidog puede cubrir ese flujo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre una colección de Postman y un entorno?
&lt;/h3&gt;

&lt;p&gt;Una &lt;strong&gt;colección&lt;/strong&gt; agrupa solicitudes y pruebas. Un &lt;strong&gt;entorno&lt;/strong&gt; contiene variables como &lt;code&gt;base_url&lt;/code&gt;, &lt;code&gt;auth_token&lt;/code&gt; o &lt;code&gt;user_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET {{base_url}}/users/{{user_id}}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La colección define qué se envía. El entorno define contra qué valores se ejecuta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo ejecuto las pruebas de Postman automáticamente en CI?
&lt;/h3&gt;

&lt;p&gt;Use Newman, el ejecutor de línea de comandos de Postman.&lt;/p&gt;

&lt;p&gt;Exporte su colección y entorno, y ejecute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;newman run collection.json &lt;span class="nt"&gt;-e&lt;/span&gt; environment.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Newman devuelve un código distinto de cero si alguna prueba falla, lo que permite fallar el pipeline de CI.&lt;/p&gt;

&lt;p&gt;La guía sobre &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo automatizar pruebas de API en CI/CD&lt;/a&gt; explica cómo integrarlo en un pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puede Postman probar más que APIs REST?
&lt;/h3&gt;

&lt;p&gt;Sí. Postman soporta GraphQL, gRPC, WebSocket y SOAP, además de HTTP y REST. La configuración cambia según el protocolo, pero el enfoque general sigue siendo el mismo: enviar solicitud, inspeccionar respuesta y validar con pruebas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuántas aserciones debería tener una solicitud?
&lt;/h3&gt;

&lt;p&gt;Las suficientes para confirmar que la respuesta es correcta, sin volver la prueba frágil.&lt;/p&gt;

&lt;p&gt;Una base práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código de estado&lt;/li&gt;
&lt;li&gt;Tiempo de respuesta&lt;/li&gt;
&lt;li&gt;Estructura del cuerpo&lt;/li&gt;
&lt;li&gt;Campos críticos para el consumidor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User response is valid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mantenga cada &lt;code&gt;pm.test&lt;/code&gt; enfocado en una expectativa clara para que una falla indique exactamente qué se rompió.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo usar Assert en Node.js: Guía práctica</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:30 +0000</pubDate>
      <link>https://dev.to/roobia/como-usar-assert-en-nodejs-guia-practica-nfn</link>
      <guid>https://dev.to/roobia/como-usar-assert-en-nodejs-guia-practica-nfn</guid>
      <description>&lt;p&gt;Cada framework de pruebas que has utilizado, ya sea Jest, Mocha o &lt;code&gt;node:test&lt;/code&gt;, se basa en una idea simple: defines lo que esperas y lanzas un error si la realidad no coincide. Node.js incluye esa idea como un módulo incorporado llamado &lt;code&gt;assert&lt;/code&gt;: sin instalación, sin dependencias, solo lo importas y empiezas a validar suposiciones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;El módulo &lt;code&gt;assert&lt;/code&gt; sirve para comprobaciones rápidas en scripts, pruebas unitarias simples y validación de respuestas HTTP. También ayuda a entender qué hace realmente una aserción antes de usar un framework más grande. En esta guía verás cómo importar &lt;code&gt;assert&lt;/code&gt;, comparar valores, validar objetos, probar errores, manejar código asíncrono y aplicar las mismas ideas a pruebas de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace el módulo &lt;code&gt;assert&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Una aserción declara que algo debe ser verdadero para que el programa sea correcto.&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto significa: "&lt;code&gt;total&lt;/code&gt; debe ser exactamente &lt;code&gt;100&lt;/code&gt;".&lt;/p&gt;

&lt;p&gt;Si la condición se cumple, no pasa nada. Si falla, Node.js lanza un &lt;code&gt;AssertionError&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Importa siempre la versión estricta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Con ES modules:&lt;/span&gt;
&lt;span class="c1"&gt;// import assert from 'node:assert/strict';&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La aserción más básica verifica que un valor sea truthy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;getUser debe devolver un objeto de usuario&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El segundo argumento es el mensaje de error. Úsalo siempre. Un fallo con contexto es mucho más útil que un &lt;code&gt;AssertionError&lt;/code&gt; genérico.&lt;/p&gt;

&lt;p&gt;Comprender esto también ayuda cuando pasas a &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API&lt;/a&gt; en herramientas especializadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usa modo estricto, no modo legado
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;assert&lt;/code&gt; tiene dos modos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;looseAssert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;strictAssert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El modo legado usa igualdad flexible (&lt;code&gt;==&lt;/code&gt;) en métodos como &lt;code&gt;equal&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// pasa&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto pasa porque JavaScript convierte tipos automáticamente. En pruebas, eso suele ocultar errores.&lt;/p&gt;

&lt;p&gt;El modo estricto usa igualdad estricta (&lt;code&gt;===&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// lanza AssertionError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la práctica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;looseAssert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;looseAssert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// pasa, pero puede ser peligroso&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// falla, como debería&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recomendación: usa siempre &lt;code&gt;node:assert/strict&lt;/code&gt;. En este modo, &lt;code&gt;assert.equal&lt;/code&gt; se comporta como &lt;code&gt;assert.strictEqual&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparar valores primitivos con &lt;code&gt;strictEqual&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Usa &lt;code&gt;assert.strictEqual(actual, expected)&lt;/code&gt; para números, strings, booleanos y otros valores primitivos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;priceWithTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;priceWithTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el cálculo del impuesto debe sumar un 8%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nf"&gt;priceWithTax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el resultado debe ser un número&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para comprobar que dos valores no sean iguales, usa &lt;code&gt;notStrictEqual&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCacheKey&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;refreshCache&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getCacheKey&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;la clave de caché debe cambiar después de la actualización&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No uses &lt;code&gt;strictEqual&lt;/code&gt; para comparar objetos o arrays por contenido. En JavaScript, dos objetos con la misma estructura siguen siendo referencias distintas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// falla&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para eso necesitas igualdad profunda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparar objetos y arrays con &lt;code&gt;deepStrictEqual&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Usa &lt;code&gt;assert.deepStrictEqual(actual, expected)&lt;/code&gt; para comparar estructuras completas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buildOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;buildOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mouse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;keyboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mouse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pending&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el objeto de pedido debe coincidir con la forma esperada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este método compara claves, valores y tipos de forma recursiva.&lt;/p&gt;

&lt;p&gt;Por ejemplo, esto falla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;7&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el id debe ser numérico&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Falla porque &lt;code&gt;7&lt;/code&gt; y &lt;code&gt;'7'&lt;/code&gt; no tienen el mismo tipo. Esa estrictez es útil: detecta cambios silenciosos en tus datos.&lt;/p&gt;

&lt;p&gt;Usa &lt;code&gt;deepStrictEqual&lt;/code&gt; para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objetos devueltos por funciones&lt;/li&gt;
&lt;li&gt;arrays&lt;/li&gt;
&lt;li&gt;cuerpos JSON de APIs&lt;/li&gt;
&lt;li&gt;estructuras anidadas&lt;/li&gt;
&lt;li&gt;fixtures esperados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo con respuesta JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dana Lee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el usuario debe coincidir con la respuesta esperada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tienes muchos casos de entrada, puedes escalar este patrón con pruebas parametrizadas o datos externos. Esta guía sobre &lt;a href="http://apidog.com/blog/data-driven-api-testing-tool-csv-json?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de API basadas en datos con CSV y JSON&lt;/a&gt; explica ese enfoque.&lt;/p&gt;

&lt;p&gt;Cuando &lt;code&gt;deepStrictEqual&lt;/code&gt; falla, Node.js muestra un diff con las propiedades distintas. Para objetos grandes, ese diff suele ser mucho más útil que escribir múltiples &lt;code&gt;strictEqual&lt;/code&gt; campo por campo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validar existencia y formato con &lt;code&gt;ok&lt;/code&gt; y &lt;code&gt;match&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;No todas las pruebas necesitan comparar un objeto completo. A veces solo quieres validar que un valor exista o que tenga cierto formato.&lt;/p&gt;

&lt;p&gt;Usa &lt;code&gt;assert.ok(value)&lt;/code&gt; para comprobar valores truthy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el usuario debe existir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el usuario debe incluir email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;la lista de items no debe estar vacía&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa &lt;code&gt;assert.match(string, regexp)&lt;/code&gt; para validar strings con expresiones regulares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateOrderId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ORD-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateOrderId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sr"&gt;/^ORD-&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el id de pedido debe ser ORD- seguido de dígitos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el id de pedido no debe estar vacío&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También existe &lt;code&gt;assert.doesNotMatch&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doesNotMatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el username no debe contener espacios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este patrón es especialmente útil en pruebas de API, donde algunos valores cambian en cada respuesta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timestamps&lt;/li&gt;
&lt;li&gt;IDs generados&lt;/li&gt;
&lt;li&gt;tokens&lt;/li&gt;
&lt;li&gt;UUIDs&lt;/li&gt;
&lt;li&gt;URLs firmadas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En esos casos, valida la forma, no el valor exacto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probar que una función lanza errores con &lt;code&gt;throws&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A veces el comportamiento correcto es fallar. Para eso usa &lt;code&gt;assert.throws(fn, expectedError)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parsePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RangeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;port must be an integer between 1 and 65535&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Valida que una entrada inválida lance el tipo correcto de error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;throws&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;parsePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;70000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;RangeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;un puerto fuera de rango debe lanzar RangeError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes validar el mensaje con una expresión regular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;throws&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;parsePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;abc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="sr"&gt;/must be an integer/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;un puerto no numérico debe lanzar un error descriptivo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y puedes comprobar que una entrada válida no lance error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doesNotThrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;parsePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;8080&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;un puerto válido no debe lanzar un error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Punto importante: pasa una función, no el resultado de ejecutarla.&lt;/p&gt;

&lt;p&gt;Correcto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;throws&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;parsePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;70000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;RangeError&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Incorrecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;throws&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;parsePort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;70000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;RangeError&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el segundo caso, &lt;code&gt;parsePort('70000')&lt;/code&gt; se ejecuta antes de que &lt;code&gt;assert.throws&lt;/code&gt; pueda capturar el error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probar promesas rechazadas con &lt;code&gt;rejects&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;En código asíncrono, una promesa rechazada equivale a un error lanzado. Para eso usa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assert.rejects&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert.doesNotReject&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos devuelven promesas, así que debes usar &lt;code&gt;await&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id must be a number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Dana Lee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runTests&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;not-a-number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el id de tipo string debe ser rechazado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doesNotReject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;un id válido debe resolverse correctamente&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;runTests&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes pasar una función async:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;not-a-number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;debe rechazar ids no numéricos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No olvides &lt;code&gt;await&lt;/code&gt;. Sin &lt;code&gt;await&lt;/code&gt;, la prueba puede terminar antes de que la aserción se resuelva, y el fallo aparecerá como un rechazo no manejado en lugar de un error claro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usar &lt;code&gt;assert&lt;/code&gt; para probar respuestas de API
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;assert&lt;/code&gt; funciona bien para validar una solicitud HTTP simple: código de estado, headers y cuerpo JSON.&lt;/p&gt;

&lt;p&gt;Ejemplo con &lt;code&gt;fetch&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;testGetUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/users/101&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET /users/101 debe devolver 200&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el id debe ser un número&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;el id debe coincidir con el usuario solicitado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;la respuesta debe incluir un nombre&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;roles debe ser un array&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;testGetUser&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Prueba de API superada&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Prueba de API fallida:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exitCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes validar headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="sr"&gt;/application&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;json/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;la respuesta debe ser JSON&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y validar una estructura parcial del cuerpo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;los campos principales del usuario deben coincidir&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este patrón es útil para scripts pequeños y comprobaciones rápidas. Para una suite real de APIs, normalmente necesitarás más cosas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gestión de entornos&lt;/li&gt;
&lt;li&gt;autenticación reutilizable&lt;/li&gt;
&lt;li&gt;reintentos&lt;/li&gt;
&lt;li&gt;ejecución en CI/CD&lt;/li&gt;
&lt;li&gt;reportes&lt;/li&gt;
&lt;li&gt;escenarios con múltiples requests&lt;/li&gt;
&lt;li&gt;datos de prueba&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para ese siguiente paso, revisa estas guías sobre &lt;a href="http://apidog.com/blog/how-to-write-automated-test-scripts?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo escribir scripts de prueba automatizados&lt;/a&gt; y el &lt;a href="http://apidog.com/blog/pytest-api-automated-testing-framework?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;framework de automatización de API pytest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Si no quieres construir manualmente todo el arnés de pruebas, &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; te permite definir solicitudes de API y adjuntar aserciones visuales sobre códigos de estado, encabezados y campos JSON sin escribir todo el código de aserción. También puedes encadenar solicitudes en escenarios automatizados, ejecutarlos en CI/CD y usar scripts personalizados cuando necesites más control. Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; y usarlo gratis. Junto con &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt;, el módulo &lt;code&gt;assert&lt;/code&gt; de Node.js cubre tanto comprobaciones rápidas como suites más completas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Necesito instalar el módulo &lt;code&gt;assert&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;No. &lt;code&gt;assert&lt;/code&gt; está incorporado en Node.js.&lt;/p&gt;

&lt;p&gt;Impórtalo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O, si usas ES modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No necesitas instalar ningún paquete npm. El prefijo &lt;code&gt;node:&lt;/code&gt; indica explícitamente que estás cargando un módulo central de Node.js.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre &lt;code&gt;assert.equal&lt;/code&gt; y &lt;code&gt;assert.strictEqual&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;En modo legado, &lt;code&gt;assert.equal&lt;/code&gt; usa igualdad flexible (&lt;code&gt;==&lt;/code&gt;) y &lt;code&gt;assert.strictEqual&lt;/code&gt; usa igualdad estricta (&lt;code&gt;===&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;En modo estricto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;assert.equal&lt;/code&gt; se comporta igual que &lt;code&gt;assert.strictEqual&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Recomendación: usa siempre &lt;code&gt;node:assert/strict&lt;/code&gt; para evitar que la coerción de tipos haga pasar una prueba por accidente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo debo usar &lt;code&gt;deepStrictEqual&lt;/code&gt; en lugar de &lt;code&gt;strictEqual&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Usa &lt;code&gt;strictEqual&lt;/code&gt; para valores primitivos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa &lt;code&gt;deepStrictEqual&lt;/code&gt; para objetos y arrays:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;editor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expectedBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;strictEqual&lt;/code&gt; compara referencias. Dos objetos separados con el mismo contenido no son iguales por referencia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Debo usar &lt;code&gt;assert&lt;/code&gt; o un framework como Jest?
&lt;/h3&gt;

&lt;p&gt;Depende del caso.&lt;/p&gt;

&lt;p&gt;Usa &lt;code&gt;assert&lt;/code&gt; para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scripts rápidos&lt;/li&gt;
&lt;li&gt;pruebas pequeñas&lt;/li&gt;
&lt;li&gt;validaciones internas&lt;/li&gt;
&lt;li&gt;aprender fundamentos de testing&lt;/li&gt;
&lt;li&gt;comprobar respuestas HTTP simples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Usa un framework cuando necesites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;organización de suites&lt;/li&gt;
&lt;li&gt;hooks como &lt;code&gt;beforeEach&lt;/code&gt; y &lt;code&gt;afterEach&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;mocks&lt;/li&gt;
&lt;li&gt;reportes&lt;/li&gt;
&lt;li&gt;watch mode&lt;/li&gt;
&lt;li&gt;integración con herramientas de cobertura&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Node.js también incluye &lt;code&gt;node:test&lt;/code&gt;, un runner incorporado que combina muy bien con &lt;code&gt;assert&lt;/code&gt; y no requiere dependencias externas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo afirmo que una función asíncrona se rechaza?
&lt;/h3&gt;

&lt;p&gt;Usa &lt;code&gt;assert.rejects&lt;/code&gt; con &lt;code&gt;await&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;debe rechazar ids inválidos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes validar el mensaje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="sr"&gt;/id must be a number/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;debe devolver un mensaje de error claro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin &lt;code&gt;await&lt;/code&gt;, la aserción puede no ejecutarse correctamente antes de que termine la prueba.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Herramientas Gratuitas Online para Probar APIs: Guía Práctica</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:02 +0000</pubDate>
      <link>https://dev.to/roobia/herramientas-gratuitas-online-para-probar-apis-guia-practica-261i</link>
      <guid>https://dev.to/roobia/herramientas-gratuitas-online-para-probar-apis-guia-practica-261i</guid>
      <description>&lt;p&gt;No necesita una licencia de pago para probar una API correctamente. Con una herramienta gratuita —en navegador, escritorio u open source— puede enviar solicitudes, validar códigos de estado, comprobar el cuerpo de la respuesta y ejecutar una pequeña suite de regresión antes de publicar. La clave no es encontrar “una herramienta gratis”, sino elegir una cuyo plan gratuito no bloquee las funciones que necesitará cuando el proyecto crezca.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía compara herramientas gratuitas de prueba de API que funcionan bien en escenarios reales. Para cada una, verá qué ofrece el nivel gratuito, dónde están los límites y cómo evaluarla con un flujo práctico antes de adoptarla.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué significa realmente “gratuito en línea”
&lt;/h2&gt;

&lt;p&gt;“En línea” puede significar tres cosas distintas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Herramienta 100% navegador&lt;/strong&gt;: no instala nada y trabaja desde una pestaña.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación de escritorio con sincronización en la nube&lt;/strong&gt;: instala un cliente, pero sus colecciones se sincronizan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herramienta open source&lt;/strong&gt;: gratuita, pero normalmente la ejecuta o aloja usted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de elegir, revise estos límites frecuentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Colaboración&lt;/strong&gt;: muchas herramientas son gratis para uso individual, pero cobran cuando se suma el equipo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historial y monitorización&lt;/strong&gt;: algunos planes gratuitos guardan pocos días de resultados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatización&lt;/strong&gt;: las ejecuciones programadas o desde CI/CD suelen estar medidas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si está definiendo su estrategia de pruebas, empiece por distinguir entre &lt;a href="http://apidog.com/blog/test-scenario-vs-test-case?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;un escenario de prueba y un caso de prueba&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Herramientas gratuitas que merece la pena probar
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; es una plataforma todo en uno para diseño, depuración, pruebas automatizadas, mocking y documentación de APIs.&lt;/p&gt;

&lt;p&gt;En el plan gratuito puede trabajar con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST&lt;/li&gt;
&lt;li&gt;GraphQL&lt;/li&gt;
&lt;li&gt;SOAP&lt;/li&gt;
&lt;li&gt;WebSocket&lt;/li&gt;
&lt;li&gt;Escenarios de prueba con solicitudes encadenadas&lt;/li&gt;
&lt;li&gt;Aserciones visuales&lt;/li&gt;
&lt;li&gt;Servidor de mock integrado&lt;/li&gt;
&lt;li&gt;Sin tarjeta de crédito&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo práctico en Apidog sería:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear o importar una API.&lt;/li&gt;
&lt;li&gt;Definir variables de entorno como &lt;code&gt;base_url&lt;/code&gt; y &lt;code&gt;token&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enviar una solicitud inicial, por ejemplo &lt;code&gt;POST /login&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Extraer un valor de la respuesta, como &lt;code&gt;access_token&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reutilizarlo en una segunda solicitud, por ejemplo &lt;code&gt;GET /profile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Añadir aserciones sobre código de estado y campos del JSON.&lt;/li&gt;
&lt;li&gt;Ejecutar el escenario completo como una suite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de comprobaciones que debería añadir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status = 200
body.user.id existe
body.user.email contiene "@"
response time &amp;lt; 500ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog se ejecuta como aplicación de escritorio en Windows, macOS y Linux, con sincronización en la nube. Es útil si quiere diseñar, simular, documentar y probar APIs sin unir varias herramientas. Puede &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; y empezar en el nivel gratuito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hoppscotch
&lt;/h2&gt;

&lt;p&gt;Hoppscotch es una herramienta basada en navegador y open source. No requiere instalación y funciona bien para pruebas rápidas de REST, GraphQL y WebSocket.&lt;/p&gt;

&lt;p&gt;Úsela si necesita:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enviar solicitudes desde el navegador.&lt;/li&gt;
&lt;li&gt;Crear colecciones simples.&lt;/li&gt;
&lt;li&gt;Gestionar entornos.&lt;/li&gt;
&lt;li&gt;Probar APIs sin configurar una aplicación de escritorio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flujo mínimo recomendado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Crear un entorno "staging".
2. Definir base_url.
3. Enviar GET {{base_url}}/health.
4. Verificar status 200.
5. Guardar la solicitud en una colección.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Su punto fuerte es la velocidad y la baja fricción. Su límite principal está en colaboración avanzada, historial y automatización compleja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman nivel gratuito
&lt;/h2&gt;

&lt;p&gt;Postman es una opción conocida para muchos equipos. El nivel gratuito cubre solicitudes manuales, colecciones, entornos y una cantidad limitada de ejecuciones automatizadas mensuales.&lt;/p&gt;

&lt;p&gt;Un ejemplo básico de test en Postman:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status es 200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;la respuesta contiene userId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;pm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;have&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;userId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es una buena opción si su equipo ya conoce su flujo de trabajo. El límite suele aparecer en colaboración, volumen de llamadas y ejecuciones automatizadas. Si lo está comparando con otras opciones, revise esta guía sobre &lt;a href="http://apidog.com/blog/how-to-test-apis-with-postman?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo probar APIs con Postman&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Insomnia
&lt;/h2&gt;

&lt;p&gt;Insomnia es un cliente de escritorio enfocado en depuración para REST, GraphQL y gRPC. Su interfaz es limpia y cómoda para pruebas individuales o suites pequeñas.&lt;/p&gt;

&lt;p&gt;Úselo si quiere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depurar endpoints rápidamente.&lt;/li&gt;
&lt;li&gt;Trabajar desde escritorio.&lt;/li&gt;
&lt;li&gt;Mantener una interfaz simple.&lt;/li&gt;
&lt;li&gt;Probar REST, GraphQL o gRPC sin demasiada configuración.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo típico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Crear una colección por servicio.
2. Definir entornos para local, staging y producción.
3. Guardar tokens como variables.
4. Probar endpoints críticos.
5. Añadir scripts o comprobaciones donde aplique.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para pasos prácticos, consulte el tutorial sobre &lt;a href="http://apidog.com/blog/how-to-use-insomnia-test-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo usar Insomnia para probar una API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SoapUI open source
&lt;/h2&gt;

&lt;p&gt;SoapUI sigue siendo una opción sólida para APIs SOAP y también soporta REST. La edición open source es gratuita y fuerte en pruebas funcionales y basadas en datos.&lt;/p&gt;

&lt;p&gt;Tiene sentido si trabaja con:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servicios SOAP heredados.&lt;/li&gt;
&lt;li&gt;WSDL.&lt;/li&gt;
&lt;li&gt;XML.&lt;/li&gt;
&lt;li&gt;Pruebas funcionales con múltiples datos de entrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de validación típica en SOAP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Importar el WSDL.
2. Generar operaciones.
3. Crear una solicitud SOAP.
4. Ejecutarla contra el endpoint.
5. Validar status HTTP.
6. Validar nodos XML específicos en la respuesta.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Su desventaja es que es una aplicación Java más pesada, y las funciones de reporting más avanzadas están en ReadyAPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thunder Client
&lt;/h2&gt;

&lt;p&gt;Thunder Client es una extensión para VS Code. Si ya trabaja dentro del editor, puede probar APIs sin cambiar de contexto.&lt;/p&gt;

&lt;p&gt;Úselo si quiere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ejecutar solicitudes desde VS Code.&lt;/li&gt;
&lt;li&gt;Guardar colecciones junto al proyecto.&lt;/li&gt;
&lt;li&gt;Probar endpoints durante el desarrollo.&lt;/li&gt;
&lt;li&gt;Evitar abrir una aplicación separada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flujo recomendado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Instalar la extensión en VS Code.
2. Crear una colección por módulo.
3. Configurar variables de entorno.
4. Ejecutar solicitudes desde el editor.
5. Añadir pruebas sin scripts donde aplique.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El nivel gratuito funciona bien para solicitudes individuales y colecciones. La sincronización basada en Git y algunas funciones de equipo son de pago.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tabla comparativa
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Protocolos&lt;/th&gt;
&lt;th&gt;Fortaleza del nivel gratuito&lt;/th&gt;
&lt;th&gt;Límite principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;td&gt;Escritorio + sincronización en la nube&lt;/td&gt;
&lt;td&gt;REST, GraphQL, SOAP, WebSocket&lt;/td&gt;
&lt;td&gt;Diseño, pruebas, mock y documentación&lt;/td&gt;
&lt;td&gt;Equipos grandes necesitan puestos de pago&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hoppscotch&lt;/td&gt;
&lt;td&gt;Navegador, open source&lt;/td&gt;
&lt;td&gt;REST, GraphQL, WebSocket&lt;/td&gt;
&lt;td&gt;Cero instalación y rapidez&lt;/td&gt;
&lt;td&gt;Automatización más ligera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postman&lt;/td&gt;
&lt;td&gt;Escritorio + nube&lt;/td&gt;
&lt;td&gt;REST, GraphQL, gRPC&lt;/td&gt;
&lt;td&gt;Familiar y bien documentado&lt;/td&gt;
&lt;td&gt;Ejecuciones medidas y puestos de pago&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insomnia&lt;/td&gt;
&lt;td&gt;Escritorio&lt;/td&gt;
&lt;td&gt;REST, GraphQL, gRPC&lt;/td&gt;
&lt;td&gt;UX limpia para depuración&lt;/td&gt;
&lt;td&gt;Suite de pruebas más limitada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SoapUI&lt;/td&gt;
&lt;td&gt;Escritorio, open source&lt;/td&gt;
&lt;td&gt;SOAP, REST&lt;/td&gt;
&lt;td&gt;Pruebas SOAP y data-driven&lt;/td&gt;
&lt;td&gt;Aplicación pesada e informes de pago&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thunder Client&lt;/td&gt;
&lt;td&gt;Extensión de VS Code&lt;/td&gt;
&lt;td&gt;REST, GraphQL&lt;/td&gt;
&lt;td&gt;Comodidad dentro del editor&lt;/td&gt;
&lt;td&gt;Sincronización y funciones de equipo de pago&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cómo elegir una herramienta
&lt;/h2&gt;

&lt;p&gt;Empiece por los protocolos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si solo usa &lt;strong&gt;REST&lt;/strong&gt;, casi todas sirven.&lt;/li&gt;
&lt;li&gt;Si usa &lt;strong&gt;GraphQL&lt;/strong&gt;, revise soporte para queries, variables y entornos.&lt;/li&gt;
&lt;li&gt;Si usa &lt;strong&gt;SOAP&lt;/strong&gt;, considere &lt;a href="http://apidog.com/blog/online-soap-api-tester?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;un probador de API SOAP en línea&lt;/a&gt; o SoapUI.&lt;/li&gt;
&lt;li&gt;Si usa &lt;strong&gt;WebSocket&lt;/strong&gt;, limite la búsqueda a herramientas que lo soporten explícitamente, como Apidog o Hoppscotch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Después evalúe navegador vs escritorio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;navegador&lt;/strong&gt; si quiere cero instalación.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;escritorio&lt;/strong&gt; si necesita acceder a &lt;code&gt;localhost&lt;/code&gt;, redes privadas, archivos grandes o trabajar offline.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;escritorio con sincronización en la nube&lt;/strong&gt; si quiere acceso local y continuidad entre máquinas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego pruebe el mismo flujo en cada herramienta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Crear un entorno "staging".
2. Definir base_url.
3. Enviar POST /login.
4. Guardar access_token desde la respuesta.
5. Enviar GET /me usando ese token.
6. Validar status 200.
7. Validar un campo del cuerpo.
8. Ejecutar ambas solicitudes como una suite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La herramienta que haga este flujo con menos fricción probablemente sea la mejor para su equipo. Para mejorar esas verificaciones, revise cómo escribir &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API útiles&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Herramientas gratuitas y pipelines de CI
&lt;/h2&gt;

&lt;p&gt;Una herramienta gratuita puede servir para CI/CD, pero debe revisar el volumen permitido.&lt;/p&gt;

&lt;p&gt;Ejemplos comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postman exporta colecciones que puede ejecutar con Newman.&lt;/li&gt;
&lt;li&gt;Hoppscotch tiene CLI.&lt;/li&gt;
&lt;li&gt;Apidog ejecuta escenarios desde su propio ejecutor y se integra con pipelines.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un patrón básico de CI sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-tests&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test-api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ejecutar pruebas de API&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "Ejecute aquí su CLI o runner de pruebas de API"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El límite del nivel gratuito suele ser la cantidad de ejecuciones automatizadas, no la capacidad de automatizar. Una suite nocturna puede ser suficiente. Una suite en cada commit dentro de un repositorio con mucho tráfico puede requerir un plan de pago.&lt;/p&gt;

&lt;p&gt;Si su objetivo es CI/CD, esta guía sobre &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;automatización de pruebas de API en CI/CD&lt;/a&gt; cubre los patrones principales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué debe validar una prueba de API
&lt;/h2&gt;

&lt;p&gt;Evite llamar “prueba” a una solicitud que solo se ejecuta. Una prueba útil afirma algo concreto.&lt;/p&gt;

&lt;p&gt;Como mínimo, valide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Código de estado.
2. Estructura del cuerpo.
3. Campos obligatorios.
4. Valores críticos para el negocio.
5. Tiempo de respuesta aceptable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de aserciones para un endpoint &lt;code&gt;GET /orders/{id}&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status = 200
body.id existe
body.status está en ["pending", "paid", "cancelled"]
body.total &amp;gt; 0
body.currency = "USD"
response time &amp;lt; 700ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;códigos de estado HTTP que debe usar una API REST&lt;/a&gt; son una buena base para definir estas comprobaciones. Una prueba que solo valida &lt;code&gt;200&lt;/code&gt; puede pasar aunque la respuesta sea incompleta o incorrecta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes con herramientas gratuitas
&lt;/h2&gt;

&lt;h2&gt;
  
  
  1. Elegir una herramienta solo para “probarla”
&lt;/h2&gt;

&lt;p&gt;No elija una herramienta que sabe que reemplazará pronto. Evalúe si el plan gratuito puede acompañar al proyecto durante meses.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. No usar entornos desde el primer día
&lt;/h2&gt;

&lt;p&gt;Evite esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://staging.api.com/users
https://staging.api.com/orders
https://staging.api.com/payments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{base_url}}/users
{{base_url}}/orders
{{base_url}}/payments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y defina entornos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;local:    http://localhost:3000
staging:  https://staging.api.com
prod:     https://api.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Codificar tokens en cada solicitud
&lt;/h2&gt;

&lt;p&gt;Evite duplicar tokens manualmente. Guárdelos como variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer {{access_token}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si la herramienta lo permite, extraiga &lt;code&gt;access_token&lt;/code&gt; automáticamente desde la respuesta de login.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Ignorar la latencia
&lt;/h2&gt;

&lt;p&gt;Si un endpoint que debería responder en &lt;code&gt;100ms&lt;/code&gt; tarda &lt;code&gt;800ms&lt;/code&gt;, eso es una señal. No necesita una herramienta de carga para detectar regresiones simples.&lt;/p&gt;

&lt;p&gt;Para pruebas de carga más deliberadas, consulte este &lt;a href="http://apidog.com/blog/api-performance-testing-tutorial?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;tutorial de pruebas de rendimiento de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. No exportar el trabajo
&lt;/h2&gt;

&lt;p&gt;Los planes gratuitos pueden cambiar. Exporte sus colecciones y manténgalas en control de versiones cuando sea posible.&lt;/p&gt;

&lt;p&gt;Ejemplo de estructura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api-tests/
  collections/
    users.json
    orders.json
  environments/
    local.json
    staging.json
  README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Navegador vs escritorio en detalle
&lt;/h2&gt;

&lt;p&gt;Las herramientas de navegador son cómodas porque no requieren instalación. Sin embargo, están sujetas al sandbox de seguridad del navegador. Eso puede afectar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Llamadas a &lt;code&gt;localhost&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Acceso a redes privadas.&lt;/li&gt;
&lt;li&gt;Cargas de archivos grandes.&lt;/li&gt;
&lt;li&gt;Payloads binarios.&lt;/li&gt;
&lt;li&gt;Comportamiento CORS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes de adoptar una herramienta de navegador, pruebe que puede acceder a su API local:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET http://localhost:3000/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las aplicaciones de escritorio evitan muchos de esos límites. Pueden abrir conexiones de red directamente, acceder a servicios locales y trabajar mejor con cargas grandes. También pueden seguir funcionando sin conexión.&lt;/p&gt;

&lt;p&gt;El coste es instalar y actualizar la aplicación. Por eso muchos equipos prefieren una aplicación de escritorio con sincronización en la nube: mantiene el acceso local y permite continuar el trabajo en varias máquinas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo mantener saludable una suite gratuita de pruebas
&lt;/h2&gt;

&lt;p&gt;Una suite se degrada si no se mantiene. Los endpoints cambian, los campos se renombran y las aserciones quedan obsoletas.&lt;/p&gt;

&lt;p&gt;Haga una revisión periódica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cada 2-4 semanas:
1. Eliminar endpoints obsoletos.
2. Actualizar URLs o rutas modificadas.
3. Revisar aserciones rotas.
4. Renombrar pruebas ambiguas.
5. Mover solicitudes a carpetas por flujo.
6. Exportar la colección actualizada.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use nombres descriptivos.&lt;/p&gt;

&lt;p&gt;Evite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prueba 1
test users
request final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefiera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;crear usuario con email válido
rechazar login con contraseña incorrecta
crear pedido con moneda inválida
obtener perfil con token expirado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agrupe por flujos reales:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Autenticación/
  login exitoso
  login con contraseña incorrecta
  refresh token

Pedidos/
  crear pedido
  pagar pedido
  cancelar pedido
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La misma disciplina que ayuda a definir un &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;caso de prueba&lt;/a&gt; también mejora una colección de solicitudes de API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ¿Las herramientas gratuitas de prueba de API son suficientes para producción?
&lt;/h2&gt;

&lt;p&gt;Sí, para muchos equipos. Los niveles gratuitos suelen cubrir creación de solicitudes, entornos, aserciones y automatización básica. Normalmente se pasa a un plan de pago por colaboración, historial más largo o CI/CD de alto volumen.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Puedo probar APIs SOAP con herramientas gratuitas?
&lt;/h2&gt;

&lt;p&gt;Sí. Apidog soporta SOAP en su nivel gratuito, y SoapUI open source está diseñado para ese tipo de servicios. SOAP suele requerir XML, envoltorios específicos y a veces WSDL, por lo que conviene usar una herramienta con soporte explícito. Puede consultar la &lt;a href="https://www.w3.org/TR/soap12/" rel="noopener noreferrer"&gt;especificación oficial de SOAP&lt;/a&gt; del W3C para detalles del protocolo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué diferencia hay entre una herramienta de navegador y una de escritorio?
&lt;/h2&gt;

&lt;p&gt;Una herramienta de navegador funciona sin instalación, pero puede estar limitada por seguridad del navegador, CORS o acceso a red local. Una herramienta de escritorio puede acceder mejor a &lt;code&gt;localhost&lt;/code&gt;, redes privadas, archivos grandes y trabajo offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Las herramientas gratuitas soportan suites automatizadas?
&lt;/h2&gt;

&lt;p&gt;La mayoría sí. Puede encadenar solicitudes, agregar aserciones y ejecutarlas como suite. Postman puede combinarse con &lt;a href="https://github.com/postman-tools/newman" rel="noopener noreferrer"&gt;Newman&lt;/a&gt;, mientras que Hoppscotch y Apidog tienen sus propios ejecutores. El límite suele ser la cantidad de ejecuciones automatizadas disponibles en el plan gratuito.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Con qué herramienta debería empezar un equipo pequeño?
&lt;/h2&gt;

&lt;p&gt;Empiece con una herramienta que cubra diseño, pruebas y mocking para evitar añadir productos más adelante. Apidog y Hoppscotch son buenas opciones para equipos pequeños en sus niveles gratuitos. Ejecute el mismo flujo de dos solicitudes encadenadas con aserciones y quédese con la que resulte más fluida para su stack.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Probar Conexiones WebSocket con Curl y Otras Herramientas</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:23:00 +0000</pubDate>
      <link>https://dev.to/roobia/como-probar-conexiones-websocket-con-curl-y-otras-herramientas-594i</link>
      <guid>https://dev.to/roobia/como-probar-conexiones-websocket-con-curl-y-otras-herramientas-594i</guid>
      <description>&lt;p&gt;WebSocket te da un canal persistente y bidireccional entre cliente y servidor sobre una única conexión TCP. A diferencia de REST, no pruebas una respuesta aislada: pruebas un flujo de mensajes, eventos enviados por el servidor, autenticación, timeouts y cierre de conexión.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía muestra cómo probar WebSocket de forma práctica: qué puedes hacer con &lt;code&gt;curl&lt;/code&gt;, cuándo usar &lt;code&gt;websocat&lt;/code&gt; y cuándo conviene usar una GUI como Apidog. Todos los comandos están listos para copiar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué las pruebas de WebSocket no son como las pruebas REST
&lt;/h2&gt;

&lt;p&gt;Una prueba REST suele ser una transacción:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Envías una solicitud.&lt;/li&gt;
&lt;li&gt;Recibes una respuesta.&lt;/li&gt;
&lt;li&gt;Validás el estado, headers y body.&lt;/li&gt;
&lt;li&gt;Terminas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Una prueba WebSocket es una conversación:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abres una conexión.&lt;/li&gt;
&lt;li&gt;Envías uno o varios mensajes.&lt;/li&gt;
&lt;li&gt;Recibes respuestas.&lt;/li&gt;
&lt;li&gt;Esperas mensajes enviados por el servidor.&lt;/li&gt;
&lt;li&gt;Mantienes o cierras la conexión.&lt;/li&gt;
&lt;li&gt;Validás el código de cierre.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eso cambia lo que debes verificar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que el handshake HTTP se actualiza correctamente a WebSocket.&lt;/li&gt;
&lt;li&gt;Que el servidor acepta la autenticación.&lt;/li&gt;
&lt;li&gt;Que el primer mensaje válido recibe la respuesta esperada.&lt;/li&gt;
&lt;li&gt;Que los mensajes enviados por el servidor llegan sin nuevas solicitudes.&lt;/li&gt;
&lt;li&gt;Que los errores se reportan de forma controlada.&lt;/li&gt;
&lt;li&gt;Que el cierre usa un código esperado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una herramienta pensada para solicitudes únicas tiene limitaciones aquí. Por eso &lt;code&gt;curl&lt;/code&gt; sirve para comprobaciones rápidas, pero no reemplaza a una herramienta WebSocket real.&lt;/p&gt;

&lt;p&gt;Si quieres estructurar estas pruebas, la diferencia entre &lt;a href="http://apidog.com/blog/test-scenario-vs-test-case?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;un escenario de prueba y un caso de prueba&lt;/a&gt; encaja bien con WebSocket: una conversación completa es un escenario; un mensaje específico con respuesta esperada es un caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  El handshake de WebSocket
&lt;/h2&gt;

&lt;p&gt;Toda conexión WebSocket empieza como una solicitud HTTP que pide actualizar el protocolo.&lt;/p&gt;

&lt;p&gt;El cliente envía headers como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Version: 13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el servidor acepta, responde:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;101&lt;/span&gt; &lt;span class="ne"&gt;Switching Protocols&lt;/span&gt;
&lt;span class="na"&gt;Upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;websocket&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después de ese &lt;code&gt;101&lt;/code&gt;, la conexión deja de ser HTTP y empieza a usar tramas WebSocket, definidas en &lt;a href="https://www.rfc-editor.org/rfc/rfc6455" rel="noopener noreferrer"&gt;RFC 6455&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esta es la principal limitación de &lt;code&gt;curl&lt;/code&gt;: puede iniciar el handshake, pero no siempre es cómodo para enviar, recibir y procesar tramas WebSocket durante una sesión interactiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando WebSocket con curl
&lt;/h2&gt;

&lt;p&gt;Las versiones modernas de &lt;code&gt;curl&lt;/code&gt;, desde la 7.86, incluyen soporte experimental para WebSocket.&lt;/p&gt;

&lt;p&gt;Primero, verifica tu versión:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tienes &lt;code&gt;curl&lt;/code&gt; 7.86 o posterior, puedes probar el handshake contra un endpoint WebSocket.&lt;/p&gt;

&lt;p&gt;Ejemplo con un servidor echo público:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--include&lt;/span&gt; &lt;span class="nt"&gt;--no-buffer&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Connection: Upgrade"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Upgrade: websocket"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Sec-WebSocket-Version: 13"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ=="&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://echo.websocket.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Qué revisar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--include&lt;/code&gt; muestra los headers de respuesta.&lt;/li&gt;
&lt;li&gt;Debes ver &lt;code&gt;HTTP/1.1 101 Switching Protocols&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--no-buffer&lt;/code&gt; evita que &lt;code&gt;curl&lt;/code&gt; retenga la salida, algo importante en conexiones de streaming.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para conexiones seguras, usa &lt;code&gt;wss://&lt;/code&gt; del mismo modo que usarías &lt;code&gt;https://&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; es útil para una comprobación rápida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--include&lt;/span&gt; &lt;span class="nt"&gt;--no-buffer&lt;/span&gt; wss://example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Úsalo para responder preguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;¿El endpoint existe?&lt;/li&gt;
&lt;li&gt;¿El servidor acepta el upgrade?&lt;/li&gt;
&lt;li&gt;¿La autenticación falla antes del handshake?&lt;/li&gt;
&lt;li&gt;¿La ruta devuelve &lt;code&gt;404&lt;/code&gt;, &lt;code&gt;401&lt;/code&gt;, &lt;code&gt;403&lt;/code&gt; o &lt;code&gt;101&lt;/code&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pero para sesiones interactivas con varios mensajes, &lt;code&gt;curl&lt;/code&gt; no es la opción más cómoda. Si quieres integrar este tipo de comprobaciones en una pipeline, revisa cómo &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;automatizar pruebas de API en CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando WebSocket con websocat
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;websocat&lt;/code&gt; es una herramienta de línea de comandos diseñada específicamente para WebSocket. Funciona como un &lt;code&gt;netcat&lt;/code&gt; para conexiones &lt;code&gt;ws://&lt;/code&gt; y &lt;code&gt;wss://&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Instalación en macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;websocat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalación con Cargo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;websocat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conectarte a un endpoint echo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat wss://echo.websocket.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto abre una sesión interactiva. Escribe un mensaje, presiona Enter y verás la respuesta del servidor.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hello
hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enviar un solo mensaje y salir
&lt;/h3&gt;

&lt;p&gt;Para enviar un mensaje desde un script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"action":"subscribe","channel":"prices"}'&lt;/span&gt; | websocat wss://stream.example.com/feed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto sirve para pruebas simples de request/response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enviar headers de autenticación
&lt;/h3&gt;

&lt;p&gt;Muchos endpoints WebSocket requieren tokens en headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer your-token-here"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  wss://api.example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes usar parámetros de consulta si tu API los requiere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat &lt;span class="s2"&gt;"wss://api.example.com/socket?token=your-token-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Probar mensajes JSON
&lt;/h3&gt;

&lt;p&gt;Puedes enviar JSON directamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat wss://api.example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego escribe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"subscribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el servidor responde correctamente, deberías ver algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"subscribed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usar websocat en scripts
&lt;/h3&gt;

&lt;p&gt;Un patrón básico para automatizar una comprobación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"type":"ping"}'&lt;/span&gt; | websocat &lt;span class="nt"&gt;-1&lt;/span&gt; wss://api.example.com/socket&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'"type":"pong"'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WebSocket OK"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WebSocket failed"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;websocat&lt;/code&gt; cubre la mayoría de los casos que &lt;code&gt;curl&lt;/code&gt; no maneja bien: sesiones interactivas, headers personalizados, entrada por stdin, salida por stdout y pruebas automatizadas.&lt;/p&gt;

&lt;p&gt;Para validar payloads de forma consistente, las ideas de &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API útiles&lt;/a&gt; también aplican a mensajes WebSocket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Probando WebSocket con una herramienta GUI
&lt;/h2&gt;

&lt;p&gt;La línea de comandos es ideal para scripts, CI y comprobaciones rápidas. Pero para pruebas exploratorias, una GUI suele ser más eficiente.&lt;/p&gt;

&lt;p&gt;Usa una GUI cuando necesitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ver una línea de tiempo de mensajes enviados y recibidos.&lt;/li&gt;
&lt;li&gt;Enviar JSON estructurado sin escribir todo en la terminal.&lt;/li&gt;
&lt;li&gt;Mantener una conexión abierta mientras pruebas distintos mensajes.&lt;/li&gt;
&lt;li&gt;Configurar headers, query params o tokens de autenticación.&lt;/li&gt;
&lt;li&gt;Compartir una prueba reproducible con otro desarrollador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; incluye un cliente WebSocket dedicado. Puedes ingresar una URL &lt;code&gt;ws://&lt;/code&gt; o &lt;code&gt;wss://&lt;/code&gt;, conectarte y ver cada mensaje en una línea de tiempo con resaltado JSON. También puedes guardar conexiones, configurar headers y parámetros de consulta, y probar WebSocket junto con REST, GraphQL y SOAP en la misma aplicación.&lt;/p&gt;

&lt;p&gt;Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; para probar endpoints WebSocket con una vista visual de mensajes.&lt;/p&gt;

&lt;p&gt;Como regla práctica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;curl&lt;/code&gt; para confirmar accesibilidad y handshake.&lt;/li&gt;
&lt;li&gt;Usa &lt;code&gt;websocat&lt;/code&gt; para pruebas técnicas desde terminal.&lt;/li&gt;
&lt;li&gt;Usa una GUI para exploración, depuración visual y colaboración.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si quieres comparar opciones, este resumen de &lt;a href="http://apidog.com/blog/online-api-testing-tools-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas gratuitas de prueba de API en línea&lt;/a&gt; incluye alternativas que manejan WebSocket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lista de verificación para probar WebSocket
&lt;/h2&gt;

&lt;p&gt;Usa esta checklist cuando pruebes un endpoint WebSocket.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Confirma el upgrade
&lt;/h3&gt;

&lt;p&gt;La conexión debe devolver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;101&lt;/span&gt; &lt;span class="ne"&gt;Switching Protocols&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si no recibes &lt;code&gt;101&lt;/code&gt;, revisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL incorrecta.&lt;/li&gt;
&lt;li&gt;Ruta incorrecta.&lt;/li&gt;
&lt;li&gt;Headers faltantes.&lt;/li&gt;
&lt;li&gt;Autenticación fallida.&lt;/li&gt;
&lt;li&gt;Proxy o gateway bloqueando el upgrade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Verifica la autenticación
&lt;/h3&gt;

&lt;p&gt;Confirma dónde espera el servidor el token:&lt;/p&gt;

&lt;p&gt;Header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer your-token-here"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  wss://api.example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query param:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat &lt;span class="s2"&gt;"wss://api.example.com/socket?token=your-token-here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una conexión que se abre y se cierra inmediatamente suele indicar token inválido, expirado o enviado en el lugar incorrecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Envía un mensaje conocido
&lt;/h3&gt;

&lt;p&gt;Usa una carga útil válida para tu API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"subscribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"prices"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifica que la respuesta tenga la forma esperada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"subscribed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"prices"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Verifica mensajes enviados por el servidor
&lt;/h3&gt;

&lt;p&gt;Después de suscribirte, no envíes nada más. Espera mensajes entrantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"price.updated"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"BTCUSD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65000&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto valida el comportamiento principal de WebSocket: entrega de eventos sin solicitud adicional.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prueba errores
&lt;/h3&gt;

&lt;p&gt;Envía un mensaje inválido:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"unknown"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El servidor debería responder con un error controlado, no cerrar la conexión sin explicación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Unsupported action"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Prueba el cierre
&lt;/h3&gt;

&lt;p&gt;Cierra la conexión y revisa el código de cierre.&lt;/p&gt;

&lt;p&gt;Códigos comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1000&lt;/code&gt;: cierre normal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1006&lt;/code&gt;: cierre anormal sin handshake limpio.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1011&lt;/code&gt;: error interno del servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para organizar estas comprobaciones en un conjunto repetible, la guía sobre &lt;a href="http://apidog.com/blog/test-suites-api-test-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo construir suites de prueba de API&lt;/a&gt; también aplica a flujos WebSocket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Depurando una conexión WebSocket que no funciona
&lt;/h2&gt;

&lt;p&gt;Cuando una conexión WebSocket falla, revisa estos puntos en orden.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Verifica el esquema de la URL
&lt;/h3&gt;

&lt;p&gt;Usa el esquema correcto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ws://example.com/socket
wss://example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ws://&lt;/code&gt; no está cifrado.&lt;br&gt;&lt;br&gt;
&lt;code&gt;wss://&lt;/code&gt; usa TLS.&lt;/p&gt;

&lt;p&gt;Si tu aplicación corre sobre HTTPS, los navegadores pueden bloquear conexiones &lt;code&gt;ws://&lt;/code&gt; porque mezclan contenido seguro e inseguro. En producción, usa &lt;code&gt;wss://&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Revisa el resultado del handshake
&lt;/h3&gt;

&lt;p&gt;Si no recibes &lt;code&gt;101&lt;/code&gt;, el servidor no aceptó la actualización.&lt;/p&gt;

&lt;p&gt;Códigos típicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;400&lt;/code&gt;: headers de upgrade faltantes o mal formados.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;401&lt;/code&gt;: autenticación requerida.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;403&lt;/code&gt;: autenticación rechazada o permisos insuficientes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt;: ruta incorrecta.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;101&lt;/code&gt;: upgrade correcto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--include&lt;/span&gt; &lt;span class="nt"&gt;--no-buffer&lt;/span&gt; wss://api.example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con &lt;code&gt;websocat&lt;/code&gt;, usa modo verboso si necesitas más detalle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat &lt;span class="nt"&gt;-v&lt;/span&gt; wss://api.example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Revisa timeouts y ping/pong
&lt;/h3&gt;

&lt;p&gt;Si el handshake funciona pero la conexión se cierra segundos después, puede ser por inactividad.&lt;/p&gt;

&lt;p&gt;Muchos servidores esperan frames ping/pong para confirmar que el cliente sigue vivo. También puede haber un proxy o balanceador de carga cerrando conexiones inactivas.&lt;/p&gt;

&lt;p&gt;Revisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timeout del servidor.&lt;/li&gt;
&lt;li&gt;Timeout del proxy.&lt;/li&gt;
&lt;li&gt;Configuración del load balancer.&lt;/li&gt;
&lt;li&gt;Reglas de idle timeout.&lt;/li&gt;
&lt;li&gt;Si el cliente responde a ping/pong.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Lee el código de cierre
&lt;/h3&gt;

&lt;p&gt;Los códigos de cierre están definidos en &lt;a href="https://www.rfc-editor.org/rfc/rfc6455#section-7.4" rel="noopener noreferrer"&gt;RFC 6455&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1000&lt;/code&gt;: cierre normal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1001&lt;/code&gt;: endpoint se va.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1002&lt;/code&gt;: error de protocolo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1003&lt;/code&gt;: tipo de datos no soportado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1006&lt;/code&gt;: cierre anormal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1011&lt;/code&gt;: error interno del servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El código de cierre suele indicar si el problema está en el cliente, el servidor, la red o la autenticación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatizando comprobaciones WebSocket
&lt;/h2&gt;

&lt;p&gt;Una prueba manual confirma que el endpoint funciona ahora. Para evitar regresiones, necesitas ejecutarla de forma automática.&lt;/p&gt;

&lt;p&gt;Un flujo mínimo automatizado debería validar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;La conexión se actualiza a WebSocket.&lt;/li&gt;
&lt;li&gt;Un mensaje conocido recibe la respuesta esperada.&lt;/li&gt;
&lt;li&gt;Una suscripción recibe al menos un evento dentro de un timeout.&lt;/li&gt;
&lt;li&gt;La prueba falla con código distinto de cero si algo no coincide.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo simple con &lt;code&gt;websocat&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail

&lt;span class="nv"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"wss://api.example.com/socket"&lt;/span&gt;
&lt;span class="nv"&gt;MESSAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{"type":"ping"}'&lt;/span&gt;
&lt;span class="nv"&gt;EXPECTED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'"type":"pong"'&lt;/span&gt;

&lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$MESSAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | websocat &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Response: &lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EXPECTED&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WebSocket check passed"&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"WebSocket check failed"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese script puede ejecutarse en CI como cualquier otro paso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./test-websocket.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mantén estas pruebas enfocadas. No intentes validar todos los mensajes posibles de una conexión larga. Es mejor tener pruebas pequeñas y estables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una prueba para handshake.&lt;/li&gt;
&lt;li&gt;Una prueba para autenticación.&lt;/li&gt;
&lt;li&gt;Una prueba para request/response.&lt;/li&gt;
&lt;li&gt;Una prueba para suscripción.&lt;/li&gt;
&lt;li&gt;Una prueba para error controlado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La misma disciplina que mantiene claro un &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;caso de prueba&lt;/a&gt; también mantiene fiables las comprobaciones WebSocket: prueba una cosa específica y hazla verificable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Puede curl probar conexiones WebSocket?
&lt;/h3&gt;

&lt;p&gt;Parcialmente. &lt;code&gt;curl&lt;/code&gt; 7.86 y posteriores tiene soporte experimental para WebSocket. Sirve para comprobar si un endpoint es accesible y si el handshake se completa. Para sesiones interactivas con muchos mensajes, &lt;code&gt;websocat&lt;/code&gt; o una GUI como Apidog son mejores opciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre ws y wss?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ws://&lt;/code&gt; es WebSocket sin cifrado.&lt;br&gt;&lt;br&gt;
&lt;code&gt;wss://&lt;/code&gt; es WebSocket cifrado con TLS.&lt;/p&gt;

&lt;p&gt;Es la misma diferencia práctica que entre HTTP y HTTPS. Usa &lt;code&gt;wss://&lt;/code&gt; fuera del desarrollo local, porque &lt;code&gt;ws://&lt;/code&gt; envía mensajes en texto plano.&lt;/p&gt;
&lt;h3&gt;
  
  
  ¿Por qué mi conexión WebSocket se abre y luego se cierra inmediatamente?
&lt;/h3&gt;

&lt;p&gt;La causa más común es autenticación fallida. El servidor puede aceptar la conexión TCP y luego cerrarla si el token falta, expiró o está en el lugar incorrecto.&lt;/p&gt;

&lt;p&gt;Revisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Header &lt;code&gt;Authorization&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Parámetros de consulta.&lt;/li&gt;
&lt;li&gt;Expiración del token.&lt;/li&gt;
&lt;li&gt;Código de cierre.&lt;/li&gt;
&lt;li&gt;Logs del servidor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ¿Es websocat mejor que curl para probar WebSocket?
&lt;/h3&gt;

&lt;p&gt;Sí, para WebSocket específicamente. &lt;code&gt;websocat&lt;/code&gt; está diseñado para este protocolo, soporta sesiones interactivas, headers personalizados, redirección de entrada/salida y manejo correcto de tramas. Usa &lt;code&gt;curl&lt;/code&gt; para comprobaciones rápidas y &lt;code&gt;websocat&lt;/code&gt; para pruebas reales desde terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  ¿Cómo pruebo que un servidor envía mensajes sin una solicitud?
&lt;/h3&gt;

&lt;p&gt;Abre la conexión, suscríbete al canal o evento requerido y espera sin enviar más mensajes.&lt;/p&gt;

&lt;p&gt;Con &lt;code&gt;websocat&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;websocat wss://api.example.com/socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Envía:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"subscribe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego observa si llegan eventos sin más entrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"order.created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"ord_123"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con una GUI como Apidog, esos mensajes aparecen en la línea de tiempo de la conexión.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Comparativa de Herramientas Online para Mocking de APIs: Apidog, Mockoon, WireMock, Beeceptor y Postman</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:22:30 +0000</pubDate>
      <link>https://dev.to/roobia/comparativa-de-herramientas-online-para-mocking-de-apis-apidog-mockoon-wiremock-beeceptor-y-8k6</link>
      <guid>https://dev.to/roobia/comparativa-de-herramientas-online-para-mocking-de-apis-apidog-mockoon-wiremock-beeceptor-y-8k6</guid>
      <description>&lt;p&gt;Una herramienta de simulación de API en línea te permite trabajar contra un endpoint funcional antes de que exista el backend. Apuntas tu frontend, app móvil o suite de pruebas a una URL alojada y recibes respuestas realistas. La clave es que Apidog, Mockoon, WireMock, Beeceptor y Postman difieren mucho en alojamiento, generación de datos, lógica condicional y esfuerzo de configuración.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Esta guía compara esas cinco herramientas desde una perspectiva práctica: dónde se ejecuta el mock, cómo se configuran respuestas, qué tan fácil es generar datos dinámicos y en qué escenarios conviene usar cada una. Al final encontrarás una tabla comparativa, criterios de selección y preguntas frecuentes para elegir sin adivinar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué significa “en línea” para un servidor de simulación
&lt;/h2&gt;

&lt;p&gt;“En línea” puede significar dos cosas distintas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mock en la nube&lt;/strong&gt;: se ejecuta en la infraestructura del proveedor y expone una URL pública.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock local&lt;/strong&gt;: se ejecuta en tu máquina, contenedor o runner de CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La diferencia afecta directamente el flujo de trabajo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Necesidad&lt;/th&gt;
&lt;th&gt;Mejor opción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compartir un endpoint con un equipo remoto&lt;/td&gt;
&lt;td&gt;URL pública&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probar desde una app móvil real&lt;/td&gt;
&lt;td&gt;URL pública&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejecutar pruebas aisladas en CI&lt;/td&gt;
&lt;td&gt;Local o contenedor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trabajar sin conexión&lt;/td&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacer una demo rápida a cliente&lt;/td&gt;
&lt;td&gt;URL pública&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Antes de elegir una herramienta, decide si necesitas una URL pública, un mock local o ambos. Esta decisión se relaciona con la comparación más amplia entre &lt;a href="http://apidog.com/blog/mock-server-vs-real-server?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;servidor de simulación versus servidor real&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Además del alojamiento, evalúa cinco criterios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Generación automática de datos&lt;/strong&gt;: ¿la herramienta rellena respuestas realistas o tienes que escribir cada payload?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respuestas condicionales&lt;/strong&gt;: ¿puede responder distinto según headers, query params, body o ruta?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esfuerzo de configuración&lt;/strong&gt;: ¿usas una GUI, una colección, JSON stubs o código?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integración con el diseño de API&lt;/strong&gt;: ¿el mock se mantiene alineado con la especificación?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso en CI/CD&lt;/strong&gt;: ¿puede ejecutarse en pipelines o contenedores?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Apidog
&lt;/h2&gt;

&lt;p&gt;Apidog genera endpoints de simulación a partir del diseño de tu API. Defines un endpoint y obtienes una URL de mock sin configurar un servidor aparte.&lt;/p&gt;

&lt;p&gt;El flujo típico es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Diseña el endpoint.&lt;/li&gt;
&lt;li&gt;Define parámetros, body y schema de respuesta.&lt;/li&gt;
&lt;li&gt;Usa la URL de mock generada.&lt;/li&gt;
&lt;li&gt;Conecta frontend, app móvil o pruebas automatizadas a esa URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog incluye &lt;strong&gt;Smart Mock&lt;/strong&gt;, que genera datos a partir de los nombres de campo. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-15T10:30:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"avatar"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/avatar.png"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el schema contiene campos como &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt; o &lt;code&gt;avatar&lt;/code&gt;, Apidog puede devolver datos coherentes con esos nombres en lugar de valores genéricos como &lt;code&gt;"string"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para escenarios más complejos, &lt;strong&gt;Advanced Mock&lt;/strong&gt; permite devolver respuestas distintas según la solicitud. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;200&lt;/code&gt; para un usuario existente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;404&lt;/code&gt; para un ID inexistente.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;422&lt;/code&gt; para una entrada inválida conocida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto resulta útil para probar flujos de éxito y error sin esperar a que el backend implemente todos los casos.&lt;/p&gt;

&lt;p&gt;Apidog también combina diseño, mock, depuración y &lt;a href="http://apidog.com/blog/api-contract-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de contrato de API&lt;/a&gt; en un mismo proyecto. Esto reduce el riesgo de que el mock se desvíe de la especificación cuando el contrato cambia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Úsalo si:&lt;/strong&gt; quieres un mock generado desde un diseño real de API, con datos realistas, URL compartible y flujo integrado de pruebas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mockoon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mockoon.com" rel="noopener noreferrer"&gt;Mockoon&lt;/a&gt; es una aplicación de escritorio gratuita y de código abierto para crear mocks locales rápidamente.&lt;/p&gt;

&lt;p&gt;El flujo básico es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea un entorno en la app de escritorio.&lt;/li&gt;
&lt;li&gt;Define rutas como &lt;code&gt;GET /users&lt;/code&gt; o &lt;code&gt;POST /login&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Añade respuestas estáticas o dinámicas.&lt;/li&gt;
&lt;li&gt;Ejecuta el servidor en un puerto local.&lt;/li&gt;
&lt;li&gt;Apunta tu cliente a &lt;code&gt;http://localhost:&amp;lt;puerto&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mockoon soporta plantillas dinámicas con Faker.js. Por ejemplo, puedes devolver datos similares a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{faker 'number.int'}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{faker 'person.fullName'}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{faker 'internet.email'}}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También permite respuestas basadas en reglas, por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Devolver una respuesta si existe un header específico.&lt;/li&gt;
&lt;li&gt;Cambiar el payload según un query param.&lt;/li&gt;
&lt;li&gt;Simular latencia con retrasos configurables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mockoon se ejecuta localmente por defecto. Si necesitas usarlo en CI o en un servidor propio, puedes usar su CLI o imagen de Docker. No ofrece una URL pública de nube de primera parte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Úsalo si:&lt;/strong&gt; quieres un mock local rápido, gratuito, sin registro y sin dependencia de la nube.&lt;/p&gt;

&lt;h2&gt;
  
  
  WireMock
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://wiremock.org" rel="noopener noreferrer"&gt;WireMock&lt;/a&gt; es una herramienta madura y orientada a código para crear mocks precisos. Tiene raíces fuertes en la JVM, pero puede ejecutarse como proceso independiente, contenedor o servicio.&lt;/p&gt;

&lt;p&gt;WireMock destaca en la coincidencia de solicitudes. Puedes definir stubs que respondan según:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ruta.&lt;/li&gt;
&lt;li&gt;Método HTTP.&lt;/li&gt;
&lt;li&gt;Headers.&lt;/li&gt;
&lt;li&gt;Cookies.&lt;/li&gt;
&lt;li&gt;Query params.&lt;/li&gt;
&lt;li&gt;Body JSON.&lt;/li&gt;
&lt;li&gt;Patrones o expresiones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un stub típico en WireMock se parece a esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/users/123"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jsonBody"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada Lovelace"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WireMock también incluye plantillas de respuesta, inyección de fallos, proxy, grabación y reproducción.&lt;/p&gt;

&lt;p&gt;Puedes ejecutarlo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Localmente.&lt;/li&gt;
&lt;li&gt;En Docker.&lt;/li&gt;
&lt;li&gt;En CI/CD.&lt;/li&gt;
&lt;li&gt;En WireMock Cloud de pago si necesitas una URL alojada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Su principal coste es la configuración. Normalmente defines stubs en JSON o código, no desde una GUI simple. A cambio, obtienes control granular y mocks versionables junto al código, algo útil para la &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;automatización de pruebas de API en CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Úsalo si:&lt;/strong&gt; necesitas mocks programables, versionados y con coincidencia precisa de solicitudes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beeceptor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://beeceptor.com" rel="noopener noreferrer"&gt;Beeceptor&lt;/a&gt; es una de las formas más rápidas de obtener una URL pública de mock.&lt;/p&gt;

&lt;p&gt;El flujo es simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Nombras un endpoint desde el navegador.&lt;/li&gt;
&lt;li&gt;Beeceptor genera una URL alojada.&lt;/li&gt;
&lt;li&gt;Defines reglas de respuesta.&lt;/li&gt;
&lt;li&gt;Inspeccionas las solicitudes entrantes desde la interfaz web.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Es útil para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demos rápidas.&lt;/li&gt;
&lt;li&gt;Probar webhooks.&lt;/li&gt;
&lt;li&gt;Compartir una URL temporal.&lt;/li&gt;
&lt;li&gt;Interceptar callbacks de terceros.&lt;/li&gt;
&lt;li&gt;Simular parcialmente un backend existente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beeceptor también puede actuar como proxy hacia un backend real e interceptar solo rutas seleccionadas. Esto permite, por ejemplo, usar el backend real para la mayoría de endpoints y mockear solo una ruta que aún no está lista.&lt;/p&gt;

&lt;p&gt;La limitación principal es que el uso serio requiere plan de pago, y al estar basado en la nube no es ideal para trabajo sin conexión ni ejecuciones de CI completamente aisladas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Úsalo si:&lt;/strong&gt; necesitas una URL pública rápida, inspección de requests y configuración mínima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Postman
&lt;/h2&gt;

&lt;p&gt;Postman permite crear un servidor de simulación a partir de una colección guardada.&lt;/p&gt;

&lt;p&gt;El flujo habitual es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creas o reutilizas una colección.&lt;/li&gt;
&lt;li&gt;Añades ejemplos de respuesta a cada request.&lt;/li&gt;
&lt;li&gt;Publicas la colección como mock server.&lt;/li&gt;
&lt;li&gt;Postman aloja una URL pública.&lt;/li&gt;
&lt;li&gt;El mock devuelve el ejemplo que mejor coincide con la solicitud entrante.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://&amp;lt;mock-id&amp;gt;.mock.pstmn.io/users/123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La ventaja es la conveniencia si tu equipo ya trabaja con colecciones de Postman. El mock vive junto a las requests existentes.&lt;/p&gt;

&lt;p&gt;La desventaja es que la configuración es más manual que en herramientas orientadas a mocks dinámicos. Debes definir cada ejemplo de respuesta, y la lógica condicional es más limitada. Los valores dinámicos existen mediante variables de Postman, pero requieren configuración manual.&lt;/p&gt;

&lt;p&gt;Si estás evaluando opciones, también puede ser útil revisar &lt;a href="http://apidog.com/blog/best-postman-alternatives-for-api-testing?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;alternativas a Postman para pruebas de API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Úsalo si:&lt;/strong&gt; tu equipo ya está estandarizado en Postman y solo necesita mocks alojados simples a partir de colecciones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparación lado a lado
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Alojamiento&lt;/th&gt;
&lt;th&gt;Datos auto-generados&lt;/th&gt;
&lt;th&gt;Respuestas condicionales&lt;/th&gt;
&lt;th&gt;Esfuerzo de configuración&lt;/th&gt;
&lt;th&gt;Nivel gratuito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;td&gt;Nube + local&lt;/td&gt;
&lt;td&gt;Sí, a partir de nombres de campo&lt;/td&gt;
&lt;td&gt;Sí, Advanced Mock&lt;/td&gt;
&lt;td&gt;Muy bajo&lt;/td&gt;
&lt;td&gt;Generoso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mockoon&lt;/td&gt;
&lt;td&gt;Local + auto-alojado&lt;/td&gt;
&lt;td&gt;Sí, Faker.js&lt;/td&gt;
&lt;td&gt;Sí, basado en reglas&lt;/td&gt;
&lt;td&gt;Bajo&lt;/td&gt;
&lt;td&gt;Completamente gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WireMock&lt;/td&gt;
&lt;td&gt;Local, contenedor, nube de pago&lt;/td&gt;
&lt;td&gt;Con plantillas&lt;/td&gt;
&lt;td&gt;Sí, coincidencia profunda&lt;/td&gt;
&lt;td&gt;Alto&lt;/td&gt;
&lt;td&gt;Núcleo de código abierto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beeceptor&lt;/td&gt;
&lt;td&gt;Solo en la nube&lt;/td&gt;
&lt;td&gt;Plantillas limitadas&lt;/td&gt;
&lt;td&gt;Sí, reglas de simulación&lt;/td&gt;
&lt;td&gt;Muy bajo&lt;/td&gt;
&lt;td&gt;Volumen limitado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postman&lt;/td&gt;
&lt;td&gt;Nube&lt;/td&gt;
&lt;td&gt;Manual, mediante variables&lt;/td&gt;
&lt;td&gt;Limitado&lt;/td&gt;
&lt;td&gt;Medio&lt;/td&gt;
&lt;td&gt;Llamadas limitadas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Cómo elegir
&lt;/h2&gt;

&lt;p&gt;Empieza por el alojamiento.&lt;/p&gt;

&lt;p&gt;Si necesitas una URL pública para una app móvil, un compañero remoto o una demo, considera:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apidog.&lt;/li&gt;
&lt;li&gt;Beeceptor.&lt;/li&gt;
&lt;li&gt;Postman.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si solo necesitas pruebas locales o CI aislado, considera:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mockoon.&lt;/li&gt;
&lt;li&gt;WireMock.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego decide entre rapidez y control.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Si quieres...&lt;/th&gt;
&lt;th&gt;Elige...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;URL pública en menos de un minuto&lt;/td&gt;
&lt;td&gt;Beeceptor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mock local gratuito sin cuenta&lt;/td&gt;
&lt;td&gt;Mockoon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stubs versionados y precisos&lt;/td&gt;
&lt;td&gt;WireMock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mock desde una colección existente&lt;/td&gt;
&lt;td&gt;Postman&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mock generado desde el diseño de API&lt;/td&gt;
&lt;td&gt;Apidog&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Finalmente, revisa dónde vive el mock respecto al contrato de API. Un mock independiente funciona para un stub temporal. Pero si el diseño cambia cada semana, un mock separado puede quedarse obsoleto rápido.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; mantiene la simulación generada a partir del diseño de API. Si el contrato cambia, el mock se actualiza con el diseño. Si además necesitas datos realistas sin escribir payloads a mano, esa automatización elimina buena parte del trabajo repetitivo.&lt;/p&gt;

&lt;p&gt;Para probar el flujo completo de diseño, mock y pruebas, puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt;. También puedes revisar esta guía sobre &lt;a href="http://apidog.com/blog/rest-api-mocking-tools?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas de simulación de API REST&lt;/a&gt; y esta lista de &lt;a href="http://apidog.com/blog/online-api-testing-tools-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas gratuitas de pruebas de API en línea&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una nota sobre la calidad de los datos simulados
&lt;/h2&gt;

&lt;p&gt;Un mock que devuelve esto para todo no ayuda demasiado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Técnicamente es una respuesta válida, pero no prueba cómo se comporta el cliente con datos realistas.&lt;/p&gt;

&lt;p&gt;Evalúa la calidad de datos con una prueba simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Genera un endpoint de mock.&lt;/li&gt;
&lt;li&gt;Envía una solicitud real.&lt;/li&gt;
&lt;li&gt;Inspecciona el body.&lt;/li&gt;
&lt;li&gt;Comprueba si los datos se parecen a producción.&lt;/li&gt;
&lt;li&gt;Prueba casos de error, listas vacías y valores límite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Las herramientas se diferencian bastante aquí:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apidog&lt;/strong&gt; infiere datos desde nombres de campo como &lt;code&gt;email&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt; o &lt;code&gt;avatar&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mockoon&lt;/strong&gt; puede lograr datos realistas con plantillas Faker.js.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WireMock&lt;/strong&gt; depende de plantillas y stubs definidos por ti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Postman&lt;/strong&gt; requiere ejemplos y variables configuradas manualmente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beeceptor&lt;/strong&gt; ofrece reglas y plantillas, pero está más orientado a rapidez y endpoints públicos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si los datos simulados no parecen reales, tus pruebas contra ellos tampoco reflejarán bien el comportamiento del cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre una simulación de API en la nube y una local?
&lt;/h3&gt;

&lt;p&gt;Una simulación en la nube se ejecuta en servidores del proveedor y expone una URL pública. Es útil para compartir, probar apps móviles y hacer demos.&lt;/p&gt;

&lt;p&gt;Una simulación local se ejecuta en tu máquina, contenedor o runner de CI. Suele ser más rápida, funciona sin conexión y mantiene las pruebas aisladas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué herramienta de simulación requiere la menor configuración?
&lt;/h3&gt;

&lt;p&gt;Beeceptor y Apidog son las opciones más rápidas.&lt;/p&gt;

&lt;p&gt;Beeceptor genera una URL pública en cuanto nombras un endpoint. Apidog genera un mock automáticamente desde el diseño de API, sin configurar un servidor de simulación separado.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿WireMock es solo para proyectos Java?
&lt;/h3&gt;

&lt;p&gt;No. WireMock tiene raíces en la JVM, pero puede ejecutarse como proceso independiente, imagen Docker o servicio con API HTTP. Sus stubs en JSON son agnósticos del lenguaje, por lo que también sirve para equipos políglotas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Estas herramientas pueden generar datos realistas automáticamente?
&lt;/h3&gt;

&lt;p&gt;Sí, pero con diferencias.&lt;/p&gt;

&lt;p&gt;Apidog infiere datos desde nombres de campo como &lt;code&gt;email&lt;/code&gt; o &lt;code&gt;phone&lt;/code&gt;. Mockoon usa plantillas Faker.js. WireMock admite plantillas de respuesta. Postman usa variables y ejemplos que debes configurar manualmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Debería usar el servidor de simulación de Postman si mi equipo ya usa Postman?
&lt;/h3&gt;

&lt;p&gt;Sí, si necesitas algo simple y tu colección ya está en Postman. Es el camino de menor resistencia.&lt;/p&gt;

&lt;p&gt;Pero si necesitas datos generados automáticamente, respuestas condicionales avanzadas o mocks más conectados al diseño de API, una herramienta dedicada puede ahorrar más tiempo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo usar Talend API Tester para pruebas de API</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:22:28 +0000</pubDate>
      <link>https://dev.to/roobia/como-usar-talend-api-tester-para-pruebas-de-api-j84</link>
      <guid>https://dev.to/roobia/como-usar-talend-api-tester-para-pruebas-de-api-j84</guid>
      <description>&lt;p&gt;Talend API Tester es una extensión de Chrome para enviar solicitudes HTTP e inspeccionar respuestas sin salir del navegador. Antes se llamaba Restlet Client, y muchos desarrolladores aún la usan para comprobaciones rápidas porque solo requiere instalar la extensión. Soporta APIs REST, métodos HTTP comunes y escenarios para encadenar varias solicitudes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía vas a usar Talend API Tester en un flujo práctico: instalar la extensión, enviar solicitudes &lt;code&gt;GET&lt;/code&gt; y &lt;code&gt;POST&lt;/code&gt;, organizar llamadas en proyectos y servicios, crear un escenario con varias solicitudes en secuencia y añadir aserciones para validar respuestas automáticamente. Los ejemplos usan una API pública para que puedas seguirlos sin preparar backend propio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalar la extensión y enviar una solicitud
&lt;/h2&gt;

&lt;p&gt;Talend API Tester está disponible en la Chrome Web Store. Busca &lt;strong&gt;“Talend API Tester”&lt;/strong&gt; y haz clic en &lt;strong&gt;Añadir a Chrome&lt;/strong&gt;. También funciona en navegadores basados en Chromium, como Edge o Brave.&lt;/p&gt;

&lt;p&gt;Después de instalarla:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abre Talend API Tester desde el menú de extensiones.&lt;/li&gt;
&lt;li&gt;Fíjala a la barra de herramientas si la vas a usar con frecuencia.&lt;/li&gt;
&lt;li&gt;Abre el panel principal de la extensión.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La interfaz se divide en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una barra lateral izquierda para proyectos, servicios y solicitudes guardadas.&lt;/li&gt;
&lt;li&gt;Un panel derecho para construir la solicitud.&lt;/li&gt;
&lt;li&gt;Un selector de método HTTP.&lt;/li&gt;
&lt;li&gt;Un campo de URL.&lt;/li&gt;
&lt;li&gt;Secciones para encabezados, cuerpo, autenticación y respuesta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para enviar una solicitud básica, selecciona &lt;code&gt;GET&lt;/code&gt; y usa este endpoint de JSONPlaceholder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://jsonplaceholder.typicode.com/users/1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Haz clic en &lt;strong&gt;Enviar&lt;/strong&gt;. Talend API Tester mostrará:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Código de estado.&lt;/li&gt;
&lt;li&gt;Tiempo de respuesta.&lt;/li&gt;
&lt;li&gt;Encabezados.&lt;/li&gt;
&lt;li&gt;Cuerpo de la respuesta.&lt;/li&gt;
&lt;li&gt;JSON o XML formateado de forma legible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para probar una solicitud &lt;code&gt;POST&lt;/code&gt;, cambia el método a &lt;code&gt;POST&lt;/code&gt;, abre la sección &lt;strong&gt;Cuerpo&lt;/strong&gt; y selecciona &lt;code&gt;application/json&lt;/code&gt;. Usa una carga útil como esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Priya Nair"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priya.nair@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tu API requiere autenticación, añade un encabezado en la sección &lt;strong&gt;Encabezados&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer TU_TOKEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes usar los ayudantes de autenticación integrados para esquemas como Basic, Digest, OAuth y Bearer si prefieres no escribir el encabezado manualmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organizar solicitudes en proyectos y servicios
&lt;/h2&gt;

&lt;p&gt;Para pruebas rápidas, unas cuantas solicitudes sueltas son suficientes. Pero cuando empiezas a validar varios endpoints, necesitas estructura. Talend API Tester organiza el trabajo en:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proyectos&lt;/strong&gt;: agrupan una API o un conjunto de pruebas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicios&lt;/strong&gt;: agrupan endpoints relacionados dentro de un proyecto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solicitudes&lt;/strong&gt;: llamadas HTTP concretas guardadas dentro de un servicio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crea un proyecto llamado, por ejemplo, &lt;code&gt;API de Usuario&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dentro del proyecto, crea servicios como:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Usuarios&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pedidos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Autenticación&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Guarda cada solicitud en el servicio correspondiente.&lt;/li&gt;
&lt;li&gt;Define una URL base en el servicio si varios endpoints comparten el mismo host.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por ejemplo, si el servicio usa esta URL base:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://jsonplaceholder.typicode.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Las solicitudes pueden guardar solo la ruta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users/1
/posts/1
/comments/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto evita duplicación y facilita cambios posteriores.&lt;/p&gt;

&lt;p&gt;Esta estructura importa por dos razones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Te permite encontrar solicitudes sin buscar entre decenas de llamadas sin nombre.&lt;/li&gt;
&lt;li&gt;Es necesaria para construir escenarios, porque los escenarios reutilizan solicitudes guardadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Talend API Tester también soporta variables de entorno. Puedes definir una variable como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;host=https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y usarla en tus solicitudes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{{host}}/users/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego puedes crear otro entorno con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;host=https://api.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así cambias de staging a producción sin editar cada URL manualmente. Esto reduce errores, especialmente cuando trabajas con endpoints destructivos como &lt;code&gt;DELETE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;También puedes importar trabajo existente. Talend API Tester acepta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Colecciones de Postman.&lt;/li&gt;
&lt;li&gt;Definiciones Swagger.&lt;/li&gt;
&lt;li&gt;Definiciones OpenAPI.&lt;/li&gt;
&lt;li&gt;Archivos HAR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si ya tienes una especificación o una colección exportada, impórtala en lugar de recrear todas las solicitudes a mano. Para estructurar mejor tus validaciones, consulta esta guía de &lt;a href="http://apidog.com/blog/api-test-case-example?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;ejemplo de caso de prueba de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construir un escenario para ejecutar solicitudes en secuencia
&lt;/h2&gt;

&lt;p&gt;Una solicitud aislada responde una pregunta concreta: “¿este endpoint responde?”. Pero muchas pruebas reales validan un flujo completo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear un registro.&lt;/li&gt;
&lt;li&gt;Leerlo.&lt;/li&gt;
&lt;li&gt;Actualizarlo.&lt;/li&gt;
&lt;li&gt;Eliminarlo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Talend API Tester maneja estos flujos con &lt;strong&gt;escenarios&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Un escenario es una lista ordenada de solicitudes guardadas. Para crear uno:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Guarda las solicitudes que quieres reutilizar.&lt;/li&gt;
&lt;li&gt;Crea un escenario desde la barra lateral.&lt;/li&gt;
&lt;li&gt;Añade las solicitudes en el orden correcto.&lt;/li&gt;
&lt;li&gt;Ejecuta el escenario.&lt;/li&gt;
&lt;li&gt;Revisa el resultado de cada paso.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de flujo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. POST /users
2. GET /users/{id}
3. PUT /users/{id}
4. DELETE /users/{id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La parte más útil es pasar datos entre pasos. Por ejemplo, si una solicitud de creación devuelve un &lt;code&gt;id&lt;/code&gt;, puedes extraer ese valor y usarlo en una solicitud posterior.&lt;/p&gt;

&lt;p&gt;Respuesta de ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Priya Nair"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"priya.nair@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese &lt;code&gt;id&lt;/code&gt; puede guardarse como variable y reutilizarse en la siguiente URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users/{{userId}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así pruebas flujos con estado, no solo llamadas aisladas.&lt;/p&gt;

&lt;p&gt;Los escenarios también soportan lógica condicional y repetición. Puedes hacer que un paso se ejecute solo si otro devolvió un estado concreto, o repetir una solicitud para validar un endpoint varias veces. Combinado con variables, esto permite modelar flujos más realistas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Autenticarse
2. Crear un recurso
3. Validar que se puede leer
4. Actualizarlo
5. Confirmar el cambio
6. Eliminarlo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecutar este flujo completo da una señal más útil que lanzar cada solicitud manualmente. El artículo sobre &lt;a href="http://apidog.com/blog/test-scenario-vs-test-case?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;escenario de prueba versus caso de prueba&lt;/a&gt; explica la diferencia entre una verificación única y un flujo de varios pasos, que aquí se corresponde con solicitudes individuales frente a escenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Añadir aserciones para que la herramienta verifique las respuestas
&lt;/h2&gt;

&lt;p&gt;Ejecutar una solicitud te muestra qué respondió la API. Las &lt;strong&gt;aserciones&lt;/strong&gt; verifican si esa respuesta es correcta.&lt;/p&gt;

&lt;p&gt;En Talend API Tester puedes añadir aserciones a una solicitud guardada. En lugar de escribir código, las configuras desde un formulario. Las más comunes son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El &lt;strong&gt;código de estado&lt;/strong&gt; es igual al esperado, por ejemplo &lt;code&gt;200&lt;/code&gt; o &lt;code&gt;201&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;tiempo de respuesta&lt;/strong&gt; está por debajo de un umbral, por ejemplo &lt;code&gt;500&lt;/code&gt; ms.&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;campo del cuerpo&lt;/strong&gt; coincide con un valor esperado.&lt;/li&gt;
&lt;li&gt;Un &lt;strong&gt;encabezado&lt;/strong&gt; existe o tiene un valor concreto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo de criterios para una solicitud &lt;code&gt;GET /users/1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code = 200
Response time &amp;lt; 500 ms
Body field $.id = 1
Header Content-Type contains application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada aserción se evalúa cuando ejecutas la solicitud, ya sea individualmente o dentro de un escenario. El panel de resultados marca cada aserción como aprobada o fallida.&lt;/p&gt;

&lt;p&gt;Esto convierte un escenario en una prueba de regresión repetible. En lugar de leer manualmente cada respuesta, ejecutas el escenario y revisas qué pasos pasaron o fallaron.&lt;/p&gt;

&lt;p&gt;La ventaja de las aserciones basadas en formularios es que son accesibles para testers o desarrolladores que no quieren escribir scripts. La limitación es que el vocabulario es más básico que el de una herramienta basada en código. Si necesitas validar condiciones complejas, valores calculados o relaciones entre múltiples campos, puedes alcanzar el límite de la herramienta.&lt;/p&gt;

&lt;p&gt;Para la mayoría de comprobaciones diarias, suele bastar con:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status code esperado
Tiempo de respuesta máximo
Campos clave del cuerpo
Encabezados importantes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para decidir qué conviene validar, revisa esta guía sobre &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leer la respuesta correctamente
&lt;/h2&gt;

&lt;p&gt;Aunque añadas aserciones, necesitas saber interpretar una respuesta HTTP. Revisa siempre estas cuatro partes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Código de estado
&lt;/h3&gt;

&lt;p&gt;Es la primera señal de resultado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;2xx&lt;/code&gt;: éxito.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;4xx&lt;/code&gt;: error del cliente o de la solicitud.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;5xx&lt;/code&gt;: error del servidor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplos comunes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;200 OK
201 Created
400 Bad Request
401 Unauthorized
404 Not Found
500 Internal Server Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una referencia como la guía sobre &lt;a href="http://apidog.com/blog/which-http-status-codes-rest-apis-should-use?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;códigos de estado HTTP que las APIs REST deben usar&lt;/a&gt; ayuda a interpretar casos menos obvios.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tiempo de respuesta
&lt;/h3&gt;

&lt;p&gt;Talend API Tester muestra cuánto tardó la solicitud. Un endpoint puede devolver datos correctos y aun así fallar desde el punto de vista de rendimiento.&lt;/p&gt;

&lt;p&gt;Por ejemplo, podrías definir una regla interna como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /users/{id} debe responder en menos de 500 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si empieza a responder en 2 o 3 segundos, hay un problema aunque el código sea &lt;code&gt;200&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Encabezados
&lt;/h3&gt;

&lt;p&gt;Los encabezados explican comportamiento que no siempre aparece en el cuerpo. Revisa especialmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Content-Type
Cache-Control
Authorization
Access-Control-Allow-Origin
X-RateLimit-Limit
X-RateLimit-Remaining
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pueden ayudarte a diagnosticar problemas de CORS, caché, autenticación o límites de tasa.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cuerpo
&lt;/h3&gt;

&lt;p&gt;El cuerpo contiene los datos reales, normalmente en JSON o XML. Valida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Campos obligatorios.&lt;/li&gt;
&lt;li&gt;Tipos de datos.&lt;/li&gt;
&lt;li&gt;Valores esperados.&lt;/li&gt;
&lt;li&gt;Estructura del objeto.&lt;/li&gt;
&lt;li&gt;Mensajes de error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Leanne Graham"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sincere@april.biz"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No basta con que la API responda. Debe responder con el estado, el rendimiento, los encabezados y el cuerpo correctos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuando una extensión de Chrome no es suficiente
&lt;/h2&gt;

&lt;p&gt;Talend API Tester es práctico para comprobaciones rápidas desde el navegador. Sus límites aparecen cuando el trabajo crece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Está ligado a Chrome.&lt;/li&gt;
&lt;li&gt;No está pensado para ejecutarse sin interfaz gráfica en CI/CD.&lt;/li&gt;
&lt;li&gt;Sus aserciones son útiles, pero más básicas que las de una plataforma de pruebas completa.&lt;/li&gt;
&lt;li&gt;No cubre diseño de API, mocking o documentación como parte de un mismo flujo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; es una plataforma de API todo en uno que cubre esas brechas. Es una aplicación independiente, importa Postman, OpenAPI y otros formatos igual que Talend API Tester, y añade constructor visual de aserciones, servidores mock, escenarios de prueba automatizados y documentación generada dentro de un mismo proyecto.&lt;/p&gt;

&lt;p&gt;Como la especificación y las pruebas comparten una única fuente de verdad, es más fácil evitar que la documentación, los mocks y los casos de prueba se desalineen. Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; e importar tus solicitudes existentes para comparar el flujo de trabajo. Para revisar más alternativas, consulta esta comparación de &lt;a href="http://apidog.com/blog/online-api-testing-tools-free?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;herramientas gratuitas de prueba de API en línea&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Talend API Tester sigue siendo una buena opción para verificaciones rápidas en el navegador. La clave es ajustar la herramienta al tamaño y la etapa de tu trabajo de pruebas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Es Talend API Tester lo mismo que Restlet Client?
&lt;/h3&gt;

&lt;p&gt;Sí. Talend API Tester es la versión renombrada de la herramienta que antes se llamaba Restlet Client. Sigue siendo una extensión de Chrome para enviar solicitudes HTTP, organizarlas y ejecutar escenarios con aserciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es Talend API Tester gratuito?
&lt;/h3&gt;

&lt;p&gt;Existe una versión gratuita disponible en la Chrome Web Store. Cubre el envío de solicitudes, la organización en proyectos y la creación de escenarios con aserciones. Las versiones de pago históricamente añadían funciones de equipo y límites mayores. Para la mayoría de pruebas individuales, la versión gratuita es suficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puede Talend API Tester ejecutar pruebas en CI/CD?
&lt;/h3&gt;

&lt;p&gt;No directamente. Es una extensión de Chrome y se ejecuta dentro del navegador, por lo que no está pensada para correr sin interfaz gráfica en un pipeline. Para pruebas automatizadas en cada commit, necesitas una herramienta con ejecutor de línea de comandos. Esta guía sobre &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo automatizar pruebas de API en CI/CD&lt;/a&gt; muestra cómo suele configurarse ese flujo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué formatos puede importar Talend API Tester?
&lt;/h3&gt;

&lt;p&gt;Puede importar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Colecciones de Postman.&lt;/li&gt;
&lt;li&gt;Definiciones Swagger.&lt;/li&gt;
&lt;li&gt;Definiciones OpenAPI.&lt;/li&gt;
&lt;li&gt;Archivos HAR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto permite reutilizar especificaciones o exportaciones existentes en lugar de recrear cada solicitud manualmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿En qué se diferencia un escenario de una única solicitud?
&lt;/h3&gt;

&lt;p&gt;Una solicitud única envía una llamada HTTP y muestra una respuesta. Un escenario ejecuta una lista ordenada de solicitudes y puede pasar datos capturados de una respuesta a pasos posteriores.&lt;/p&gt;

&lt;p&gt;Una solicitud aislada sirve para validar un endpoint. Un escenario sirve para probar un flujo completo, como crear un recurso, leerlo, actualizarlo y eliminarlo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automatización de Pruebas API con Robot Framework: Guía Práctica</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:21:55 +0000</pubDate>
      <link>https://dev.to/roobia/automatizacion-de-pruebas-api-con-robot-framework-guia-practica-7p2</link>
      <guid>https://dev.to/roobia/automatizacion-de-pruebas-api-con-robot-framework-guia-practica-7p2</guid>
      <description>&lt;p&gt;Robot Framework adopta una postura diferente a las herramientas que priorizan el código: en lugar de escribir pruebas como código de programa, defines casos como tablas de palabras clave legibles. Para pruebas de API, RequestsLibrary convierte llamadas HTTP en pasos como &lt;code&gt;Create Session&lt;/code&gt;, &lt;code&gt;GET On Session&lt;/code&gt; y &lt;code&gt;Status Should Be&lt;/code&gt;, lo que permite que QA, analistas y developers revisen la misma suite.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía vas a montar una suite de pruebas de API con Robot Framework desde cero: instalación, primera prueba, sesiones autenticadas, aserciones sobre JSON, palabras clave reutilizables y ejecución en CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es Robot Framework y por qué encaja en pruebas de API
&lt;/h2&gt;

&lt;p&gt;Robot Framework es un framework de automatización genérico y open source para pruebas y automatización de procesos. Su característica principal es la sintaxis basada en palabras clave: las pruebas se escriben en tablas simples y el comportamiento complejo se delega a librerías implementadas en Python o Java.&lt;/p&gt;

&lt;p&gt;Para pruebas de API aporta dos ventajas prácticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Las pruebas son legibles para perfiles no necesariamente centrados en código.&lt;/li&gt;
&lt;li&gt;Es extensible: RequestsLibrary envuelve &lt;code&gt;requests&lt;/code&gt; de Python y expone operaciones HTTP como palabras clave.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si la estructura basada en palabras clave es nueva para ti, esta guía sobre &lt;a href="http://apidog.com/blog/automation-testing-framework?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;frameworks de pruebas de automatización&lt;/a&gt; explica dónde encaja Robot Framework frente a otros enfoques.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación de Robot Framework y librerías necesarias
&lt;/h2&gt;

&lt;p&gt;Crea un entorno virtual e instala los paquetes básicos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate

pip &lt;span class="nb"&gt;install &lt;/span&gt;robotframework
pip &lt;span class="nb"&gt;install &lt;/span&gt;robotframework-requests
pip &lt;span class="nb"&gt;install &lt;/span&gt;robotframework-jsonlibrary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estos paquetes cubren la mayoría de escenarios de testing de API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;robotframework&lt;/code&gt;: motor principal y runner de pruebas.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robotframework-requests&lt;/code&gt;: RequestsLibrary para enviar solicitudes HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robotframework-jsonlibrary&lt;/code&gt;: utilidades para extraer y verificar valores JSON.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verifica la instalación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;robot &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La &lt;a href="https://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html" rel="noopener noreferrer"&gt;guía oficial de Robot Framework&lt;/a&gt; es la referencia principal para sintaxis y configuración avanzada.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Importante: Robot Framework es sensible a los espacios. Las palabras clave y sus argumentos deben separarse con al menos dos espacios. Un solo espacio se interpreta como parte del mismo token.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Estructura básica de un archivo &lt;code&gt;.robot&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Un archivo de prueba usa la extensión &lt;code&gt;.robot&lt;/code&gt; y normalmente se divide en estas secciones:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Variables ***
${BASE_URL}       https://api.example.com/v1

*** Test Cases ***
Get User Returns 200
    Create Session    api    ${BASE_URL}
    ${response}=      GET On Session    api    /users/42
    Status Should Be  200    ${response}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Qué hace cada parte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;*** Settings ***&lt;/code&gt;: importa librerías.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*** Variables ***&lt;/code&gt;: define valores reutilizables.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*** Test Cases ***&lt;/code&gt;: contiene los casos de prueba.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Create Session&lt;/code&gt;: crea una sesión HTTP con nombre.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET On Session&lt;/code&gt;: ejecuta una solicitud &lt;code&gt;GET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Status Should Be&lt;/code&gt;: valida el código de estado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejecuta la suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;robot tests.robot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Robot Framework generará automáticamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;output.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;report.html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Primera prueba de API con validación de JSON
&lt;/h2&gt;

&lt;p&gt;Este ejemplo valida que un endpoint de usuario responda &lt;code&gt;200&lt;/code&gt; y devuelva los datos esperados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Variables ***
${BASE_URL}       https://api.example.com/v1

*** Test Cases ***
Get User Returns Expected Data
    Create Session    api    ${BASE_URL}
    ${response}=      GET On Session    api    /users/42

    Status Should Be  200    ${response}

    ${body}=          Set Variable    ${response.json()}
    Should Be Equal As Integers    ${body}[id]    42
    Should Be Equal                ${body}[status]    active
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puntos clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;${response.json()}&lt;/code&gt; convierte el cuerpo en un objeto accesible desde Robot Framework.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Should Be Equal As Integers&lt;/code&gt; evita problemas de comparación entre strings y números.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Should Be Equal&lt;/code&gt; valida valores exactos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Trabajando con sesiones HTTP
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Create Session&lt;/code&gt; no solo guarda una URL base. También puede mantener encabezados, cookies y autenticación. Esto es útil cuando una API requiere login antes de ejecutar otros endpoints.&lt;/p&gt;

&lt;p&gt;Ejemplo con autenticación:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Variables ***
${BASE_URL}       https://api.example.com/v1

*** Test Cases ***
Create Order With Authenticated Session
    Create Session    api    ${BASE_URL}

    ${login}=         POST On Session    api    /auth/login
    ...               json={"email": "qa@example.com", "password": "test-pass"}

    ${token}=         Set Variable    ${login.json()}[token]
    ${headers}=       Create Dictionary    Authorization=Bearer ${token}

    ${order}=         POST On Session    api    /orders
    ...               json={"product_id": 7, "quantity": 2}
    ...               headers=${headers}

    Status Should Be  201    ${order}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La sintaxis &lt;code&gt;...&lt;/code&gt; continúa una palabra clave en la siguiente línea. Úsala para mantener legibles solicitudes con payloads, headers o parámetros largos.&lt;/p&gt;

&lt;p&gt;Las palabras clave disponibles están documentadas en la &lt;a href="https://marketsquare.github.io/robotframework-requests/doc/RequestsLibrary.html" rel="noopener noreferrer"&gt;referencia de RequestsLibrary&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aserciones sobre cuerpos de respuesta
&lt;/h2&gt;

&lt;p&gt;Validar solo el status code no suele ser suficiente. También conviene comprobar estructura, campos obligatorios y valores esperados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Library           RequestsLibrary
Library           JSONLibrary
Library           Collections

*** Variables ***
${BASE_URL}       https://api.example.com/v1

*** Test Cases ***
Order Response Has Correct Shape
    Create Session    api    ${BASE_URL}

    ${response}=      POST On Session    api    /orders
    ...               json={"product_id": 7, "quantity": 2}

    Status Should Be  201    ${response}

    ${body}=          Set Variable    ${response.json()}

    Dictionary Should Contain Key    ${body}    total
    Should Be Equal As Integers      ${body}[quantity]    2

    ${status}=        Get Value From Json    ${body}    $.status
    Should Be Equal   ${status}[0]    pending
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estas palabras clave cubren validaciones comunes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Dictionary Should Contain Key&lt;/code&gt;: confirma que un campo existe.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Should Be Equal As Integers&lt;/code&gt;: compara valores numéricos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Get Value From Json&lt;/code&gt;: extrae valores usando JSONPath.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para ampliar el set de verificaciones, esta guía sobre &lt;a href="http://apidog.com/blog/api-assertions?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;aserciones de API&lt;/a&gt; complementa bien este flujo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crear palabras clave reutilizables
&lt;/h2&gt;

&lt;p&gt;Si repites login, headers o creación de sesión en cada prueba, mueve esos pasos a palabras clave propias.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Variables ***
${BASE_URL}       https://api.example.com/v1

*** Keywords ***
Authenticate And Open Session
    Create Session    api    ${BASE_URL}

    ${login}=         POST On Session    api    /auth/login
    ...               json={"email": "qa@example.com", "password": "test-pass"}

    ${token}=         Set Variable    ${login.json()}[token]
    Set Suite Variable    ${AUTH_HEADERS}    Bearer ${token}

*** Test Cases ***
Create Order
    Authenticate And Open Session

    ${headers}=       Create Dictionary    Authorization=${AUTH_HEADERS}

    ${order}=         POST On Session    api    /orders
    ...               json={"product_id": 7, "quantity": 2}
    ...               headers=${headers}

    Status Should Be  201    ${order}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ventaja práctica: si cambia el endpoint de login, solo modificas una palabra clave.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usar archivos de recursos
&lt;/h2&gt;

&lt;p&gt;Para suites grandes, separa las palabras clave compartidas en archivos de recursos.&lt;/p&gt;

&lt;p&gt;Ejemplo de &lt;code&gt;common.robot&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Library           RequestsLibrary
Library           Collections

*** Variables ***
${BASE_URL}       https://api.example.com/v1

*** Keywords ***
Authenticate And Open Session
    Create Session    api    ${BASE_URL}

    ${login}=         POST On Session    api    /auth/login
    ...               json={"email": "qa@example.com", "password": "test-pass"}

    ${token}=         Set Variable    ${login.json()}[token]
    Set Suite Variable    ${AUTH_HEADERS}    Bearer ${token}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego impórtalo desde tu archivo de pruebas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Settings ***
Resource          common.robot

*** Test Cases ***
Create Order
    Authenticate And Open Session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una estructura típica puede ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tests/
  users.robot
  orders.robot
resources/
  common.robot
  auth.robot
  users_keywords.robot
  orders_keywords.robot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta separación mantiene los casos de prueba enfocados en intención y deja la lógica repetible en recursos compartidos. Es la misma disciplina modular descrita en la guía sobre &lt;a href="http://apidog.com/blog/how-to-write-automated-test-scripts?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo escribir scripts de pruebas automatizados&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;También puedes revisar la guía de &lt;a href="http://apidog.com/blog/automation-testing-framework?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;frameworks de pruebas de automatización&lt;/a&gt; para entender por qué esta estructura escala mejor que copiar y pegar pasos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejecutar Robot Framework en CI
&lt;/h2&gt;

&lt;p&gt;Robot Framework funciona bien en CI porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se ejecuta sin interfaz gráfica.&lt;/li&gt;
&lt;li&gt;Devuelve código de salida distinto de cero cuando hay fallos.&lt;/li&gt;
&lt;li&gt;Genera reportes HTML automáticamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo básico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;robot &lt;span class="nt"&gt;--outputdir&lt;/span&gt; results tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para inyectar variables de entorno, usa &lt;code&gt;--variable&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;robot &lt;span class="nt"&gt;--outputdir&lt;/span&gt; results &lt;span class="nt"&gt;--variable&lt;/span&gt; BASE_URL:https://staging.example.com/v1 tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También puedes usar tags para ejecutar subconjuntos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*** Test Cases ***
Health Check
    [Tags]    smoke
    Create Session    api    ${BASE_URL}
    ${response}=      GET On Session    api    /health
    Status Should Be  200    ${response}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecutar solo smoke tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;robot &lt;span class="nt"&gt;--include&lt;/span&gt; smoke &lt;span class="nt"&gt;--outputdir&lt;/span&gt; results tests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Patrón típico para CI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalar Python.&lt;/li&gt;
&lt;li&gt;Instalar dependencias con &lt;code&gt;pip&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ejecutar &lt;code&gt;robot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Publicar &lt;code&gt;results/log.html&lt;/code&gt; y &lt;code&gt;results/report.html&lt;/code&gt; como artefactos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este flujo sigue el mismo enfoque descrito en la guía de &lt;a href="http://apidog.com/blog/automate-api-tests-ci-cd?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de API en CI/CD&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cuándo una plataforma de API dedicada ayuda más
&lt;/h2&gt;

&lt;p&gt;Robot Framework es una buena opción cuando quieres pruebas legibles, basadas en palabras clave y mantenibles por equipos con distintos perfiles técnicos.&lt;/p&gt;

&lt;p&gt;Puede ser menos cómodo si también necesitas en un solo lugar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diseño de API.&lt;/li&gt;
&lt;li&gt;Mocking.&lt;/li&gt;
&lt;li&gt;Depuración de solicitudes.&lt;/li&gt;
&lt;li&gt;Validación de esquemas OpenAPI.&lt;/li&gt;
&lt;li&gt;Ejecución basada en datos sin ensamblar librerías adicionales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; cubre esas necesidades directamente. Proporciona constructor visual de pruebas, validación automática de esquemas OpenAPI, ejecuciones basadas en datos desde CSV y JSON, gestión de entornos, informes HTML y un ejecutor CLI para CI.&lt;/p&gt;

&lt;p&gt;Un enfoque común es usar ambos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Robot Framework para suites legibles basadas en palabras clave.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; para diseñar, simular, depurar y probar APIs de forma más integrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descargar Apidog&lt;/a&gt; y configurar una suite de pruebas de API sin escribir librerías de palabras clave.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Robot Framework es solo para pruebas de interfaz de usuario?
&lt;/h3&gt;

&lt;p&gt;No. Robot Framework es un framework de automatización genérico. Con RequestsLibrary puede ejecutar pruebas de API, y existen librerías para bases de datos, SSH y otros sistemas. SeleniumLibrary lo hizo popular en pruebas de UI, pero las pruebas de API son un caso de uso habitual.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre &lt;code&gt;Create Session&lt;/code&gt; y una solicitud simple?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Create Session&lt;/code&gt; crea una sesión HTTP persistente con nombre. Esa sesión puede guardar URL base, headers, cookies y autenticación. Luego, palabras clave como &lt;code&gt;GET On Session&lt;/code&gt; o &lt;code&gt;POST On Session&lt;/code&gt; reutilizan ese estado.&lt;/p&gt;

&lt;p&gt;Una solicitud sin sesión no mantiene cookies ni autenticación entre llamadas, por lo que tendrías que reenviar esa información cada vez.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito saber Python para usar Robot Framework?
&lt;/h3&gt;

&lt;p&gt;No para escribir pruebas. La sintaxis basada en tablas está diseñada para que puedas usar palabras clave existentes sin escribir Python.&lt;/p&gt;

&lt;p&gt;Python solo es necesario si quieres crear librerías de palabras clave nuevas. Para muchas suites de API, RequestsLibrary, JSONLibrary y las palabras clave incorporadas son suficientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se compara Robot Framework con pytest para pruebas de API?
&lt;/h3&gt;

&lt;p&gt;Pytest prioriza código Python y encaja bien cuando developers quieren mantener las pruebas junto al código de la aplicación.&lt;/p&gt;

&lt;p&gt;Robot Framework prioriza legibilidad y palabras clave, por lo que suele encajar mejor en equipos mixtos donde QA, analistas y developers revisan la misma suite.&lt;/p&gt;

&lt;p&gt;Ambos pueden ejecutarse en CI y generar reportes. La elección depende más de quién mantendrá las pruebas que de la capacidad técnica base.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puede Robot Framework validar respuestas contra un esquema OpenAPI?
&lt;/h3&gt;

&lt;p&gt;No de forma predeterminada. Puedes validar campos individuales con palabras clave incorporadas y JSONLibrary, y también existen librerías de comunidad para validación de esquemas.&lt;/p&gt;

&lt;p&gt;Si la validación automática contra OpenAPI es una parte central del flujo, una plataforma como Apidog puede reducir el trabajo de integración y mantenimiento.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cómo Escribir Casos de Prueba API: Plantilla y Ejemplo</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:21:53 +0000</pubDate>
      <link>https://dev.to/roobia/como-escribir-casos-de-prueba-api-plantilla-y-ejemplo-4ngn</link>
      <guid>https://dev.to/roobia/como-escribir-casos-de-prueba-api-plantilla-y-ejemplo-4ngn</guid>
      <description>&lt;p&gt;Una API inestable rara vez falla porque “nadie la probó”. Falla porque la prueba validó lo incorrecto: solo un &lt;code&gt;200 OK&lt;/code&gt;, ningún campo del cuerpo, ningún contrato, ningún tiempo de respuesta. Un buen caso de prueba de API te ayuda a detectar un contrato roto antes del release, no después de una incidencia en producción.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;En esta guía verás qué es un caso de prueba de API, qué campos debe incluir y cómo escribir uno desde cero. También construiremos un ejemplo completo para &lt;code&gt;POST /auth/login&lt;/code&gt; y luego lo llevaremos a &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; sin escribir scripts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es realmente un caso de prueba de API
&lt;/h2&gt;

&lt;p&gt;Un caso de prueba de API define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entradas concretas,&lt;/li&gt;
&lt;li&gt;una acción específica,&lt;/li&gt;
&lt;li&gt;resultados esperados,&lt;/li&gt;
&lt;li&gt;criterios de validación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No es lo mismo que un escenario de prueba.&lt;/p&gt;

&lt;p&gt;Un escenario dice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Verificar inicio de sesión de usuario.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un caso de prueba dice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enviar credenciales válidas a &lt;code&gt;POST /auth/login&lt;/code&gt; y confirmar una respuesta &lt;code&gt;200&lt;/code&gt;, un JWT no vacío en el cuerpo y un tiempo de respuesta menor a &lt;code&gt;800 ms&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La diferencia importa porque cada caso debe validar un solo comportamiento. Si una prueba grande falla, todavía tienes que investigar qué parte se rompió. Si un caso enfocado falla, el nombre del caso ya apunta al problema.&lt;/p&gt;

&lt;p&gt;Si necesitas separar mejor estos conceptos, revisa &lt;a href="http://apidog.com/blog/test-suite-vs-test-case?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;escenario de prueba vs caso de prueba&lt;/a&gt; y &lt;a href="http://apidog.com/blog/test-case-vs-test-script?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;caso de prueba vs script de prueba&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Una suite de pruebas de API debería cubrir, como mínimo, estos ángulos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Funcional&lt;/strong&gt;: el endpoint devuelve los datos correctos para una entrada válida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negativo&lt;/strong&gt;: rechaza entradas inválidas con el código y error esperados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rendimiento&lt;/strong&gt;: responde dentro de un tiempo aceptable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seguridad&lt;/strong&gt;: aplica autenticación, autorización y límites de entrada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contrato&lt;/strong&gt;: la respuesta coincide con el esquema documentado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una suite que solo valida el camino feliz pasará hasta que un usuario real envíe una contraseña vacía.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué necesitas una plantilla de caso de prueba
&lt;/h2&gt;

&lt;p&gt;Escribir casos desde cero genera inconsistencias. Un tester valida códigos de estado, otro valida cuerpos de respuesta, otro escribe “debería funcionar”.&lt;/p&gt;

&lt;p&gt;Una plantilla evita eso porque obliga a capturar la misma información cada vez.&lt;/p&gt;

&lt;p&gt;Beneficios prácticos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cobertura auditable&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Si todos los casos tienen los mismos campos, las lagunas son visibles.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onboarding más rápido&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Un nuevo miembro del equipo aprende un formato único, no cinco estilos distintos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reutilización entre versiones&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Un caso estructurado se puede clonar, ajustar y volver a ejecutar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trazabilidad&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cada caso se vincula a un endpoint, requisito o contrato.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automatización más sencilla&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Un caso claro se puede convertir en una prueba automatizada. Un caso ambiguo debe reescribirse antes de que una herramienta pueda ejecutarlo.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Anatomía de un caso de prueba de API sólido
&lt;/h2&gt;

&lt;p&gt;Una plantilla útil debería incluir estos campos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;Propósito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ID del caso de prueba&lt;/td&gt;
&lt;td&gt;Referencia única, por ejemplo &lt;code&gt;AUTH-LOGIN-001&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Título&lt;/td&gt;
&lt;td&gt;Descripción breve del comportamiento bajo prueba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint&lt;/td&gt;
&lt;td&gt;Método y ruta, por ejemplo &lt;code&gt;POST /auth/login&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precondiciones&lt;/td&gt;
&lt;td&gt;Estado requerido antes de ejecutar la prueba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Headers&lt;/td&gt;
&lt;td&gt;Encabezados requeridos para la solicitud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cuerpo de la solicitud / parámetros&lt;/td&gt;
&lt;td&gt;Payload exacto enviado al endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estado esperado&lt;/td&gt;
&lt;td&gt;Código HTTP esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Respuesta esperada&lt;/td&gt;
&lt;td&gt;Campos, esquema o valores que deben validarse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiempo de respuesta esperado&lt;/td&gt;
&lt;td&gt;Presupuesto máximo de latencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prioridad&lt;/td&gt;
&lt;td&gt;Crítica, alta, media o baja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tipo de prueba&lt;/td&gt;
&lt;td&gt;Funcional, negativa, seguridad, rendimiento o contrato&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Los campos que más se omiten suelen ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;respuesta esperada,&lt;/li&gt;
&lt;li&gt;tiempo de respuesta esperado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Omitirlos permite que una prueba “pase” aunque devuelva un &lt;code&gt;200&lt;/code&gt; con un cuerpo vacío, o una respuesta correcta pero tres segundos tarde.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo escribir casos de prueba de API paso a paso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Lee la documentación de la API
&lt;/h3&gt;

&lt;p&gt;Antes de escribir pruebas, identifica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;método HTTP,&lt;/li&gt;
&lt;li&gt;ruta,&lt;/li&gt;
&lt;li&gt;headers requeridos,&lt;/li&gt;
&lt;li&gt;autenticación,&lt;/li&gt;
&lt;li&gt;parámetros obligatorios,&lt;/li&gt;
&lt;li&gt;códigos de estado documentados,&lt;/li&gt;
&lt;li&gt;esquema de respuesta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada caso de prueba debe validar un comportamiento esperado del contrato.&lt;/p&gt;

&lt;p&gt;Si trabajas con OpenAPI, puedes usar herramientas que generen una base inicial desde la especificación. Por ejemplo, una &lt;a href="http://apidog.com/blog/api-test-collections-generation-openapi-specs?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;especificación OpenAPI para generar colecciones de prueba&lt;/a&gt; puede acelerar el primer borrador.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Lista las condiciones que debes probar
&lt;/h3&gt;

&lt;p&gt;Para un endpoint típico, crea casos para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entrada válida,&lt;/li&gt;
&lt;li&gt;cada campo requerido faltante,&lt;/li&gt;
&lt;li&gt;cada campo malformado,&lt;/li&gt;
&lt;li&gt;solicitud sin autenticación,&lt;/li&gt;
&lt;li&gt;token caducado,&lt;/li&gt;
&lt;li&gt;payload demasiado grande,&lt;/li&gt;
&lt;li&gt;entradas potencialmente peligrosas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada condición debe convertirse en un caso separado.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prepara datos de prueba específicos
&lt;/h3&gt;

&lt;p&gt;No reutilices el mismo payload inválido en todos los casos negativos.&lt;/p&gt;

&lt;p&gt;Ejemplo incorrecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese payload mezcla dos errores. Si la API responde &lt;code&gt;400&lt;/code&gt;, no sabes si falló por &lt;code&gt;email&lt;/code&gt;, por &lt;code&gt;password&lt;/code&gt; o por ambos.&lt;/p&gt;

&lt;p&gt;Mejor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este caso prueba únicamente la ausencia de &lt;code&gt;password&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Escribe resultados esperados verificables
&lt;/h3&gt;

&lt;p&gt;Evita afirmaciones vagas como:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Devuelve éxito.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Escribe algo ejecutable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Estado esperado: 200
Respuesta esperada:
- token existe
- token es string
- token no está vacío
- token_type es "Bearer"
- expires_in es 3600
Tiempo máximo: 800 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La precisión es lo que convierte una intención en una prueba real.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Agrega el caso a una suite ejecutable
&lt;/h3&gt;

&lt;p&gt;Un caso en una hoja de cálculo documenta intención. Un caso en una herramienta de pruebas produce un resultado: aprobado o fallido.&lt;/p&gt;

&lt;p&gt;Agrupa los casos por endpoint o flujo. Las &lt;a href="http://apidog.com/blog/test-suites-api-test-automation?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;suites de prueba&lt;/a&gt; sirven precisamente para ejecutar conjuntos completos con un solo disparador.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Mantén los casos sincronizados con la API
&lt;/h3&gt;

&lt;p&gt;Cuando cambia el contrato, deben cambiar los casos.&lt;/p&gt;

&lt;p&gt;Un caso obsoleto es peor que ningún caso porque falla por la razón equivocada y acostumbra al equipo a ignorar builds en rojo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplo práctico: probando un endpoint de inicio de sesión
&lt;/h2&gt;

&lt;p&gt;Supongamos este endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /auth/login
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recibe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Correct-Horse-9"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y devuelve un JWT si las credenciales son válidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  AUTH-LOGIN-001: credenciales válidas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; funcional&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prioridad:&lt;/strong&gt; crítica&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /auth/login
Content-Type: application/json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Correct-Horse-9"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validaciones esperadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: 200
Body:
- token existe
- token es string
- token no está vacío
- token_type == "Bearer"
- expires_in == 3600
Tiempo de respuesta &amp;lt; 800 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AUTH-LOGIN-002: contraseña incorrecta
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; negativa&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prioridad:&lt;/strong&gt; crítica&lt;/p&gt;

&lt;p&gt;Payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wrong"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validaciones esperadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: 401
Body:
- error == "invalid_credentials"
- token no existe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota de seguridad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;El mensaje no debe revelar si el email existe.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AUTH-LOGIN-003: campo &lt;code&gt;password&lt;/code&gt; faltante
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; negativa&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prioridad:&lt;/strong&gt; alta&lt;/p&gt;

&lt;p&gt;Payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validaciones esperadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: 400
Body:
- error == "validation_error"
- details menciona el campo "password"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AUTH-LOGIN-004: email malformado
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; negativa&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Prioridad:&lt;/strong&gt; media&lt;/p&gt;

&lt;p&gt;Payload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not-an-email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Correct-Horse-9"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validaciones esperadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: 400
Body:
- error == "validation_error"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con estos cuatro casos ya validas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;camino feliz,&lt;/li&gt;
&lt;li&gt;errores de autenticación,&lt;/li&gt;
&lt;li&gt;validación de campos requeridos,&lt;/li&gt;
&lt;li&gt;validación de formato,&lt;/li&gt;
&lt;li&gt;forma del error,&lt;/li&gt;
&lt;li&gt;códigos de estado,&lt;/li&gt;
&lt;li&gt;latencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También podrías agregar un caso de seguridad con una cadena de inyección SQL en &lt;code&gt;email&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"' OR '1'='1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Correct-Horse-9"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validación esperada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Status: 400 o 401, según el contrato
Body:
- no expone detalles internos
- no devuelve token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Escribiendo el mismo caso de prueba en Apidog
&lt;/h2&gt;

&lt;p&gt;Puedes implementar los casos anteriores en &lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; sin escribir una línea de script.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Importa o define el endpoint
&lt;/h3&gt;

&lt;p&gt;Carga &lt;code&gt;POST /auth/login&lt;/code&gt; desde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un archivo OpenAPI,&lt;/li&gt;
&lt;li&gt;una colección de Postman,&lt;/li&gt;
&lt;li&gt;una definición manual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El esquema de solicitud y respuesta sirve como base para las validaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Agrega los datos de la solicitud
&lt;/h3&gt;

&lt;p&gt;Para &lt;code&gt;AUTH-LOGIN-001&lt;/code&gt;, configura el body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Correct-Horse-9"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para casos repetitivos, puedes usar datos externos en CSV o JSON. Así, las &lt;a href="http://apidog.com/blog/data-driven-api-testing-tool-csv-json?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;pruebas de API basadas en datos&lt;/a&gt; permiten ejecutar el mismo caso contra varias filas de credenciales.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Configura las afirmaciones visualmente
&lt;/h3&gt;

&lt;p&gt;Agrega validaciones como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status == 200
body.token existe
body.token no está vacío
body.token_type == "Bearer"
body.expires_in == 3600
response_time &amp;lt; 800 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No necesitas scripting para este flujo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Agrupa los casos en un escenario
&lt;/h3&gt;

&lt;p&gt;Incluye:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AUTH-LOGIN-001&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AUTH-LOGIN-002&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AUTH-LOGIN-003&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AUTH-LOGIN-004&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así puedes ejecutar toda la cobertura del endpoint de login en una sola corrida.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Ejecuta y revisa el reporte
&lt;/h3&gt;

&lt;p&gt;Apidog muestra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;casos aprobados,&lt;/li&gt;
&lt;li&gt;casos fallidos,&lt;/li&gt;
&lt;li&gt;afirmación exacta que falló,&lt;/li&gt;
&lt;li&gt;respuesta real recibida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes ejecutar el escenario:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;localmente,&lt;/li&gt;
&lt;li&gt;de forma programada,&lt;/li&gt;
&lt;li&gt;dentro de CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El objetivo no es evitar siempre el código. El objetivo es que los casos simples y repetitivos sean más rápidos de crear, revisar y mantener. Cuando necesitas lógica personalizada, Apidog también permite usar scripts.&lt;/p&gt;

&lt;p&gt;Si quieres un flujo más amplio sin depender de Postman, revisa &lt;a href="http://apidog.com/blog/api-testing-without-postman-2026?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;las pruebas de API sin Postman&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errores comunes a evitar
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Afirmar solo el código de estado
&lt;/h3&gt;

&lt;p&gt;Un &lt;code&gt;200&lt;/code&gt; solo indica que la solicitud fue procesada. No garantiza que la respuesta sea correcta.&lt;/p&gt;

&lt;p&gt;Valida siempre el cuerpo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status == 200
body.data.id existe
body.data.email == "dana@example.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crear un caso gigante por endpoint
&lt;/h3&gt;

&lt;p&gt;Si un único caso valida login correcto, contraseña incorrecta, email inválido y token caducado, cuando falle no sabrás qué se rompió.&lt;/p&gt;

&lt;p&gt;Divide por condición.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reutilizar los mismos datos negativos
&lt;/h3&gt;

&lt;p&gt;Cada caso negativo debe fallar por una razón específica.&lt;/p&gt;

&lt;p&gt;Mal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mejor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dana@example.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  No validar latencia
&lt;/h3&gt;

&lt;p&gt;Sin una afirmación de tiempo, una regresión de rendimiento puede pasar inadvertida.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;response_time &amp;lt; 800 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Documentar casos que nunca se ejecutan
&lt;/h3&gt;

&lt;p&gt;Un caso que nadie ejecuta es documentación, no una prueba.&lt;/p&gt;

&lt;p&gt;Muévelo a una suite automática y ejecútalo en cada build. Una forma rápida de empezar es &lt;a href="http://apidog.com/blog/generate-swagger-openapi-test-scripts?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;generar scripts de prueba a partir de una especificación OpenAPI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; si quieres seguir el ejemplo y construir los cuatro casos de inicio de sesión por tu cuenta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuántos casos de prueba necesita un endpoint?
&lt;/h3&gt;

&lt;p&gt;Los suficientes para cubrir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;camino feliz,&lt;/li&gt;
&lt;li&gt;campos requeridos faltantes,&lt;/li&gt;
&lt;li&gt;entradas malformadas,&lt;/li&gt;
&lt;li&gt;falla de autenticación,&lt;/li&gt;
&lt;li&gt;al menos una prueba de seguridad,&lt;/li&gt;
&lt;li&gt;contrato de respuesta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para un endpoint simple suelen ser entre cuatro y seis casos. Para endpoints complejos, más.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Debo escribir casos antes de construir la API?
&lt;/h3&gt;

&lt;p&gt;Sí. Escribir casos contra el diseño ayuda a detectar deficiencias del contrato antes de implementar.&lt;/p&gt;

&lt;p&gt;Puedes combinar un enfoque design-first con &lt;a href="http://apidog.com/blog/ai-powered-test-case?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;generación de casos de prueba asistida por IA&lt;/a&gt; para obtener un primer borrador y luego refinarlo manualmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hoja de cálculo o herramienta de prueba?
&lt;/h3&gt;

&lt;p&gt;Una hoja de cálculo sirve para documentar, pero no ejecuta.&lt;/p&gt;

&lt;p&gt;Mantén los casos en una herramienta que pueda:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ejecutar pruebas,&lt;/li&gt;
&lt;li&gt;reportar resultados,&lt;/li&gt;
&lt;li&gt;mostrar fallos,&lt;/li&gt;
&lt;li&gt;integrarse con CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un caso debe estar en verde o en rojo, no solo escrito.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es la diferencia entre un caso de prueba y un escenario de prueba?
&lt;/h3&gt;

&lt;p&gt;Un escenario es el objetivo de alto nivel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Verificar inicio de sesión.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un caso es una validación concreta y ejecutable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enviar credenciales válidas a POST /auth/login y confirmar status 200, token JWT y latencia menor a 800 ms.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consulta &lt;a href="http://apidog.com/blog/test-suite-vs-test-case?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;escenario de prueba vs caso de prueba&lt;/a&gt; para ver la diferencia con más detalle.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Mejores Depuradores Agent2Agent (A2A) en 2026</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:21:06 +0000</pubDate>
      <link>https://dev.to/roobia/mejores-depuradores-agent2agent-a2a-en-2026-3kpc</link>
      <guid>https://dev.to/roobia/mejores-depuradores-agent2agent-a2a-en-2026-3kpc</guid>
      <description>&lt;p&gt;Agent2Agent (A2A) ya está pasando de la especificación a implementaciones reales. En cuanto ejecutas un segundo agente, necesitas inspeccionar qué se envían entre sí: Tarjetas de Agente, mensajes JSON-RPC, archivos, metadatos, respuestas y errores. Esta guía compara las herramientas disponibles hoy y te ayuda a elegir cuál usar según tu flujo de trabajo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Si A2A es nuevo para ti, empieza por &lt;a href="http://apidog.com/blog/what-is-agent2agent-a2a?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es Agent2Agent (A2A)&lt;/a&gt; y &lt;a href="http://apidog.com/blog/what-is-agent2agent-a2a-debugger?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es un depurador A2A&lt;/a&gt;. Ahí se explican la Tarjeta de Agente, el ciclo de vida de las tareas y por qué el tráfico agente-a-agente requiere herramientas específicas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo evaluar un depurador A2A
&lt;/h2&gt;

&lt;p&gt;Antes de elegir una herramienta, valida que cubra este flujo mínimo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Descubrir el agente&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leer la URL de la Tarjeta de Agente.&lt;/li&gt;
&lt;li&gt;Validar que la tarjeta sea compatible.&lt;/li&gt;
&lt;li&gt;Mostrar nombre, descripción, capacidades, habilidades y versión del protocolo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enviar mensajes de prueba&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enviar texto sin construir JSON-RPC manualmente.&lt;/li&gt;
&lt;li&gt;Adjuntar archivos cuando el agente los soporte.&lt;/li&gt;
&lt;li&gt;Añadir metadatos como pares clave-valor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inspeccionar respuestas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ver una respuesta legible.&lt;/li&gt;
&lt;li&gt;Revisar el contenido devuelto al usuario.&lt;/li&gt;
&lt;li&gt;Acceder al JSON-RPC sin procesar para depuración profunda.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configurar autenticación&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usar Bearer token, Basic Auth, API key o encabezados personalizados.&lt;/li&gt;
&lt;li&gt;Probar agentes detrás de gateways, proxies o routing multi-tenant.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;También conviene comprobar si soporta streaming, historial de sesiones y ejecución local para evitar enrutar tráfico sensible por terceros.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Depurador A2A de Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; incluye un Depurador A2A dentro de su cliente estándar. Es la opción más completa para equipos que necesitan depurar agentes A2A de forma visual.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyscqokb7qxtqvyjj9ul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjyscqokb7qxtqvyjj9ul.png" alt="Depurador A2A de Apidog" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flujo básico de uso
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Abre el Depurador A2A en Apidog.&lt;/li&gt;
&lt;li&gt;Pega la URL de la Tarjeta de Agente.&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;strong&gt;Conectar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revisa la información detectada:

&lt;ul&gt;
&lt;li&gt;nombre del agente;&lt;/li&gt;
&lt;li&gt;descripción;&lt;/li&gt;
&lt;li&gt;capacidades;&lt;/li&gt;
&lt;li&gt;habilidades declaradas;&lt;/li&gt;
&lt;li&gt;versión del protocolo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Abre la pestaña &lt;strong&gt;Mensajes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Envía un mensaje de texto plano.&lt;/li&gt;
&lt;li&gt;Si el agente lo permite, adjunta archivos.&lt;/li&gt;
&lt;li&gt;Añade metadatos personalizados si tu flujo los requiere.&lt;/li&gt;
&lt;li&gt;Revisa la respuesta en las vistas disponibles.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apidog muestra las respuestas en tres niveles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vista previa:&lt;/strong&gt; árbol legible para inspección rápida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contenido:&lt;/strong&gt; cuerpo legible por humanos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datos sin procesar:&lt;/strong&gt; payload JSON-RPC completo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La autenticación se configura desde la interfaz: sin auth, Bearer token, Basic Auth o API key mediante encabezado personalizado. También puedes añadir headers propios para gateways, tenants o reglas de routing.&lt;/p&gt;

&lt;p&gt;Cuando el agente soporta server-sent events, Apidog permite probar streaming. Además, guarda el historial de la sesión y se ejecuta como cliente local, por lo que el tráfico va directamente entre tu máquina y el agente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cuándo usarlo
&lt;/h3&gt;

&lt;p&gt;Usa Apidog cuando necesitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;depurar interactivamente un agente A2A;&lt;/li&gt;
&lt;li&gt;validar rápidamente una Tarjeta de Agente;&lt;/li&gt;
&lt;li&gt;probar mensajes con archivos y metadatos;&lt;/li&gt;
&lt;li&gt;inspeccionar respuestas legibles y JSON sin procesar;&lt;/li&gt;
&lt;li&gt;trabajar en el mismo entorno con REST, GraphQL, MCP y A2A.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fortalezas:&lt;/strong&gt; amplia cobertura funcional, sin scripting, tres vistas de respuesta, autenticación en UI y soporte para otros protocolos usados en sistemas de agentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desventaja:&lt;/strong&gt; forma parte del cliente completo de Apidog. Si solo quieres una CLI mínima, puede ser más de lo necesario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; equipos que desarrollan o consumen agentes A2A y quieren un flujo visual sin escribir scripts.&lt;/p&gt;

&lt;p&gt;Para empezar, sigue la &lt;a href="http://apidog.com/blog/apidog-a2a-debugger-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía del depurador A2A de Apidog&lt;/a&gt; y &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;descarga Apidog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Inspector A2A
&lt;/h2&gt;

&lt;p&gt;El proyecto A2A mantiene un Inspector A2A de código abierto. Es una herramienta web para conectarte a un agente, ver su Tarjeta de Agente y probar mensajes. Está publicada junto con la especificación en &lt;a href="https://github.com/a2aproject" rel="noopener noreferrer"&gt;la organización A2A de GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffijtl5hz0bp7lmt66qzq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffijtl5hz0bp7lmt66qzq.png" alt="Inspector A2A" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al venir del mismo proyecto que mantiene el protocolo, es útil como referencia de conformidad. Puedes usarlo para comprobar si una Tarjeta de Agente y un intercambio A2A siguen lo esperado por la especificación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flujo recomendado
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ejecuta el Inspector localmente.&lt;/li&gt;
&lt;li&gt;Conéctalo a tu agente A2A.&lt;/li&gt;
&lt;li&gt;Carga la Tarjeta de Agente.&lt;/li&gt;
&lt;li&gt;Verifica que la estructura sea válida.&lt;/li&gt;
&lt;li&gt;Envía un mensaje básico.&lt;/li&gt;
&lt;li&gt;Compara la respuesta con lo esperado por la especificación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Fortalezas:&lt;/strong&gt; alineado con la especificación, código abierto, gratuito y útil como referencia técnica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desventaja:&lt;/strong&gt; normalmente debes ejecutarlo tú mismo. La experiencia de usuario, la autenticación y el manejo de archivos son más limitados que en una herramienta dedicada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; desarrolladores que quieren una implementación de referencia y no tienen problema en ejecutarla localmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Herramientas CLI y SDK de A2A
&lt;/h2&gt;

&lt;p&gt;Los SDK oficiales de A2A, incluidos Python y JavaScript/TypeScript, ofrecen clientes de ejemplo y utilidades de línea de comandos. Puedes usarlos para obtener una Tarjeta de Agente, enviar mensajes e imprimir respuestas desde la terminal.&lt;/p&gt;

&lt;p&gt;Este enfoque es útil cuando necesitas automatización.&lt;/p&gt;

&lt;h3&gt;
  
  
  Casos de uso prácticos
&lt;/h3&gt;

&lt;p&gt;Usa la CLI o el SDK para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pruebas de humo en CI;&lt;/li&gt;
&lt;li&gt;validaciones de conformidad;&lt;/li&gt;
&lt;li&gt;comprobaciones periódicas de agentes desplegados;&lt;/li&gt;
&lt;li&gt;scripts de regresión;&lt;/li&gt;
&lt;li&gt;pruebas rápidas sin interfaz gráfica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un flujo típico sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pseudoflujo orientativo&lt;/span&gt;
a2a get-card https://tu-agente.example.com/.well-known/agent-card.json

a2a send-message &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent&lt;/span&gt; https://tu-agente.example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"Resume este documento"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después puedes integrar la salida en tu pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ejemplo conceptual&lt;/span&gt;
a2a send-message &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agent&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$A2A_AGENT_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"ping"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--expect-status&lt;/span&gt; success
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fortalezas:&lt;/strong&gt; programable, automatizable y fácil de integrar en CI si ya usas el SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desventaja:&lt;/strong&gt; no ofrece vistas visuales, diff, historial interactivo ni renderizado cómodo de respuestas. Para depuración exploratoria, leer JSON sin procesar en terminal se vuelve lento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; CI, automatización y pruebas de conformidad; no para depuración interactiva diaria.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Agentes de ejemplo y UI de demostración de A2A
&lt;/h2&gt;

&lt;p&gt;El proyecto A2A publica agentes de ejemplo y una interfaz de demostración multiagente en su repositorio de muestras, accesible desde &lt;a href="https://a2a-protocol.org/" rel="noopener noreferrer"&gt;el sitio del protocolo A2A&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;La UI de demostración permite observar cómo varios agentes coordinan tareas y qué mensajes intercambian.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cómo aprovecharla
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Ejecuta la demo oficial.&lt;/li&gt;
&lt;li&gt;Observa un flujo multiagente completo.&lt;/li&gt;
&lt;li&gt;Identifica cómo se ve una Tarjeta de Agente válida.&lt;/li&gt;
&lt;li&gt;Revisa cómo se encadenan los mensajes.&lt;/li&gt;
&lt;li&gt;Usa ese comportamiento como referencia al depurar tu propio agente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esta herramienta está pensada para enseñar el protocolo, no para depurar agentes arbitrarios en producción.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fortalezas:&lt;/strong&gt; buena para aprender, muestra flujos multiagente reales, gratuita y de código abierto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desventaja:&lt;/strong&gt; es una demo. No ofrece el mismo control sobre agentes propios que un depurador como Apidog o el Inspector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; aprender el protocolo y ver un intercambio A2A saludable antes de depurar tu implementación.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Clientes API generales: curl y scripts personalizados
&lt;/h2&gt;

&lt;p&gt;Antes de usar herramientas dedicadas, muchos equipos prueban A2A con &lt;code&gt;curl&lt;/code&gt; o scripts desechables. Técnicamente funciona porque A2A usa JSON-RPC sobre HTTP.&lt;/p&gt;

&lt;p&gt;Un ejemplo conceptual sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://tu-agente.example.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "jsonrpc": "2.0",
    "id": "test-1",
    "method": "message/send",
    "params": {
      "message": {
        "role": "user",
        "parts": [
          {
            "kind": "text",
            "text": "Hola, agente"
          }
        ]
      }
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto sirve para una verificación puntual, pero escala mal. Tienes que construir manualmente el sobre JSON-RPC, gestionar autenticación, revisar payloads anidados y actualizar el script cada vez que cambia la Tarjeta de Agente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fortalezas:&lt;/strong&gt; disponible en cualquier entorno y útil para una prueba rápida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desventaja:&lt;/strong&gt; sin validación de Tarjeta de Agente, sin renderizado de respuestas, sin historial, sin UI de autenticación y sin soporte cómodo de streaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ideal para:&lt;/strong&gt; una comprobación puntual, no para depuración continua.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparación rápida
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Vistas de respuesta visuales&lt;/th&gt;
&lt;th&gt;Autenticación en UI&lt;/th&gt;
&lt;th&gt;Streaming&lt;/th&gt;
&lt;th&gt;Ideal para&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depurador A2A de Apidog&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cliente visual&lt;/td&gt;
&lt;td&gt;Tres vistas&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Depuración A2A diaria&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inspector A2A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Herramienta web autoejecutable&lt;/td&gt;
&lt;td&gt;Básico&lt;/td&gt;
&lt;td&gt;Limitado&lt;/td&gt;
&lt;td&gt;Parcial&lt;/td&gt;
&lt;td&gt;Referencia de especificación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CLI / SDK de A2A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Línea de comandos&lt;/td&gt;
&lt;td&gt;Ninguna, JSON sin procesar&lt;/td&gt;
&lt;td&gt;Vía parámetros&lt;/td&gt;
&lt;td&gt;Limitado&lt;/td&gt;
&lt;td&gt;CI y automatización&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI de demostración de A2A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aplicación de ejemplo&lt;/td&gt;
&lt;td&gt;Integrado&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Aprender el protocolo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;curl / scripts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP sin procesar&lt;/td&gt;
&lt;td&gt;Ninguna&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Verificaciones puntuales&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ¿Cuál deberías usar?
&lt;/h2&gt;

&lt;p&gt;Para depuración interactiva diaria, el &lt;strong&gt;Depurador A2A de Apidog&lt;/strong&gt; es la opción práctica. Valida Tarjetas de Agente, envía mensajes con archivos y metadatos, muestra respuestas en tres vistas y configura autenticación sin scripts.&lt;/p&gt;

&lt;p&gt;Si trabajas con sistemas de agentes que combinan protocolos, tener REST, GraphQL, MCP y A2A en una misma herramienta evita saltar entre clientes. La &lt;a href="http://apidog.com/blog/mcp-server-vs-a2a?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía del servidor MCP vs A2A&lt;/a&gt; explica por qué esa combinación importa a medida que crece la arquitectura.&lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;conformidad automatizada&lt;/strong&gt;, combina Apidog con la &lt;strong&gt;CLI del SDK de A2A&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Depura visualmente el error.&lt;/li&gt;
&lt;li&gt;Corrige el comportamiento del agente.&lt;/li&gt;
&lt;li&gt;Convierte el caso en una prueba automatizada.&lt;/li&gt;
&lt;li&gt;Ejecútala en CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La misma disciplina descrita en &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo probar agentes de IA que llaman a tus APIs&lt;/a&gt; aplica aquí: primero confirma la comunicación, después automatiza la regresión.&lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;aprender el protocolo&lt;/strong&gt;, ejecuta la &lt;strong&gt;UI de demostración de A2A&lt;/strong&gt; y observa un flujo multiagente funcional. Después pasa a un depurador real para probar tus propios agentes.&lt;/p&gt;

&lt;p&gt;Cuando tus agentes empiecen a usar credenciales, revisa la &lt;a href="http://apidog.com/blog/secure-ai-agent-api-credentials?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía de credenciales seguras de API para agentes de IA&lt;/a&gt; para definir rotación, alcance y manejo seguro.&lt;/p&gt;

&lt;p&gt;Resumen práctico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;strong&gt;Apidog&lt;/strong&gt; para encontrar errores rápido.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;Inspector A2A&lt;/strong&gt; para contrastar con la especificación.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;CLI / SDK&lt;/strong&gt; para automatizar validaciones.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;demos oficiales&lt;/strong&gt; para aprender.&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;curl&lt;/strong&gt; solo para comprobaciones puntuales.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Cuál es el mejor depurador A2A en este momento?
&lt;/h3&gt;

&lt;p&gt;Para depuración interactiva, el &lt;a href="http://apidog.com/blog/apidog-a2a-debugger-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Depurador A2A de Apidog&lt;/a&gt; es el más completo: valida Tarjetas de Agente, prueba mensajes con archivos y metadatos, ofrece tres vistas de respuesta, configura autenticación y soporta streaming sin escribir scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Existen depuradores A2A gratuitos?
&lt;/h3&gt;

&lt;p&gt;Sí. El Depurador A2A de Apidog se incluye de forma gratuita con el cliente estándar. El Inspector A2A oficial, la CLI del SDK y la UI de demostración también son gratuitos y de código abierto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo depurar agentes A2A con Postman?
&lt;/h3&gt;

&lt;p&gt;Puedes enviar manualmente una solicitud HTTP JSON-RPC, pero Postman no tiene soporte A2A nativo. Eso significa que pierdes validación de Tarjeta de Agente, renderizado especializado de respuestas y soporte de streaming orientado al protocolo. Un depurador A2A dedicado maneja esa capa por ti.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funcionan los depuradores A2A con cualquier framework de agente?
&lt;/h3&gt;

&lt;p&gt;Sí, siempre que el agente publique una Tarjeta de Agente A2A válida. A2A es agnóstico al framework, por lo que puede funcionar con LangGraph, CrewAI, AutoGen y agentes personalizados. Para los conceptos base, consulta &lt;a href="http://apidog.com/blog/what-is-agent2agent-a2a?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es Agent2Agent (A2A)&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Debería usar una CLI o un depurador A2A visual?
&lt;/h3&gt;

&lt;p&gt;Usa ambos. Un depurador visual como Apidog es más rápido para aislar errores. Una CLI es mejor para automatizar verificaciones en CI. El flujo recomendado es depurar visualmente y luego convertir el caso corregido en una prueba programable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo empiezo a depurar un agente A2A?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt;, abre el Depurador A2A, pega la URL de la Tarjeta de Agente, haz clic en &lt;strong&gt;Conectar&lt;/strong&gt; y envía un mensaje de texto plano. La &lt;a href="http://apidog.com/blog/apidog-a2a-debugger-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía del Depurador A2A de Apidog&lt;/a&gt; cubre el flujo completo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>¿Qué es un Depurador Agente2Agente (A2A) y Por Qué lo Necesitas?</title>
      <dc:creator>Roobia</dc:creator>
      <pubDate>Fri, 22 May 2026 07:18:48 +0000</pubDate>
      <link>https://dev.to/roobia/que-es-un-depurador-agente2agente-a2a-y-por-que-lo-necesitas-4g5n</link>
      <guid>https://dev.to/roobia/que-es-un-depurador-agente2agente-a2a-y-por-que-lo-necesitas-4g5n</guid>
      <description>&lt;p&gt;Construiste un agente A2A. Se conecta, funciona y a veces devuelve algo incorrecto. ¿Y ahora qué? Abres la consola y ves un flujo de envolturas JSON-RPC con los campos importantes enterrados varios niveles dentro del payload. No puedes saber si el fallo está en el transporte, en la autenticación, en el formato del mensaje o en la lógica del agente. Esa es la brecha que cubre un depurador Agent2Agent A2A.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apidog.com/?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation" class="crayons-btn crayons-btn--primary"&gt;Prueba Apidog hoy&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Este artículo explica qué es un depurador A2A, por qué depurar tráfico agente-a-agente es difícil sin uno, qué debe hacer una buena herramienta y cómo usarla en un ciclo de depuración práctico. Si primero necesitas contexto del protocolo, empieza con &lt;a href="http://apidog.com/blog/what-is-agent2agent-a2a?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es Agent2Agent A2A&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es un depurador A2A?
&lt;/h2&gt;

&lt;p&gt;Un depurador A2A es una herramienta que te permite conectarte a un agente Agent2Agent, enviar mensajes de prueba e inspeccionar la solicitud y la respuesta completas sin escribir código de cliente.&lt;/p&gt;

&lt;p&gt;Funciona de forma parecida a un cliente REST para APIs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pegas la URL de la Tarjeta de Agente.&lt;/li&gt;
&lt;li&gt;El depurador descubre las capacidades del agente.&lt;/li&gt;
&lt;li&gt;Envías un mensaje de prueba.&lt;/li&gt;
&lt;li&gt;Inspeccionas el payload A2A y la envoltura JSON-RPC.&lt;/li&gt;
&lt;li&gt;Identificas el campo, encabezado, artefacto o metadata que está fallando.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F353s7o6h1t4gl3x0m8o1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F353s7o6h1t4gl3x0m8o1.png" alt="Depurador A2A" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A2A es el protocolo abierto para la comunicación entre agentes de IA. Define la Tarjeta de Agente, el ciclo de vida de la tarea y el formato de mensajes y artefactos que intercambian los agentes. Un depurador A2A es el banco de pruebas para validar todo eso manualmente antes de integrarlo en un flujo de producción.&lt;/p&gt;

&lt;p&gt;La pregunta que debe responder es concreta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dada esta Tarjeta de Agente, ¿qué hace realmente el agente cuando le envío este mensaje?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Por qué depurar A2A es difícil sin uno
&lt;/h2&gt;

&lt;p&gt;El tráfico agente-a-agente suele quedar oculto detrás de SDKs, abstracciones y payloads anidados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los logs de consola omiten datos críticos
&lt;/h3&gt;

&lt;p&gt;Un SDK de agente registra lo que sus autores decidieron registrar. Puede que veas algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pero no necesariamente verás:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;taskId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;partes del mensaje&lt;/li&gt;
&lt;li&gt;artefactos generados&lt;/li&gt;
&lt;li&gt;metadatos por mensaje&lt;/li&gt;
&lt;li&gt;errores JSON-RPC&lt;/li&gt;
&lt;li&gt;referencias a archivos&lt;/li&gt;
&lt;li&gt;estado real de la tarea&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si el campo defectuoso no se imprime en stdout, los logs no bastan.&lt;/p&gt;

&lt;h3&gt;
  
  
  La pestaña de red no entiende A2A
&lt;/h3&gt;

&lt;p&gt;El panel de red del navegador muestra cuerpos HTTP, pero A2A usa estructuras JSON-RPC anidadas. Puedes terminar inspeccionando algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"req-1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"task-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"completed"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"artifacts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Resultado generado por el agente"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El dato importante puede estar varios niveles dentro de &lt;code&gt;result.task.artifacts[].parts[]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los scripts temporales se rompen rápido
&lt;/h3&gt;

&lt;p&gt;La alternativa habitual es escribir un &lt;code&gt;curl&lt;/code&gt;, un script en Python o un cliente desechable.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:3000/a2a &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "jsonrpc": "2.0",
    "id": "test-1",
    "method": "message/send",
    "params": {
      "message": {
        "parts": [
          {
            "kind": "text",
            "text": "Resume este documento"
          }
        ]
      }
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciona un día. Luego cambia la Tarjeta de Agente, cambia la autenticación o se añade metadata obligatoria, y el script queda desactualizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Los errores de transporte y lógica se ven iguales
&lt;/h3&gt;

&lt;p&gt;Cuando un agente devuelve una respuesta incorrecta, la causa puede ser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;una solicitud mal formada&lt;/li&gt;
&lt;li&gt;una conexión rota&lt;/li&gt;
&lt;li&gt;un fallo de autenticación&lt;/li&gt;
&lt;li&gt;un encabezado faltante&lt;/li&gt;
&lt;li&gt;metadata enviada en el lugar equivocado&lt;/li&gt;
&lt;li&gt;razonamiento incorrecto del modelo&lt;/li&gt;
&lt;li&gt;lógica defectuosa del agente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin ver la conexión completa, todo se resume en “el agente está roto”.&lt;/p&gt;

&lt;p&gt;Un depurador A2A reduce esa ambigüedad: ves exactamente qué enviaste, qué recibió el agente y qué respondió.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace un depurador A2A
&lt;/h2&gt;

&lt;p&gt;Un depurador A2A útil debe cubrir cuatro áreas: descubrimiento, pruebas de mensajes, inspección de respuestas y autenticación.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Conexión y descubrimiento
&lt;/h2&gt;

&lt;p&gt;El primer paso es conectarte a la Tarjeta de Agente.&lt;/p&gt;

&lt;p&gt;En desarrollo local, una URL típica puede ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/.well-known/agent.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El depurador debe obtener esa tarjeta, validarla y mostrar información como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nombre del agente&lt;/li&gt;
&lt;li&gt;descripción&lt;/li&gt;
&lt;li&gt;versión del protocolo&lt;/li&gt;
&lt;li&gt;capacidades anunciadas&lt;/li&gt;
&lt;li&gt;habilidades declaradas&lt;/li&gt;
&lt;li&gt;tipos de entrada soportados&lt;/li&gt;
&lt;li&gt;endpoints disponibles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si la tarjeta está mal formada, la herramienta debe fallar de forma explícita y señalar el campo problemático.&lt;/p&gt;

&lt;p&gt;Ejemplo de diagnóstico útil:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Card validation failed:
missing required field: capabilities
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eso es mucho mejor que un error genérico como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connection failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Pruebas de mensajes
&lt;/h2&gt;

&lt;p&gt;Una vez conectado, deberías poder enviar mensajes sin construir manualmente el JSON-RPC.&lt;/p&gt;

&lt;p&gt;El flujo práctico debería ser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escribir un prompt.&lt;/li&gt;
&lt;li&gt;Añadir archivos si el agente los soporta.&lt;/li&gt;
&lt;li&gt;Añadir metadata por mensaje si aplica.&lt;/li&gt;
&lt;li&gt;Configurar autenticación o encabezados.&lt;/li&gt;
&lt;li&gt;Enviar.&lt;/li&gt;
&lt;li&gt;Revisar la respuesta.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ejemplo de mensaje mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resume el contenido del archivo adjunto en tres puntos.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de metadata que podrías enviar junto al mensaje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tenantId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"traceId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"debug-run-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El depurador debe encargarse de envolver esa entrada en la estructura A2A correcta y en JSON-RPC. Tú no deberías tener que escribir el cliente desde cero para cada prueba.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzwu25tz6dxx6s8uwbng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzwu25tz6dxx6s8uwbng.png" alt="Pruebas de mensajes A2A" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Inspección de respuestas
&lt;/h2&gt;

&lt;p&gt;Este es el valor principal.&lt;/p&gt;

&lt;p&gt;Las respuestas A2A pueden incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;texto plano&lt;/li&gt;
&lt;li&gt;artefactos estructurados&lt;/li&gt;
&lt;li&gt;referencias a archivos&lt;/li&gt;
&lt;li&gt;partes múltiples&lt;/li&gt;
&lt;li&gt;errores JSON-RPC&lt;/li&gt;
&lt;li&gt;estados de tarea&lt;/li&gt;
&lt;li&gt;respuestas parciales en streaming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un buen depurador debe mostrar el mismo resultado desde varios ángulos.&lt;/p&gt;

&lt;p&gt;El depurador A2A de Apidog, por ejemplo, ofrece tres vistas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vista previa:&lt;/strong&gt; renderiza campos estructurados como un árbol legible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contenido:&lt;/strong&gt; muestra el cuerpo legible para humanos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datos sin procesar:&lt;/strong&gt; muestra el payload JSON-RPC completo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto permite diagnosticar rápido casos como:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Síntoma&lt;/th&gt;
&lt;th&gt;Diagnóstico probable&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;La Vista previa tiene datos, pero Contenido está vacío&lt;/td&gt;
&lt;td&gt;El agente devolvió un artefacto estructurado que no se puede aplanar como texto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contenido muestra texto, pero faltan metadatos&lt;/td&gt;
&lt;td&gt;El agente generó salida, pero no adjuntó contexto esperado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datos sin procesar muestra error JSON-RPC&lt;/td&gt;
&lt;td&gt;El fallo está antes de la lógica final del agente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La respuesta está bien formada, pero semánticamente incorrecta&lt;/td&gt;
&lt;td&gt;El problema probablemente está en el prompt, herramientas o razonamiento del agente&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sin esas vistas, el diagnóstico puede convertirse en una revisión manual larga de JSON anidado.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Autenticación y encabezados
&lt;/h2&gt;

&lt;p&gt;Los agentes de producción rara vez están abiertos. Suelen estar detrás de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bearer Token&lt;/li&gt;
&lt;li&gt;Autenticación Básica&lt;/li&gt;
&lt;li&gt;clave de API&lt;/li&gt;
&lt;li&gt;encabezados personalizados&lt;/li&gt;
&lt;li&gt;gateways internos&lt;/li&gt;
&lt;li&gt;proxies reversos&lt;/li&gt;
&lt;li&gt;identificadores de tenant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un depurador A2A debe permitir configurar esos valores desde la interfaz.&lt;/p&gt;

&lt;p&gt;Ejemplo de encabezados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer &amp;lt;token&amp;gt;
X-Tenant-ID: acme
X-Request-ID: debug-001
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También debe diferenciar claramente entre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encabezados HTTP:&lt;/strong&gt; llegan a gateways, proxies y middleware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadatos A2A:&lt;/strong&gt; llegan al manejador de tareas del agente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este error es común:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;X-User-Intent: summarize
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el agente espera esa información dentro de metadata A2A y no en un encabezado HTTP, nunca la leerá.&lt;/p&gt;

&lt;h2&gt;
  
  
  El Depurador A2A de Apidog
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apidog.com?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Apidog&lt;/a&gt; incluye un Depurador A2A dentro de su cliente estándar.&lt;/p&gt;

&lt;p&gt;El flujo básico es:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abre el Depurador A2A.&lt;/li&gt;
&lt;li&gt;Pega la URL de la Tarjeta de Agente.&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;strong&gt;Conectar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revisa los metadatos del agente.&lt;/li&gt;
&lt;li&gt;Abre la pestaña &lt;strong&gt;Mensajes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Escribe un prompt.&lt;/li&gt;
&lt;li&gt;Opcionalmente adjunta un archivo o añade metadata.&lt;/li&gt;
&lt;li&gt;Haz clic en &lt;strong&gt;Enviar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Revisa la respuesta en Vista previa, Contenido y Datos sin procesar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para desarrollo local, puedes probar con una URL como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000/.well-known/agent.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apidog maneja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;envoltura JSON-RPC&lt;/li&gt;
&lt;li&gt;análisis de respuestas&lt;/li&gt;
&lt;li&gt;historial de sesión&lt;/li&gt;
&lt;li&gt;archivos adjuntos&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;encabezados personalizados&lt;/li&gt;
&lt;li&gt;streaming con eventos enviados por el servidor cuando el agente lo soporta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El historial de sesión permite repetir pruebas y comparar respuestas sin reconstruir cada mensaje.&lt;/p&gt;

&lt;p&gt;También cubre una diferencia importante: encabezados HTTP frente a metadata A2A. Ver ambos canales lado a lado ayuda a detectar errores como enviar contexto de tarea en un encabezado que el agente nunca lee.&lt;/p&gt;

&lt;p&gt;Para una guía paso a paso completa, consulta la &lt;a href="http://apidog.com/blog/apidog-a2a-debugger-guide?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía del Depurador A2A de Apidog&lt;/a&gt;. Apidog también tiene un &lt;a href="http://apidog.com/blog/how-to-use-apidog-ai-agent-debugger?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;depurador de agentes de IA&lt;/a&gt; para el flujo más amplio de pruebas de agentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué buscar en un depurador A2A
&lt;/h2&gt;

&lt;p&gt;Cuando compares herramientas, usa esta lista.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validación clara de la Tarjeta de Agente
&lt;/h3&gt;

&lt;p&gt;Debe decirte por qué falla una tarjeta, no solo que falló.&lt;/p&gt;

&lt;p&gt;Bueno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;missing required field: skills[0].name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Malo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;invalid agent card
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Múltiples vistas de respuesta
&lt;/h3&gt;

&lt;p&gt;Necesitas al menos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;una vista legible&lt;/li&gt;
&lt;li&gt;una vista estructurada&lt;/li&gt;
&lt;li&gt;el JSON sin procesar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solo ver JSON bruto no es suficiente cuando trabajas con artefactos, partes y tareas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cobertura de autenticación
&lt;/h3&gt;

&lt;p&gt;Debe soportar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bearer Token&lt;/li&gt;
&lt;li&gt;Basic Auth&lt;/li&gt;
&lt;li&gt;API Key&lt;/li&gt;
&lt;li&gt;encabezados personalizados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sin tener que codificar base64 manualmente ni modificar scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Archivos y metadata
&lt;/h3&gt;

&lt;p&gt;El tráfico A2A real no siempre es texto. Un depurador solo de texto deja fuera una parte importante de la superficie de prueba.&lt;/p&gt;

&lt;p&gt;Busca soporte para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;archivos adjuntos&lt;/li&gt;
&lt;li&gt;metadata por mensaje&lt;/li&gt;
&lt;li&gt;tipos de entrada declarados por el agente&lt;/li&gt;
&lt;li&gt;artefactos estructurados en la respuesta&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Soporte de streaming
&lt;/h3&gt;

&lt;p&gt;Si el agente usa eventos enviados por el servidor, el depurador debe mostrar fragmentos a medida que llegan y luego mostrar el payload ensamblado al cerrar la transmisión.&lt;/p&gt;

&lt;h3&gt;
  
  
  Historial de sesión
&lt;/h3&gt;

&lt;p&gt;Durante la depuración enviarás variaciones del mismo mensaje muchas veces. El historial ayuda a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repetir pruebas&lt;/li&gt;
&lt;li&gt;comparar respuestas&lt;/li&gt;
&lt;li&gt;volver a una ejecución anterior&lt;/li&gt;
&lt;li&gt;aislar cuándo cambió el comportamiento&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tráfico local o directo
&lt;/h3&gt;

&lt;p&gt;Para desarrollo y debugging, es importante que la herramienta pueda comunicarse directamente con tu agente, sin redirigir tus payloads por servidores de terceros.&lt;/p&gt;

&lt;p&gt;Un depurador que cubre estos puntos convierte la depuración A2A en una rutina de verificación, no en una suposición. La misma disciplina que se aplica en &lt;a href="http://apidog.com/blog/how-to-test-ai-agents-api?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;cómo probar agentes de IA que llaman a tus APIs&lt;/a&gt; también aplica a la capa A2A. Si además ejecutas servidores MCP, la &lt;a href="http://apidog.com/blog/mcp-server-vs-a2a?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;guía servidor MCP vs A2A&lt;/a&gt; explica por qué a menudo necesitas un depurador para cada protocolo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un ciclo de depuración práctico
&lt;/h2&gt;

&lt;p&gt;Cuando un agente A2A se comporta mal, usa este ciclo.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Verifica la Tarjeta de Agente
&lt;/h3&gt;

&lt;p&gt;Conéctate al agente y confirma que la tarjeta anuncia la habilidad esperada.&lt;/p&gt;

&lt;p&gt;Comprueba:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nombre correcto&lt;/li&gt;
&lt;li&gt;versión correcta&lt;/li&gt;
&lt;li&gt;endpoint correcto&lt;/li&gt;
&lt;li&gt;habilidad esperada&lt;/li&gt;
&lt;li&gt;tipos de entrada soportados&lt;/li&gt;
&lt;li&gt;capacidades necesarias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si la habilidad no aparece en la tarjeta, no empieces por el prompt. Arregla primero el manifiesto.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Envía el mensaje mínimo
&lt;/h3&gt;

&lt;p&gt;Empieza con texto plano.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hola, responde con "ok".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego prueba la habilidad real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resume este texto en una frase: Agent2Agent permite comunicación entre agentes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Añade archivos y metadata solo cuando el caso mínimo funcione.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Lee primero los datos sin procesar
&lt;/h3&gt;

&lt;p&gt;Antes de mirar la vista bonita, revisa el JSON-RPC completo.&lt;/p&gt;

&lt;p&gt;Busca:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;result&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;artifacts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;campos de metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si el campo esperado no existe en el payload bruto, el problema está en el agente o en la solicitud, no en el renderizador.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Separa transporte de lógica
&lt;/h3&gt;

&lt;p&gt;Usa esta regla:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resultado&lt;/th&gt;
&lt;th&gt;Conclusión&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No conecta&lt;/td&gt;
&lt;td&gt;problema de URL, red, TLS, gateway o autenticación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conecta, pero falla JSON-RPC&lt;/td&gt;
&lt;td&gt;problema de formato, método o payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responde bien formado, pero con datos faltantes&lt;/td&gt;
&lt;td&gt;problema de implementación del agente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responde bien formado, pero semánticamente mal&lt;/td&gt;
&lt;td&gt;problema de prompt, herramientas, modelo o lógica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funciona sin metadata, falla con metadata&lt;/td&gt;
&lt;td&gt;problema en el canal de metadata o parsing del agente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funciona sin archivo, falla con archivo&lt;/td&gt;
&lt;td&gt;problema en adjuntos o tipo de entrada&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Repite con una sola variable por prueba
&lt;/h3&gt;

&lt;p&gt;No cambies prompt, metadata, archivos y encabezados al mismo tiempo.&lt;/p&gt;

&lt;p&gt;Orden recomendado:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Texto mínimo.&lt;/li&gt;
&lt;li&gt;Texto real.&lt;/li&gt;
&lt;li&gt;Metadata.&lt;/li&gt;
&lt;li&gt;Archivo.&lt;/li&gt;
&lt;li&gt;Autenticación real.&lt;/li&gt;
&lt;li&gt;Streaming.&lt;/li&gt;
&lt;li&gt;Caso completo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Así puedes identificar qué cambio introduce el fallo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ¿Qué es un depurador A2A en una frase?
&lt;/h2&gt;

&lt;p&gt;Es una herramienta que se conecta a un agente Agent2Agent, le envía mensajes de prueba y muestra la solicitud y respuesta completas para depurar integraciones de agentes sin escribir código de cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿En qué se diferencia un depurador A2A de un cliente API?
&lt;/h2&gt;

&lt;p&gt;Un cliente API prueba endpoints HTTP. Un depurador A2A entiende la capa Agent2Agent: Tarjetas de Agente, ciclo de vida de tareas, partes de mensajes y artefactos. Analiza y renderiza esas estructuras en lugar de mostrar solo un cuerpo HTTP en bruto.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Necesito un depurador A2A si tengo logs?
&lt;/h2&gt;

&lt;p&gt;Sí, si necesitas ver el tráfico real. Los logs muestran lo que el autor del agente decidió registrar. Un depurador muestra la solicitud y respuesta completas, lo que permite distinguir errores de transporte de errores de lógica. Para contexto del protocolo, consulta &lt;a href="http://apidog.com/blog/what-is-agent2agent-a2a?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;qué es Agent2Agent A2A&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Es gratuito el Depurador A2A de Apidog?
&lt;/h2&gt;

&lt;p&gt;Sí. Viene incluido con el cliente estándar de Apidog. &lt;a href="https://apidog.com/download?utm_source=dev.to&amp;amp;utm_medium=wanda&amp;amp;utm_content=n8n-post-automation"&gt;Descarga Apidog&lt;/a&gt; y el Depurador A2A aparecerá en el panel lateral en una versión reciente.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Puede un depurador A2A probar agentes en cualquier framework?
&lt;/h2&gt;

&lt;p&gt;Sí, siempre que el agente exponga una Tarjeta de Agente A2A válida. El protocolo es agnóstico al framework, por lo que puede usarse con agentes implementados en LangGraph, CrewAI, AutoGen o frameworks personalizados.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Maneja un depurador A2A respuestas de streaming?
&lt;/h2&gt;

&lt;p&gt;Uno bueno sí. Cuando el agente soporta eventos enviados por el servidor, el depurador lee los fragmentos a medida que llegan, actualiza sus vistas en tiempo real y muestra el payload ensamblado cuando la transmisión termina.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
