Guía de Entrevista: TDD

Esta guía recopila preguntas, respuestas y ejemplos prácticos sobre TDD - Test Driven Development para entrevistas técnicas, incluyendo cómo mostrar experiencia de uso real en proyectos.


1. Conceptos Fundamentales

Pregunta: ¿Qué es TDD - Test Driven Development y por qué es útil?
Respuesta: Test-Driven Development es un enfoque de desarrollo donde los tests se escriben antes del código de producción para guiar el diseño, garantizar calidad y reducir defectos en producción.
Experiencia de uso: “En mi último proyecto de e-commerce, implementé TDD para la funcionalidad de carrito de compras, escribiendo primero tests unitarios para calcular descuentos, luego la lógica mínima y finalmente refactorizando el código con confianza.”

Pregunta: ¿Qué diferencia hay entre TDD - Test Driven Development y BDD?
Respuesta: BDD es una extensión de TDD que utiliza lenguaje natural y escenarios de negocio para definir pruebas, enfocándose en la comunicación con stakeholders.
Ejemplo práctico: Usamos Cucumber para definir escenarios de login y dashboard usando Given-When-Then, lo que permitió a QA y Product Owners validar requisitos.


2. Ciclo Red-Green-Refactor

Pregunta: Explícame el ciclo Red-Green-Refactor.
Respuesta:

  • Red: Escribir un test que falle.
  • Green: Implementar el código mínimo para pasar el test.
  • Refactor: Mejorar la estructura del código manteniendo los tests verdes.

Código de ejemplo:

// Red
test('should fail login with wrong password', () => {
  const result = login('user@test.com', 'wrong');
  expect(result.success).toBe(false);
});

// Green
function login(email: string, password: string) {
  return (email === 'user@test.com' && password === '1234') 
    ? { success: true, token: 'jwt-token' } 
    : { success: false };
}

// Refactor
const validUser = { email: 'user@test.com', password: '1234' };
function login(email: string, password: string) {
  return (email === validUser.email && password === validUser.password) 
    ? { success: true, token: 'jwt-token' } 
    : { success: false };
}

`

Experiencia de uso: “Implementé este ciclo en un microservicio de autenticación, logrando tests unitarios confiables y cobertura completa antes de mergear.”


3. Test Doubles y Mocks

Pregunta: ¿Qué son Test Doubles y cuándo se usan?
Respuesta: Objetos que reemplazan dependencias reales para aislar unidades bajo prueba. Incluye Dummy, Stub, Spy, Mock y Fake.
Ejemplo:

import axios from 'axios';
jest.mock('axios');
axios.get.mockResolvedValue({ data: { name: 'Empresa ABC' } });

Experiencia de uso: “Mockeamos APIs externas en integración de pagos para tests rápidos y consistentes.”


4. Estrategias y Buenas Prácticas

Pregunta: ¿Qué prácticas sigues en TDD para mantener tests limpios?
Respuesta:

  • AAA Pattern (Arrange-Act-Assert)
  • Naming Patterns: should_<comportamiento>_when_<condición>()
  • Test Isolation
  • Fixture Setup
  • Refactor Patterns y Continuous Quality

Ejemplo práctico:

describe('calculateDiscount', () => {
  beforeEach(() => resetDatabase());
  it('should apply 10% discount for premium users', () => {
    const result = calculateDiscount(100, 'premium');
    expect(result).toBe(90);
  });
});

5. Cobertura y Métricas

Pregunta: ¿Cómo mides la efectividad de tus tests TDD?
Respuesta:

  • Test Coverage (Statements, Branches, Functions, Lines)
  • Pass Rate por suite
  • MTTR y tiempo de ciclo
  • Anti-Flakiness

Experiencia de uso: “Usamos Codecov y SonarQube en pipelines CI/CD para asegurar cobertura ≥90% en módulos críticos.”


6. Escenarios de Entrevista Comportamental

Pregunta: Describe un desafío al aplicar TDD y cómo lo resolviste.
Respuesta sugerida:
“En un proyecto con múltiples microservicios, algunos tests eran frágiles por dependencias externas. Implementé mocks y test doubles, asegurando que los tests unitarios fueran rápidos y confiables, integrando todo en CI/CD para feedback inmediato.”

Pregunta: ¿Cómo integras BDD con TDD en la empresa?
Respuesta:
“Primero se escriben tests unitarios (TDD) para la lógica crítica y luego escenarios de BDD para flujos de negocio usando Cucumber. Esto permite comunicación clara con QA y Product Owners.”


7. Preguntas Avanzadas

Pregunta: ¿Qué son tests intermitentes y cómo los gestionas?
Respuesta: Flaky tests son tests que fallan aleatoriamente. Se gestionan mediante:

  • Entornos controlados
  • Mocks consistentes
  • Esperas explícitas y timeouts ajustados

Pregunta: ¿Qué patrones de refactorización sigues con TDD?
Respuesta: Extract Function, Replace Conditional with Polymorphism, Introduce Parameter Object, siempre asegurando tests verdes antes de cualquier cambio.


8. Resumen de Herramientas

  • PHPUnit: Framework PHP compatible con TDD - Test Driven Development
  • Vitest / Jest: Unit testing JS/TS
  • Playwright / Cypress: E2E Testing
  • Cucumber / Behat / SpecFlow: BDD
  • Codecov / SonarQube: Cobertura y métricas
  • MSW / WireMock / Sinon: Mocks y test doubles

Tip final para entrevistas: Siempre vincula tu respuesta con experiencia real: muestra tests que escribiste, cómo aplicaste Red-Green-Refactor y cómo los resultados impactaron la calidad y confiabilidad del software.