¿Vale realmente la pena la prueba unitaria para desarrollar pequeñas aplicaciones?

No es si estás haciendo pruebas unitarias. Es si lo estás haciendo bien, ¿estás obteniendo todo el valor de ello?

Pruebas unitarias como una forma de vida : si está haciendo pruebas unitarias como una forma de vida, tendrá una buena intuición sobre cuándo usarlas. Tiene grandes ventajas

1. Fragmentos de código: escribir pequeños fragmentos de código que manejan pequeños fragmentos de código se convierte casi en una necesidad. Esto también conduce al desarrollo iterativo (¡gran victoria!). Cuando estás haciendo pruebas unitarias, no atacas un problema / característica en su conjunto. Tú haces partes de eso. Imagine una función en la que tiene que hacer algunas llamadas al servicio web, analizar los resultados y devolver algunos objetos con los resultados. Recortaría el servicio web de llamada, probaría y, en efecto, lo parametrizaría correctamente. Luego haga lo mismo para el análisis de resultados y la creación de objetos. Voila, básicamente has creado una característica completa haciendo solo experimentación. Esto es lo que las personas hacen en el REPL cuando codifican. Son pruebas unitarias. O podría decir que las pruebas unitarias son su REPL.

2. Depuración más fácil: cualquier error ocurre durante el ciclo de vida de un hilo de ejecución. En cualquier base de código esto podría ser bastante complicado. Con Unit Testing, básicamente puede dividir esto en piezas y hacer una búsqueda binaria de la pieza que está fallando. Enlace sutil a git bisect. Reproducir un error es fácil, simplemente escriba una prueba y, una vez que lo haga, ¡el código futuro no puede dañarlo!

3. La Ley de Permutación – Digamos que una clase tiene 5 casos de prueba. La siguiente clase tiene 5 casos de prueba y así sucesivamente hasta 5 clases de profundidad hasta llegar a sus modelos de dominio. Pruebas unitarias – 5 * 5 = 25 pruebas. Total de flujos de código posibles: 5 ^ 5 – 3125. ¡Gran victoria!

4. La Ley de Entrada / Salida: una gran cantidad de programación informática (salvo esos efectos secundarios desagradables) puede reducirse a b = f (a). Usted da una entrada y obtiene una salida. Simple. Agregue suficiente de estos juntos y tendrá algo. Hay una razón por la que esos tipos de programación funcional siguen hablando de efectos secundarios.

5. Esa ley de cambios: en realidad, la mayoría de las pruebas solo son útiles si cambia el código después de escribirlo una vez. En realidad, la mayor parte del código requiere eso. Aso, el punto emerge. En realidad, es principalmente útil.

6. Organiza la estructura del código y los pensamientos. Viste que eso sucedía, ¿no?

Ahora no siempre es completamente bueno. Habrá fanáticos que te lo dirán. No los escuches, y mejor mantente / huye de ellos.

Cobertura de velocidad / prueba : sea pragmático. No necesita probar cada centímetro del código. Prueba lo que te aporta más valor. Asegúrate de tener suficientes pruebas para arrancar la mayoría de las partes de la aplicación de forma independiente y jugar con ellas. Realmente no apunte a una cobertura de prueba completa.

Ya sabes cómo los niños aprenden a programar, hacen un cambio y ven su efecto. Si se rompe o funciona. Así es como aprenden y así es como deberíamos programar como adultos también. Olvidamos eso a mitad de camino, y hacemos estas bestias complicadas de las que no sabemos lo que está sucediendo dentro. Su código siempre debe ser algo que pueda modificar y ver si se rompe o funciona, o cómo reacciona. Pierde esto y, básicamente, ya no puedes jugar con tu código. Tu cerebro está jodido.

Inversión – ¿Qué pasa si no sé todo esto? ¿Vale la pena la inversión? En mi experiencia, la inversión en pruebas unitarias y configuración de CI generalmente paga su costo inicial mejor que el oro puro.

Hacerlo bienCuadro negro, siempre cuadro negro (repita después de mí y escríbalo en la pizarra 5 veces) – La programación está diseñada alrededor de interfaces, la verdadera abstracción. Tal debería ser su prueba. Debe probar una función sin saber lo que contiene. Si lo haces, lo estás haciendo mal. No adivines el flujo del código. No intentes burlarte de cada pequeño aspecto del código que estás probando. Está mal, no importa cuán importante sea el programador diciéndote eso. Siempre debe probar lo que hace la función, no cómo lo hace.

Ahora la parte final y más importante que realmente fue el punto central de todo esto. No lo use cuando realmente no lo necesite. Si siente que se ve obligado a escribir pruebas en una línea de montaje, lo está haciendo mal. Tal vez incluso eso esté bien cuando el producto ha alcanzado un cierto nivel de madurez. Las cosas nuevas no deben probarse de manera rígida a menos que sea google / ms / facebook, etc.

Además, escriba buenos casos de prueba. Eso requiere imaginación. No es estrictamente una habilidad de programación en realidad. Es una habilidad ligeramente diferente, que tienen los probadores tenaces y los hackers de seguridad.

