De la entrevista con Kent Beck en un reciente número de la revista Java:
Binstock: Discutamos microservicios. Me parece que probar primero en microservicios se volvería complicado en el sentido de que algunos servicios, para funcionar, necesitarán la presencia de muchos otros servicios. ¿Estás de acuerdo?
Beck: Parece el mismo conjunto de intercambios sobre tener una clase grande o muchas clases pequeñas.
Binstock: Correcto, excepto que supongo, aquí tienes que usar una gran cantidad de simulacros para poder configurar un sistema mediante el cual puedas probar un servicio determinado.
Beck: no estoy de acuerdo. Si tiene un estilo imperativo, debe usar muchas simulaciones. En un estilo funcional donde las dependencias externas se recopilan juntas en la parte superior de la cadena de llamadas, entonces no creo que sea necesario. Creo que puede obtener mucha cobertura de las pruebas unitarias.
¿Qué quiere decir? ¿Cómo puede el estilo funcional liberarlo de burlarse de las dependencias externas?
Respuestas:
Una función pura es aquella que:
Supongamos que estamos escribiendo algún código para manejar el inicio de sesión del usuario, donde queremos verificar que el nombre de usuario y la contraseña proporcionados sean correctos y evitar que el usuario inicie sesión si hay demasiados intentos fallidos. En un estilo imperativo, nuestro código podría verse así:
Está bastante claro que esta no es una función pura:
username
ypassword
combinación como el resultado también depende del registro de usuario almacenada en la base de datos.También tenga en cuenta que para realizar una prueba unitaria de esta función, debemos simular dos llamadas a la base de datos,
FindUser
yRecordFailedLoginAttempt
.Si tuviéramos que refactorizar este código en un estilo más funcional, podríamos terminar con algo así:
Tenga en cuenta que aunque la
UserLogin
función aún no es pura,UserLoginPure
ahora es una función pura y, como resultado, la lógica de autenticación del usuario central puede probarse en la unidad sin necesidad de burlarse de ninguna dependencia externa. Esto se debe a que la interacción con la base de datos se maneja más arriba en la pila de llamadas.fuente