¿Cuándo una prueba deja de ser unitaria?

Estoy en Bruselas asistiendo a un Train The Trainers para la nueva certificación Professional Scrum Developer creada por Ken Schwaber, uno de los padres de Scrum de la mano con Microsoft (hay una versión para Java también). La formación la está impartiendo Richard Hundhausen, viejo conocido de la comunidad en torno VSTS y TFS.

Hace un tiempo mandó un correo a una lista interna de MVPs y desarrolladores de Microsoft lanzando una cuestión muy interesante ¿Cuando una prueba unitaria se deja de considerar unitaria?. El problema es que no hay una respuesta clara para esta pregunta, pero lo bueno es que esto puede generar un debate muy interesante. Hoy he aprovechado que le tenía a mano para preguntarle si le importaba que usase las figuras de su correo para plantear esta misma cuestión en mi blog y en esas estoy.

Quiero lanzar las siguientes cuestiones:

¿De los siguientes ejemplos cuales son pruebas unitarias para tí?.
¿Si no son pruebas unitarias que tipo de pruebas son? integración, aceptación, caja negra, caja blanca… ¿cómo las etiquetarías?.

Ejemplo 1 – Muy probablemente todos coincidamos en que esto es una prueba unitaria. Sin lugar a dudas ¿no?.

clip_image001[7]

Ejemplo 2 – ¿Y si el método público llama a uno privado? ¿Sigue esto siendo un test unitario?

clip_image002[5]

Ejemplo 3 –¿Y si se llama a otro método público se convierte el test en un test de integración?

clip_image003[5]

Ejemplo 4 – ¿Esto es un test de integración? o sigue siendo un test unitario.

clip_image004[6]

Ejemplo 5 – ¿Un test unitario se convierte en un test de integración si cruzamos las fronteras del assembly bajo test?

clip_image005[4]

Ejemplo 6 – ¿Y si llamamos a una base de datos o a un servicio web? ¿Es esto un test unitario para vosotros? o es un test de sistema.

clip_image006[4]

¿En definitiva cuando una prueba unitaria deja de ser una prueba unitaria y pasa a ser otra cosa?

Para mi todos los casos son casos de pruebas unitarias, de diferente naturaleza, pero pruebas unitarias al fin y al cabo.

Poniéndome purista podría admitir que el ejemplo 6 no lo sea. Pero ya he dejado claro anteriormente que una cosa que quiero poder hacer con mis test es ejecutarlos contra la base de datos (no siempre, pero si cuando me convenga, hago posible gracias a inversión de control e inyección de dependencias).

El ejemplo 5 también me plantea dudas, pero si consideramos que no es una prueba unitaria ¿deberíamos entonces sistemáticamente mockear todas las llamadas hacia afuera de nuestro assembly? ¿Incluidas también las llamadas al framework?.

Espero vuestras opiniones.