No muchos programadores son tan buenos y a menudo compensan exagerando las pruebas (escribiendo 25 simulacros y verificando si se llamó a cada línea del código y capturando los argumentos llamados dentro de la función) y despreciando a otros que no siguen su ensamblaje línea. Básicamente son idiotas que malgastan el dinero del cliente y de las empresas. Pero entonces la informática también tiene su religión 🙂

Salir adelante. Que las xUnits te acompañen

La razón por la que haces las pruebas es porque, bueno … No quieres liberar código con errores, y la forma de encontrarlos es probándolo. Su pregunta estaba relacionada con las pruebas unitarias, no con las pruebas en general. Entonces, voy a asumir que estás probando

La razón por la que realiza pruebas automáticas es porque SECO … No se repita. Esto se aplica al diseño de software: si ha implementado algo, hágalo reutilizable para que no vuelva a implementar lo mismo. También se aplica a los procesos de desarrollo de software: si ha hecho algo una vez, no debería volver a hacerlo. Si ha probado una funcionalidad una vez, no desea volver a probarla. Obviamente, tienes que probar todo cada vez que haces un cambio. Al automatizar sus pruebas, se asegura de hacer que la computadora humilde haga el trabajo duro mientras que el humano inteligente se enfoca en el diseño del código y las pruebas

Las ventajas de las pruebas automatizadas son
A) reduces tu esfuerzo. ¿Por qué hacerlo usted mismo cuando la computadora puede hacerlo?
B) la computadora puede hacer las pruebas más rápido y trabajar de noche y fines de semana
C) la computadora hará las pruebas de manera más consistente. Le dices que haga la prueba de cierta manera y hará lo mismo para siempre

Entonces, ahora llegando a su pregunta: ¿se requieren pruebas unitarias para aplicaciones pequeñas? Ampliando su pregunta. ¿Se requieren pruebas de caja blanca automatizadas a nivel de unidad para aplicaciones pequeñas? Bueno, creo que la pregunta es un arenque rojo. Debe centrarse en la automatización de las pruebas y en obtener una buena cobertura del código y los casos de uso empresarial. ¿Cómo lo haces, depende de ti? Lo que lo hace efectivo en la entrega de algo depende de cuán efectivas sean sus pruebas y qué tan rápido pueda corregir los errores después de que sus pruebas los encuentren. Si es una tienda de un solo hombre, su enfoque debe estar en la cobertura de la prueba y en el diseño de sus pruebas para que sus informes de errores tengan suficiente información que pueda identificar dónde está el error.

Bueno, si es tan pequeño, digamos 5 clases, debe ser realmente fácil de probar. ¿Por qué posponerlo? ¿Hay algo que intentas ocultar?

El hecho de que mencione que quizás sea bueno no probar algo es una clara indicación de que algo está mal con esa aplicación.

Usé esa regla general en un gran proyecto, porque los grandes proyectos también están hechos de cosas pequeñas, y muchas veces alguien venía y me decía que estaban omitiendo las pruebas en algún lugar, obviamente inspeccioné ese código y descubrí casi de inmediato por qué no lo hicieron. No quiero hacer las pruebas: invariablemente, el código era un desastre.

Tenía que concentrarme en lo que sea que intentaran ocultar. Desafortunadamente sucede todo el tiempo, como si tuvieran 3 años.

Incluso pruebo el diseño solicitando un prototipo para cada decisión de diseño. Cuando las personas se quejan de que no quieren hacer un prototipo, porque es demasiado simple, demasiado fácil, demasiado pequeño o lo que sea, sé exactamente dónde están los puntos débiles.

Pequeña o grande, cada aplicación tiene una vida (a menos que sea un POC) y durante esa vida, se somete a varios cambios. Las pruebas unitarias aseguran que esos cambios no rompan las funciones ya existentes.

Los proyectos pequeños se convierten en proyectos grandes con frecuencia alarmante.

Un programador defensivo comenzará un proyecto con las mejores prácticas, como las pruebas unitarias, porque son más difíciles de adaptar que hacerlas correctamente en primer lugar.

También existe una disciplina mental que inspiran las pruebas unitarias que a menudo da como resultado un mejor código, con interfaces más limpias y una separación de preocupaciones bien considerada.

Si una función se puede probar fácilmente con una prueba unitaria, definitivamente debe escribirla. De lo contrario, debe probarlo manualmente de todos modos, escribir una prueba unitaria realmente ahorra tiempo al acelerar el flujo de depuración.

Si una función necesita un esfuerzo significativo para escribir una prueba unitaria, por ejemplo, material de interfaz de usuario, entonces debe considerar si vale la pena el tiempo.

¡Sí!

Las pruebas unitarias son una parte muy importante del procedimiento de codificación.

Le ayuda a asegurarse de que el código que escribió realmente funcione antes de escribir el siguiente fragmento de código.

Los errores ocurren cada vez y en todas partes.

Incluso si su aplicación es pequeña, probablemente habrá algunos errores.

¡Las pruebas unitarias son la forma de eliminar esos errores y garantizar que su código funcione!

¿Realmente vale la pena leer (probar) el título de tu publicación? Le señalo su error tipográfico para probar un punto. Incluso las aplicaciones pequeñas o las oraciones pequeñas pueden tener errores críticos o importantes. También debe tener en cuenta su base de usuarios. ¿Esperan la perfección? ¿Cuál es el costo del defecto?