Clases de utilidad de prueba unitaria

10

Todos tenemos algunas clases de utilidad, que contienen solo métodos estáticos, para usar desde diferentes fuentes. Ahora, puede haber dos enfoques que se pueden tomar para probar este fragmento de código.

Enfoque 1:

Tener pruebas unitarias separadas para clases de utilidad. Dondequiera que se les llame, simule su interacción utilizando algún marco de prueba que tenga provisiones para ello, como PowerMock. Básicamente, esto trata la clase de utilidad como un componente separado del sistema, que debe probarse y mantenerse individualmente.

Enfoque 2:

No escriba pruebas unitarias para clases de utilidad. Sin embargo, las pruebas que se escriben para sus otras clases principales que interactúan con esta clase de utilidad, permiten que ocurra esa interacción, lo que garantizará intrínsecamente que el código escrito en esta clase de utilidad se pruebe adecuadamente para diferentes casos de uso. Si algo se rompe, las pruebas para otros componentes deberían poder atraparlo.

Comparta sus ideas sobre qué enfoque es preferible, o si hay alguna otra forma en que las personas aborden esto.

Ulrich
fuente
1
Relacionado: Servicios estáticos y capacidad de prueba: “Si una función es pura, puede probarla directamente una vez y luego usarla en otro código sabiendo que funcionará. Esto generalmente solo se aplica a pequeños métodos de utilidad, o cuando estás haciendo una programación funcional estricta. Si el servicio proporcionado por ese método estático es más complejo, es deseable utilizar técnicas de inyección de dependencia ". En cualquier caso, las pruebas directas de los métodos estáticos públicos tienen sentido.
amon

Respuestas:

7

Creo que hay un gran malentendido sobre las clases de 'utilidad' por ahí. El hecho de que haga una clase 'estática' no la convierte en una clase de utilidad. Si su clase de utilidad estática tiene dependencias (que pueden manifestarse en otras clases de 'utilidad' estáticas), introduce efectos secundarios o su comportamiento no puede ser completamente controlado por sus entradas, no es una clase de utilidad.

No es necesario burlarse de las verdaderas clases de utilidad porque su salida siempre es determinista dependiendo de sus entradas.

La prueba de unidad consiste en crear una instancia de una pequeña parte de su aplicación (una unidad) de forma aislada para que pueda (potencialmente) probar todas las rutas de código dentro de esa unidad. Las burlas de las dependencias logran este aislamiento. Si una clase de utilidad rompe el aislamiento, nuevamente no es una clase de utilidad porque se supone que una clase de utilidad está aislada por definición.

Entonces, en una aplicación, uno nunca debería querer o tener que burlarse de las clases de utilidad. Las clases que usted cree que deben burlarse deben convertirse en clases instanciables de primera clase y deben pasar a la unidad como una dependencia (consulte Inyección de dependencias ). Estas dependencias se pueden burlar fácilmente para que la unidad se pueda probar de forma aislada.

c_maker
fuente
19

En mi opinión, es ridículo burlarse de una dependencia de un método de utilidad estática para cosas como la división de cadenas.

Sí, si el método de división es incorrecto, puede causar fallas falsas en las pruebas de métodos que no se tratan de división de cadenas. Pero ese no es el objetivo de un conjunto de pruebas. El conjunto de pruebas debe tener éxito al 100%, punto. Si no lo hace, arregla lo que está roto y repite hasta que tenga éxito al 100%. Si la clase de utilidad de cadena se rompe, inmediatamente debería causar una falla en una prueba que trata sobre la funcionalidad de la cadena. Corrige esa funcionalidad y luego desaparecen todas las fallas, por lo que nunca tiene que mirar los casos de prueba falsamente espurios.

En otras palabras, SÍ, escriba pruebas para métodos de utilidad. NO, no intentes desacoplarlos de otras pruebas. Simplemente suponga que las funciones de utilidad triviales funcionan correctamente, como lo verifican sus propias pruebas. Hacer algo más es más esfuerzo sin ganancia alguna.

Kilian Foth
fuente
Solo para estar seguro, prefieres el enfoque 2 sobre 1, ¿verdad?
Ahmad Fadli
1
@ AhmadFadli No, él dice que el enfoque 3 es el mejor: escribir pruebas para funciones de utilidad y no burlarse de ellas en otras pruebas.
FINDarkside
@AhmadFadli, "En otras palabras, SÍ, escriba pruebas para métodos de utilidad. NO, no intente desacoplarlas de otras pruebas", eso significa la segunda opción, supongo. Es decir, escriba una prueba que utilice métodos de clase de Utilidad pero no escriba pruebas de insolación específica para un método de Utilidad
Farid