El nombre del test es la documentación
Cuando un test falla en CI tres meses después, el nombre es lo único que ves en el reporte antes de abrir el código. "should reject login with invalid password" comunica intención, contexto y resultado esperado en una línea. "test1" o "testLogin" no comunican nada.
El patrón "should..."
Usado en Mocha, Jest, Vitest, RSpec. Estructura: describe("<Subject>", () => {
it("should <expected behavior> when <condition>", ...) }). El verbo en
tercera persona enfatiza que estás describiendo el comportamiento del sistema, no la
acción del programador.
Given/When/Then (BDD)
Patrón que viene de Cucumber y Gherkin. Given describe el estado inicial, When la acción ejecutada, Then el resultado esperado. Funciona muy bien para tests de integración y e2e: "Given an empty cart, when the user adds a product, then the cart shows 1 item".
El patrón JUnit
En Java, la convención clásica es methodName_stateUnderTest_expectedBehavior.
Ejemplo: login_invalidPassword_returns401. Permite ordenar tests
alfabéticamente y agruparlos visualmente. En Kotlin se usa back-tick para nombres con
espacios: fun \`returns 401 when password is invalid\`().
Snake case en Python
Pytest fomenta nombres descriptivos en snake_case:
def test_login_returns_401_when_password_is_invalid():. Largo pero claro.
Combina bien con parametrize para múltiples casos.
Qué evitar
- Nombres genéricos: "testLogin", "test1", "happyPath".
- Nombres con detalles de implementación: "shouldCallSpyWithObject" (rompe al refactorizar).
- Negaciones dobles: "should not fail when not invalid".
- Nombres en TODO MAYÚSCULAS o camelCaseSinEspacios largos.
Estructura: AAA
Arrange-Act-Assert es el patrón clásico para el cuerpo del test. Arrange: prepará el estado y los mocks. Act: ejecutá la acción que se prueba. Assert: verificá el resultado. Un test debería tener un solo Act; si ves dos, probablemente son dos tests.
Tests parametrizados
Si querés cubrir múltiples inputs, no copies el test cinco veces. Usá
test.each en Jest, parametrize en pytest, theory
en xUnit. Los nombres se generan automáticamente desde los parámetros, lo que mantiene
legibilidad sin duplicar código.