Si tengo una función de prueba de unidad compleja :
def do_everything():
# turn twizzles
# push buttons
# move mountain
Y lo vuelvo a factorizar en algunas unidades más pequeñas:
def do_everything():
turn_twizzles()
push_buttons()
move_mountain()
def turn_twizzles():
# turn twizzles
def push_buttons():
# push buttons
def move_mountain():
# move mountain
¿Estoy perdiendo el tiempo escribiendo pruebas de unidades adicionales para esas unidades más pequeñas?
unit-testing
refactoring
Adam Terrey
fuente
fuente
private
palabra clave en un lenguaje de programación es solo una de las muchas formas de restringir el acceso a un fragmento de código.Depende. Para ser más precisos, depende de
Especialmente cuando esas "funciones más pequeñas" no son tan triviales como en su ejemplo, pero tendrán una lista más o menos compleja de parámetros de entrada, puede ser realmente difícil producir suficientes pruebas unitarias para su función original para garantizar que se prueben las funciones más pequeñas con todas las combinaciones de entrada "interesantes". Esa sería una señal clara para escribir pruebas unitarias específicas para las funciones más pequeñas también.
Por lo tanto, no hay un claro "sí" o "no" a esta pregunta, es una compensación que debe decidir por caso.
fuente
Si
turn_twizzles
,push_buttons
ymove_mountain
son públicos y son llamados por otro código, entonces creo que es importante refactorizar sus pruebas para probar estas funciones individualmente.Por desgracia después de su refactor tiene un problema: a prueba de unidad
do_everything
que necesita para ser capaz de burlarseturn_twizzles
,push_buttons
ymove_mountain
. Escribir pruebasdo_everything
sin burlarse de las dependencias será una prueba de integración, no necesariamente algo malo dependiendo de su plan de prueba, pero no habrá muchos beneficios porque ya está probando las tres funciones más pequeñas individualmente. Este puede ser el momento adecuado para rediseñar este componente y colaborar con otros objetos para hacer todo el trabajodo_everything
.Si
turn_twizzles
,push_buttons
ymove_mountain
no se llaman externamente, deberían marcarse como privados, y no recomendaría probarlos por separadodo_everything
. Esto se debe a que desde una de entrada fuera de aspecto perspectiva,do_everything
sería la unidad más pequeña (ya que los otros son inaccesibles). Consulte también esta respuesta sobre la separación de métodos que utilizan métodos privados.fuente
do_everything
que necesita para ser capaz de burlarseturn_twizzles
,push_buttons
ymove_mountain
... " depende de una definición sin sentido de "prueba de unidad".No. Las pruebas unitarias adicionales son más precisas. Si
move_mountain
falla, entonces fallará una sola prueba que dice muy específicamente qué salió mal.Esa precisión reduce el tiempo de depuración, lo cual es valioso. Además, dado que la prueba está más enfocada, debería ser más rápido de ejecutar que probar la misma funcionalidad a través de la función completa, proporcionando una retroalimentación más rápida, lo cual es valioso.
fuente