Un skill de Claude Code que escribe tests para lo que de verdad importa: casos límite y rutas de error, no getters ni teatro de cobertura. Qué hace, cuándo debe activarse, cómo funciona por dentro y los detalles que vuelven una suite en verde una falsa sensación de seguridad.

En resumen
- Un revisor de comportamiento empaquetado: lo apuntas a una función, lista los casos que vale la pena probar y escribe un test por cada uno.
- Se activa después de escribir una función y antes de confiar en ella, o cuando tocas código que no tiene cobertura.
- Por dentro lee la unidad, enumera comportamientos (feliz, vacío, límite, error) y verifica la salida observable, no las tripas internas.
- Te saca primero la lista de casos, así detectas un caso límite que falta antes de escribir una sola línea de test.
- Escribe más tests, no mejor criterio. Un test que calca la implementación es peor que no tener ninguno: pasa para siempre y no atrapa nada.
Casi todo el mundo le agrega un skill de tests a Claude Code y enseguida termina con teatro de cobertura: un muro de verde que demuestra que el código hace exactamente lo que ya hace, línea por línea, y que seguiría pasando tan tranquilo mientras el comportamiento se pudre por dentro. El problema no es que el modelo no sepa escribir un test, sino que, por defecto, escribe el test más fácil de poner en verde, que es justo el que calca la implementación. Este texto recorre el skill test-author que uso de verdad: qué hace, el momento exacto en que debe activarse, cómo razona por dentro, una invocación real con la salida que deberías esperar, la configuración que lo mantiene honesto y los detalles que deciden si tu suite en verde significa algo. Al final vas a tener un skill que puedes poner en un repo y una idea clara de dónde vale lo que cuesta y dónde te engaña.
Todo el skill se apoya en una idea al revés: escribe la lista de casos antes de escribir cualquier test. Una función no es una sola cosa que verificar; es una ruta feliz, una entrada vacía, un límite y un conjunto de rutas de error que se supone que maneja. La lista de casos es el artefacto que importa. Los tests son solo esa lista convertida en algo ejecutable.
01 · Qué hace el skill
El skill test-author es un revisor empaquetado que invocas cuando quieres, en vez de pegar las mismas instrucciones de testing una y otra vez. Lo apuntas a una unidad de código, una función, un módulo, un route handler, y hace tres cosas en orden fijo:
- Lee la unidad y los tipos o contratos que la rodean, para entender la forma de las entradas y las salidas.
- Enumera los comportamientos que vale la pena probar y te muestra esa lista antes de escribir nada. Aquí está el punto de control donde detectas el caso límite que se le olvidó, o quitas el trivial que metió de más.
- Escribe un test por comportamiento, con nombre descriptivo, verificando la salida observable y no las llamadas internas.
Lo que a propósito no hace es perseguir un número de cobertura. La cobertura es un síntoma, no una meta. Un skill que optimiza el porcentaje va a probar getters, constantes y las ramas que ya son obviamente correctas, porque son líneas baratas de pintar de verde. El skill test-author se enfoca en los casos donde equivocarse sale caro: la lista vacía, el off-by-one en el borde, la entrada mal formada que debería lanzar error, el timeout que el código dice que maneja.
Nota
La ganancia no es "más tests", sino tests que fallan por razones reales. Cuando uno de estos se rompe, te avisa que cambió un comportamiento, no que renombraste una variable privada. Esa relación señal-ruido es todo el valor del skill.
02 · Cuándo debe activarse
Un skill vale lo que vale su criterio para activarse. El skill test-author debe entrar en tres situaciones y quedarse callado en las demás.
- Justo después de escribir una función y antes de confiar en ella. Este es el momento ideal. El comportamiento está fresco en tu cabeza, el contrato ya está decidido y el skill puede fijarlo mientras todavía es barato cambiarlo.
- Antes de modificar código que no tiene cobertura. Aquí el skill escribe tests de caracterización: captura lo que el código hace hoy, feo o no, para que tu próximo cambio tenga una red de seguridad. No estás afirmando que el comportamiento sea correcto; estás afirmando que no cambie por accidente.
- Cuando se cuela un bug. La disciplina es: primero reproduce el bug como un test que falla, y después arréglalo. Ese test se convierte en un guardián permanente contra la regresión.
Dónde no debe entrar importa igual. Sáltalo en getters triviales, en wrappers delgados que solo reenvían argumentos y en código que estás a punto de borrar. Un skill que prueba todo sin criterio es la receta para terminar con una suite de mil líneas que nadie mantiene ni en la que nadie confía.
Cómo conectar el trigger en el archivo del skill
Un skill de Claude Code es un archivo markdown con frontmatter YAML. La línea description es lo que el modelo lee para decidir si el skill aplica, así que invierte las palabras en el cuándo usarlo, no solo en el qué hace:
---
name: test-author
description: Escribe tests enfocados en comportamiento para una unidad de código.
Úsalo después de escribir una función nueva, antes de modificar código sin
cobertura (tests de caracterización), o para reproducir un bug como test que
falla. NO lo uses para getters triviales ni wrappers.
---
Para la función objetivo:
1. Léela y sus tipos. LISTA los comportamientos a probar (feliz, vacío,
límite, error). Muestra la lista y DETENTE a confirmar.
2. Escribe un test por comportamiento con nombre descriptivo.
3. Verifica la salida observable, no las llamadas internas ni el estado privado.
4. NO pruebes getters triviales, constantes ni wrappers de paso.
5. Si la función no tiene contrato claro, pregunta antes de inventarlo.
Fíjate que la descripción le dice al modelo tanto cuándo activarse como cuándo no. Esa sola línea es la diferencia entre un skill que entra cuando es útil y uno que se ofrece a escribir tests para cada getter que escribas.
03 · Cómo funciona por dentro
Aquí no hay magia: el skill es un prompt estructurado que fuerza un orden de razonamiento específico. Todo el valor está en el orden.
El paso uno es leer, no escribir. El skill carga la función y los tipos que la rodean. Si la función recibe un argumento tipado con una unión, los miembros de la unión son los casos de prueba. Si devuelve un resultado discriminado, cada variante es un comportamiento por cubrir. TypeScript te hace la mitad del trabajo de enumerar casos; al skill solo le toca prestarle atención a los tipos.
El paso dos es la enumeración, mostrada como lista. Este es el paso que sostiene todo. El skill escribe los comportamientos antes de escribir cualquier test, y eso hace dos cosas: te deja detectar un caso límite olvidado ("se te pasó el caso de monto negativo") y evita que el skill rellene la suite con verificaciones triviales. La lista es barata de revisar; cien líneas de código de test generado no lo son.
El paso tres es escribir tests que verifican el borde de la unidad. Al skill se le instruye verificar el comportamiento observable, lo que la función devuelve, lo que lanza, el efecto secundario que causa, no qué helper interno llamó. Un test acoplado a las tripas se rompe en cada refactor y no prueba nada sobre si el código es correcto. Un test acoplado al comportamiento sobrevive a los refactors y se rompe solo cuando el comportamiento de verdad cambia.
Importante
La restricción más difícil de hacer cumplir es "verifica el comportamiento, no la implementación". Sin ella, el skill lee tu función de arriba a abajo y escribe un test que repite cada línea. Esos tests nacen en verde, son inmortales e inútiles. Son teatro de cobertura, y son peores que no tener test porque generan una confianza falsa.
04 · Una invocación concreta y su salida
Digamos que escribiste un parser pequeño. La función recibe un string de precio como "1,299.50" y devuelve un número, o lanza error si le mandas basura:
export function parsePrice(input: string): number {
const cleaned = input.replace(/,/g, "").trim()
if (cleaned === "") throw new Error("empty price")
const n = Number(cleaned)
if (!Number.isFinite(n)) throw new Error("not a number: " + input)
if (n < 0) throw new Error("negative price: " + input)
return n
}
Invocas el skill sobre ella. Antes de escribir un solo test, te devuelve la lista de casos, y esta es la parte que de verdad lees:
- Ruta feliz: "1,299.50" se parsea a 1299.5.
- Comas eliminadas: "1,000,000" se parsea a 1000000.
- Espacios recortados: " 42 " se parsea a 42.
- String vacío lanza "empty price".
- No numérico lanza "not a number".
- Negativo lanza "negative price".
La revisas y notas que no listó "un string de puras comas": una entrada que al limpiarse queda vacía y debería lanzar error. Le dices que agregue ese caso. Ese intercambio es todo el punto del skill: detectaste un hueco real en treinta segundos de leer una lista, no después de depurar un incidente en producción. Solo entonces escribe los tests:
import { parsePrice } from "./parsePrice"
test("parsea un precio con formato", () => {
expect(parsePrice("1,299.50")).toBe(1299.5)
})
test("lanza error con entrada vacía", () => {
expect(() => parsePrice("")).toThrow("empty price")
})
test("lanza error con un string de puras comas", () => {
expect(() => parsePrice(",,,")).toThrow("empty price")
})
test("rechaza precios negativos", () => {
expect(() => parsePrice("-5")).toThrow("negative price")
})
Cada test verifica el comportamiento observable, el número devuelto o el mensaje lanzado, y cada uno fallaría por una razón real si el parser sufriera una regresión. Ninguno espía la regex ni el orden de los chequeos, así que un refactor de las tripas los deja en verde.
05 · La configuración que lo mantiene honesto
Los defaults que vienen con el skill importan más que cualquier prompt que escribas en cada invocación, porque son la política que aplica todas las veces. Las cuatro líneas de abajo son las que nunca quito:
- Lista los comportamientos primero y luego detente. La puerta de confirmación es lo que convierte el skill de generador en revisor. Cuesta una ida y vuelta y te ahorra revisar cien líneas de tests equivocados.
- Verifica solo la salida observable. Déjalo bien claro: nada de verificar campos privados, nada de espiar llamadas a helpers internos, salvo que el efecto secundario sea el contrato (por ejemplo, "manda exactamente un correo").
- Prohíbe los tests triviales de forma explícita. Sin esa prohibición, el modelo rellena cobertura. Pon nombre a los culpables: getters, constantes, wrappers que solo dejan pasar.
- Respeta el test runner y las convenciones del proyecto. Apúntalo a un archivo de test que ya exista para que copie el estilo de imports, la librería de aserciones y la nomenclatura. Un test que no calza con el estilo de la casa es fricción, no ayuda.
También puedes dejarlo proponer casos nuevos más allá de tu lista, útil, siempre que los marque como sugerencias que tú aceptas, en vez de inflar la suite por su cuenta. La misma disciplina aparece en los demás skills que mantengo: el skill code-review evalúa contra el diff y no contra su idea de código perfecto, y el skill test-author prueba contra el contrato y no contra su propia lectura de la implementación. En ambos la idea es sujetar al modelo al estándar que tú pones, no al que él tomaría por inercia.
Consejo
Mantén un archivo de test canónico y bien escrito en el repo y apúntale el skill cada vez. Va a imitar la estructura, la nomenclatura y el estilo de aserciones mucho más confiablemente desde un ejemplo que desde un párrafo de instrucciones. Un buen ejemplo vale más que cinco reglas.
06 · Los detalles que deciden si ayuda o no
Aquí es donde una suite en verde o significa algo o te engaña.
Calcar la implementación es la falla por defecto. Si lo dejas solo, el skill escribe tests que recorren la función línea por línea, así que pasan para siempre y no atrapan nada. El arreglo es la restricción dura de la sección 03: prueba el comportamiento en el borde de la unidad. Si un test seguiría pasando después de que reescribieras las tripas desde cero, es un test real. Si se rompe apenas renombras una variable privada, es ruido.
Nunca dejes que debilite una aserción para poner en verde un test rojo. Un test que falla es información, no un obstáculo. El modelo, ansioso por dejarte una suite que pasa, a veces afloja un expect hasta que pasa, y convierte una aserción precisa en una vaga que ya no atrapa el bug. Vigila las aserciones que se ablandaron entre una corrida y otra, y trata un test rojo como un hallazgo que investigar, no como un muro que hay que derribar.
El porcentaje de cobertura es una trampa, no una meta. Un skill que persigue el 100% va a probar las líneas que ya son obviamente correctas y se va a saltar la ruta de error fea que de verdad falla en producción, porque esa ruta cuesta más de montar. Cobertura alta con tests que calcan la implementación es el estado más peligroso de todos: se ve seguro y no lo es.
Los tests de caracterización afirman "no cambió", no "es correcto". Cuando le apuntas el skill a código legacy sin cobertura, deja claro que está capturando el comportamiento actual como red de seguridad, con bugs y todo. No dejes que "arregle" el comportamiento por su cuenta mientras escribe el test; eso anula el sentido de tener una red antes de tocar nada.
Una suite de tests solo vale lo que cuesta mantenerla si un fallo te dice algo verdadero. El skill test-author se gana ese lugar forzando la lista de casos primero, verificando el comportamiento en vez de las tripas y negándose a debilitar un chequeo solo por ver verde. Conecta esas restricciones y el skill se vuelve un revisor genuino del comportamiento de tu código. Sáltatelas y habrás automatizado la producción de tests inmortales, verdes y sin valor.
Puntos clave
- Escribe la lista de casos antes de cualquier test, feliz, vacío, límite, error, y revisa la lista, no cien líneas de código generado.
- Actívalo después de una función nueva, antes de tocar código sin cobertura, o para reproducir un bug; sáltate getters, wrappers y código que vas a borrar.
- Verifica el comportamiento observable en el borde de la unidad; un test que se rompe con un renombre no prueba nada real.
- Nunca lo dejes debilitar una aserción para llegar a verde: un test rojo es información, no un obstáculo que quitar.
- Escribe más tests, no mejor criterio. Los tests que calcan la implementación y nacen en verde son peores que no tener ninguno porque fingen confianza.
Preguntas frecuentes
¿En qué se diferencia esto de simplemente pedirle a Claude 'escribe tests para esta función'?
Un pedido a secas te da el default del modelo, que son tests que calcan la implementación, pasan para siempre y no atrapan nada. El skill fuerza un orden específico, lista los comportamientos primero y detente a confirmar, luego verifica la salida observable y nunca las tripas, y prohíbe los tests triviales con los que rellenaría. La disciplina está en las restricciones, y el skill las aplica cada vez, en lugar de que tú las tengas que reescribir.
¿Por qué el skill se detiene y me muestra una lista antes de escribir tests? Se siente lento.
Porque revisar una lista de seis casos toma treinta segundos y atrapa el caso límite olvidado antes de escribir una sola línea de código. Revisar cien líneas de test generado toma diez minutos y, al final, lo vas a leer por encima nada más. La puerta de confirmación es lo que convierte el skill de generador en revisor: es el lugar más barato para detectar un caso que falta, mucho más barato que un incidente en producción.
¿Debería dejar que el skill persiga una meta de cobertura como 90%?
No. La cobertura es un síntoma, no una meta. Un skill que optimiza el porcentaje prueba las líneas que ya son obviamente correctas y se salta la ruta de error fea que de verdad falla en producción, porque esa ruta cuesta más de montar. Cobertura alta con tests que calcan la implementación es el estado más peligroso: se ve seguro y no lo es. Enfócate en los casos donde equivocarse sale caro y deja que el número quede donde tenga que quedar.
¿Qué son los tests de caracterización y cuándo debe escribirlos el skill?
Capturan lo que el código hace hoy, con bugs y todo, como red de seguridad antes de cambiarlo. El skill debe escribirlos cuando estás por modificar código sin cobertura: no afirmas que el comportamiento sea correcto, solo que no cambie por accidente. La clave es dejar bien claro que el skill debe capturar el comportamiento actual, no 'arreglarlo' por su cuenta mientras escribe el test, porque eso anula el sentido de tener la red primero.
El skill puso en verde un test que fallaba, pero cambiando la aserción. ¿Está bien eso?
Casi nunca. Un test que falla es información, no un obstáculo. El modelo, ansioso por dejarte una suite en verde, a veces afloja una aserción hasta que pasa, y convierte un chequeo preciso en uno vago que ya no atrapa el bug. Vigila las aserciones que se ablandaron entre una corrida y otra. Trata un test rojo como un hallazgo que investigar: o el código está mal o la aserción lo estaba, y eso lo decides tú, no el modelo en piloto automático.
¿El skill funciona con cualquier test runner o solo con uno en específico?
Con cualquier runner, siempre que le apuntes un archivo de test que ya exista como ejemplo. Imita la estructura, los imports, la librería de aserciones y la nomenclatura mucho más confiablemente desde un ejemplo real que desde un párrafo de reglas. El ejemplo de esta guía usa un test/expect estilo Jest, pero el skill copia el estilo de la casa que vea: mantén un archivo de test canónico y bien escrito y apúntale ahí siempre.
¿Prefieres que lo hagamos por ti?
Esto mismo lo construimos para negocios como el tuyo. La primera conversación es gratis y sin compromiso.
Escríbenos por WhatsAppPrimera conversación gratis. Te responde el fundador.
Recursos relacionados

Release Cutter: un skill de Claude Code que lee git en vez de adivinar
Cortar un release de memoria tres días después significa que el changelog nunca cuadra con lo que salió y el salto de versión es una moneda al aire. Este es un skill de Claude Code empaquetado que lee tus commits, propone el salto de semver, escribe un changelog a partir de los títulos reales de los commits, crea el tag y deja listo el release en GitHub. Te muestra la propuesta y espera un sí antes de escribir nada, así un major equivocado nunca sale por accidente.

El skill redactor de docs: README fiel al código de verdad
Un skill de Claude Code lee el código real y escribe documentación basada en lo que existe, no en adjetivos de marketing. Sales con una definición de skill que funciona, cuándo se dispara, cómo funciona por dentro y el detalle clave que evita que invente comandos.

El skill que arma servidores MCP que Claude sí sabe usar
Un skill de Claude Code que convierte una API interna o una base de datos en un servidor de Model Context Protocol con esquemas tipados, errores que orientan y permisos acotados, para que sea el agente quien opere tu sistema en vez de que tú estés pegando salidas a mano.