Testing con IA: El Nuevo Paradigma

Una de las mejores aplicaciones de Claude Code es la generación de tests. Claude entiende tu código y puede crear tests completos, incluyendo edge cases que podrías olvidar.

Si quieres dominar esta y otras capacidades, el curso de Claude Code te enseña todo lo necesario.

Por Qué Usar Claude Code para Testing

  • Velocidad: Tests en minutos, no horas
  • Cobertura: Claude encuentra edge cases
  • Consistencia: Sigue tus patrones existentes
  • Aprendizaje: Ves buenos ejemplos de tests

Generar Tests Unitarios

Ejemplo con Jest (JavaScript)

Tienes este código:

// utils/calculator.js
export function add(a, b) {
  return a + b;
}

export function divide(a, b) {
  if (b === 0) throw new Error('Division by zero');
  return a / b;
}

En Claude Code:

Genera tests unitarios con Jest para @utils/calculator.js
Incluye casos de éxito y edge cases.

Claude genera:

// utils/calculator.test.js
import { add, divide } from './calculator';

describe('Calculator', () => {
  describe('add', () => {
    it('should add two positive numbers', () => {
      expect(add(2, 3)).toBe(5);
    });

    it('should handle negative numbers', () => {
      expect(add(-1, 5)).toBe(4);
    });

    it('should handle zero', () => {
      expect(add(0, 0)).toBe(0);
    });
  });

  describe('divide', () => {
    it('should divide two numbers', () => {
      expect(divide(10, 2)).toBe(5);
    });

    it('should handle decimal results', () => {
      expect(divide(5, 2)).toBe(2.5);
    });

    it('should throw error on division by zero', () => {
      expect(() => divide(10, 0)).toThrow('Division by zero');
    });
  });
});

Tests con Pytest (Python)

En Claude Code:

Genera tests con Pytest para @services/user_service.py
Usa fixtures y parametrize para edge cases.

Claude genera:

import pytest
from services.user_service import UserService

@pytest.fixture
def user_service():
    return UserService()

@pytest.fixture
def sample_user():
    return {"name": "John", "email": "john@example.com"}

class TestUserService:
    def test_create_user_success(self, user_service, sample_user):
        result = user_service.create(sample_user)
        assert result.name == "John"
        assert result.email == "john@example.com"

    @pytest.mark.parametrize("invalid_email", [
        "invalid",
        "@nodomain",
        "spaces in@email.com",
    ])
    def test_create_user_invalid_email(self, user_service, invalid_email):
        with pytest.raises(ValueError):
            user_service.create({"name": "Test", "email": invalid_email})

    def test_create_user_duplicate_email(self, user_service, sample_user):
        user_service.create(sample_user)
        with pytest.raises(DuplicateError):
            user_service.create(sample_user)

Tests de Integración

En Claude Code:

Genera tests de integración para la API REST en @routes/api.js
Usa supertest y mockea la base de datos.

Tests E2E con Playwright

Genera tests E2E con Playwright para el flujo de login.
El usuario debe poder:
1. Ir a /login
2. Ingresar credenciales
3. Ver el dashboard

Claude genera:

import { test, expect } from '@playwright/test';

test.describe('Login Flow', () => {
  test('should login successfully with valid credentials', async ({ page }) => {
    await page.goto('/login');
    
    await page.fill('[data-testid="email"]', 'user@example.com');
    await page.fill('[data-testid="password"]', 'password123');
    await page.click('[data-testid="login-button"]');
    
    await expect(page).toHaveURL('/dashboard');
    await expect(page.locator('h1')).toContainText('Welcome');
  });

  test('should show error with invalid credentials', async ({ page }) => {
    await page.goto('/login');
    
    await page.fill('[data-testid="email"]', 'wrong@example.com');
    await page.fill('[data-testid="password"]', 'wrongpassword');
    await page.click('[data-testid="login-button"]');
    
    await expect(page.locator('.error-message')).toBeVisible();
  });
});

Prompts Efectivos para Tests

Conocer los comandos esenciales de Claude Code te ayudará a escribir mejores prompts.

Para Cobertura Completa

Genera tests para @archivo.js con:
- Happy path
- Edge cases (null, undefined, empty)
- Error handling
- Boundary conditions
- Async scenarios si aplica

Para Seguir Patrones Existentes

Mira los tests en @tests/ y genera tests para
@nuevo_modulo.js siguiendo el mismo estilo y estructura.

Mejorando Tests Existentes

Revisa @tests/user.test.js y sugiere:
1. Tests que faltan
2. Edge cases no cubiertos
3. Mejoras en la estructura

Mocking con Claude Code

El servicio en @services/payment.js usa Stripe.
Genera tests que mockeen las llamadas a Stripe
usando jest.mock().

Tips para Mejores Tests

  1. Sé específico: Menciona el framework de testing
  2. Da contexto: Explica qué hace el código
  3. Pide edge cases: Claude los encuentra si se lo pides
  4. Revisa: Siempre ejecuta los tests generados

Workflow Recomendado

  1. Escribe el código de producción
  2. Pide a Claude Code que genere tests
  3. Ejecuta los tests: /run npm test
  4. Si fallan, pide a Claude que los corrija
  5. Itera hasta tener buena cobertura

Conclusión

Claude Code puede multiplicar tu productividad en testing. No reemplaza entender testing, pero automatiza la parte repetitiva.

Empieza generando tests para código existente sin tests. Verás cómo mejora tu cobertura rápidamente. Si eres principiante, comienza con la guía de Claude Code para principiantes. Y para desarrollo web con tests, revisa nuestra guía de Claude Code para desarrollo web. Todo esto en el curso de Claude Code.