Si las pruebas unitarias son tan buenas, ¿por qué no lo hacen más empresas? [cerrado]

103

La primera empresa de software real en la que trabajé tenía que ver con las pruebas unitarias (NUnit). No sé si éramos muy estrictos en ese entonces; no tengo idea de cómo era nuestra cobertura de código y estaba escribiendo la mayoría de las pruebas unitarias. Desde entonces, me he encontrado con algunas empresas que hacen muchas pruebas, pero es una prueba de silla: depende de la presencia de una persona, tiene poca repetibilidad y pocas posibilidades de detectar errores. La otra actitud es: era algo con lo que querían empezar "en el futuro"; básicamente cuando el dinero cae del cielo.

Extraño las pruebas unitarias, simplemente hace la vida más fácil. Pero descubro que cuando busco un nuevo trabajo, las pruebas unitarias son algo que a las empresas les gustaría "empezar" en el futuro o algo que no hacen en absoluto (uhh, ha existido por un tiempo ¡ahora!). Yo diría que entre el 60 y el 75% de los requisitos de trabajo que he examinado durante los últimos 2 años no incluyen pruebas unitarias en absoluto. Solo puedo pensar en uno o dos que tuvieran experiencia en pruebas unitarias como requisito (para un puesto de desarrollador de nivel medio).

Entonces la pregunta es, ¿qué falta ? Creo que hace que la gente sea más productiva, pero eso solo después de pasar una gran cantidad de tiempo realmente haciéndolo. ¿No hay buenos estudios sobre el ahorro de costes de las pruebas unitarias? ¿Es el tipo de empresa que estoy viendo?

Editar: aunque el título es un poco defensor de los demonios, me considero un proponente de pruebas unitarias.

jcollum
fuente
¿En qué tipo de dominio estás trabajando? Siempre me he encontrado con pruebas unitarias, de diversa completitud, dondequiera que haya trabajado. Pero mi experiencia radica en imágenes médicas e industriales, por lo que podría ser la razón ...
Kena
Sí, sospecho que tienes razón. Mi dominio suele ser aplicaciones de línea de negocio; la vida de nadie está en juego. Pero a veces hay cierta facturación en el saldo, y eso puede resultar costoso.
jcollum
11
Prueba de silla: la persona se sienta en la silla, impulsa la aplicación, informa errores.
jcollum
3
@Darknight debería tener 50k votos a favor por su honestidad. Vamos, viejos, ponte al día con la hora de hoy. Mantenga esa basura de pruebas unitarias en los 90 donde pertenece. La mayor pérdida de tiempo. Es solo algo para mencionar para que pueda parecer importante, pero no hace absolutamente nada en la mayoría de los casos. Tenemos algo llamado IDE en estos días, ya no estamos programando por consola o en el bloc de notas. Sabemos que nuestro código es correcto porque podemos colocar el cursor sobre el texto y ver los valores. Mantenga las pruebas unitarias en el pasado con todos los demás veteranos.
portfoliobuilder
1
@portfoliobuilder Sí, pasar el mouse sobre los valores dentro de su IDE realmente ayudará a mejorar la calidad del código. Porque el estado siempre será el mismo y el código nunca cambiará. ¡Tocar el asunto exacto! Y buena suerte.
Franz D.

Respuestas:

112

En mi experiencia, hay un par de factores involucrados en esto:

  1. La gerencia no comprende realmente qué son las pruebas unitarias o por qué tienen un valor intrínseco real para ellos.
  2. La gerencia tiende a estar más preocupada por la entrega rápida del producto y (incorrectamente) ve las pruebas unitarias como contraproducentes para ese objetivo.
  3. Existe la idea errónea de que las pruebas pertenecen únicamente al componente de control de calidad. Los desarrolladores son programadores y no pueden escribir pruebas.
  4. Existe la idea errónea de que la administración tendrá que gastar dinero para realizar las pruebas unitarias correctamente, a pesar de que las herramientas están disponibles gratuitamente. (Por supuesto, hay que considerar el tiempo de aceleración del desarrollador, pero no es realmente prohibitivo).
  5. La respuesta de Will completará esta respuesta: es muy difícil determinar el valor del código de prueba (editar jcollum)

Naturalmente, hay otros factores, pero esos son los que me he encontrado hasta ahora.

Mike Hofer
fuente
Sí, describí bastante bien mi gestión y no tenemos pruebas.
Ty.
Y el soporte para él en algunos idiomas populares (C / C ++) es deficiente.
Martin Beckett
@mgb - CxxUnit funciona bastante bien para mí ...
Dominic Rodger
2
CxxTest también es muy bueno. Debido a los pobres mecanismos de reflexión en C ++, parece que se presentan más "soluciones" variadas; CxxTest requiere un paso previo al proceso en el sistema de compilación, mientras que las herramientas como TUT son completamente compatibles con el lenguaje y el tiempo de compilación, pero son difíciles de usar.
Tom
2
He descubierto que los usuarios de stackoverflow.com tienden a culpar a la administración por muchos de sus problemas como estos. Cuando les he preguntado a mis amigos de la vida real sobre los "problemas de gestión" que surgen, por lo general me he dado cuenta de que ni siquiera han expresado sus preocupaciones a la dirección, y menos deben embarcarse en una campaña para cambiar los puntos de vista de las personas. En lugar de decir 'la gerencia no ...', trato de pensar en formas en las que puedo ayudar a la gerencia a ver mi punto de vista y convencerlos de que mi posición es correcta. Creo que esto es un problema porque los desarrolladores no son buenos para vender pruebas unitarias.
Brian Stinar
87

1) Es difícil
2) Se necesita tiempo
3) Es muy difícil determinar el valor del código de prueba

El punto 3 es pegajoso. Las buenas pruebas unitarias reducen los errores. Pero también lo hace un buen código de producción. ¿Cómo determina cuántos errores no existen debido a sus pruebas unitarias? No se puede medir lo que no existe. Puede señalar estudios, pero no encajan bien en la hoja de cálculo de su gerente comercial.

Will
fuente
11
"Las buenas pruebas unitarias reducen los errores. Pero también lo hace un buen código de producción". - Las buenas pruebas unitarias permiten mejorar el código de producción. Incluso si el código es malo al principio, pero tiene una buena cobertura de prueba, puede refactorizar el sistema con confianza hasta que el código sea bueno.
Esko Luontola
1
Esko, además de tener una buena cobertura, también debe tener buenas pruebas que realmente prueben algo. Podría tener una cobertura de código del 100% y en realidad probar muy poco
Jacob Adams
¡Excelente respuesta! Ha dicho lo mismo que mi respuesta en muchas menos palabras.
miércoles
2
Sí, las pruebas unitarias llevan tiempo. Pero también lo hace la "corrección de errores aleatorios". El desarrollo adecuado impulsado por pruebas tiene "todas" las características "documentadas" en las pruebas. Si las pruebas son verdes, el producto funciona según lo previsto (excepto por problemas de usabilidad, etc.). Mi experiencia es que el tiempo total de desarrollo casi no se ve afectado en absoluto. Dedica más tiempo a las cosas y las hace bien la primera vez que después del tiempo dedicado a corregir errores.
Arve Systad
Y bastantes de los estudios muestran que las pruebas unitarias tienen un valor negativo. Por lo tanto, mostrar estudios no es muy concluyente y, por lo tanto, debería generar cierta resistencia en la administración hasta que se pueda hacer probable que para la tienda en cuestión el valor sea positivo
Rune FS
70

Es fácil echarle toda la culpa a la "gestión". Pero, ¿la gerencia realmente le está diciendo que específicamente no realice ninguna prueba unitaria?

La administración en general no le dice (y probablemente no debería) cómo hacer su trabajo, ya sea modularización, tipos de datos abstractos, patrones de diseño o pruebas unitarias. Estas son herramientas comerciales que aplica un ingeniero de software competente y exitoso, pero no un ingeniero deficiente.

Creo que la verdadera respuesta a tu pregunta es: las pruebas unitarias son realmente difíciles y los estudiantes de informática no están capacitados para ello.

Es fácil cuando está escribiendo su propia clase de cadena. Cuando está probando un producto de la vida real, se encuentra con desafíos de los que nadie le habló en las diapositivas de PowerPoint:

  • La interacción del usuario. La mitad de su aplicación es la lógica de la interfaz de usuario. ¿Cómo lo prueba de forma automatizada, que no se estropea si mueve un botón?
  • Interacción con API y frameworks externos. Si está escribiendo un controlador de kernel de Windows, ¿cómo lo prueba unitariamente? ¿Escribe stubs para cada IRP y función del kernel que usa, creando efectivamente una simulación del kernel del sistema operativo?
  • Las comunicaciones en red son cosa del siglo XXI. ¿Cómo se coordina una prueba unitaria que consta de varios componentes distribuidos?
  • ¿Cómo eliges buenos casos de prueba? Normalmente veo gente que intenta el enfoque de "hacer cosas al azar en un ciclo de 1000 iteraciones y ver si se rompe". Cuando hace esto, el esfuerzo es mayor que los retornos, se pasan por alto errores importantes y se abandonan las pruebas unitarias.
  • ¿Cómo prueba que se cumplen los requisitos de desempeño?
  • El conocimiento de los patrones en las pruebas es escaso: stubs, respuestas enlatadas, pruebas de regresión son conceptos que la mayoría de la gente no conoce. ¿Cuántos en su lugar de trabajo leen realmente un libro sobre pruebas unitarias?

Lo único por lo que podemos culpar a la administración es que las especificaciones de requisitos rara vez contienen requisitos sobre el nivel de calidad del producto entregado.

La próxima vez que su jefe le pida que haga una estimación de tiempo, incluya el tiempo para escribir una prueba de unidad y vea qué sucede.

Flodin
fuente
2
Buena idea. ¡Pero no mencione el tiempo para crear pruebas unitarias como algo separado del tiempo para crear el código de "producto"!
Jeff Kotula
3
Leer esta respuesta me hizo darme cuenta de que, si bien estoy familiarizado con el concepto y los conceptos básicos de las pruebas unitarias, realmente no sé cómo hacerlo de manera efectiva. ¿Puede recomendarme un buen libro sobre el tema?
Bretón
1
En un controlador de kernel en el que trabajé, refactoricé un montón de código en una biblioteca que vinculé a un arnés de prueba en modo de usuario. Este código en particular era independiente del entorno, por lo que era bastante fácil. No lo he probado, pero los IRP, como los sistemas de archivos y las bases de datos, deberían ser burlables.
George V. Reilly
1
Con Bochs o QEMU es posible escribir una simulación de su dispositivo para que hable con su controlador de kernel.
Zan Lynx
2
@floding, respuesta fascinante. Creo que tendré que leer un libro sobre pruebas unitarias.
Dan Rosenstark
28

La mayoría de las pruebas no prueban nada.
Escribe una función fileopen () y un unittest que falla si el archivo no existe y tiene éxito si el archivo existe. ¡Excelente! ¿Ahora comprobaste si funciona con el nombre de archivo en chino BIG5? en un recurso compartido de NFS? en Vista con el archivo en una llave USB y UAC encendido?

El problema es que las pruebas unitarias las escribe el mismo programador que escribió la función, con el mismo conjunto de supuestos y con el mismo nivel de habilidad. Para que realmente funcionen, las pruebas deben ser escritas por otra persona, solo con las especificaciones publicadas sin que ellos vean el código. - ¡En la mayoría de las empresas, obtener especificaciones escritas sería un gran avance!

Las pruebas unitarias verifican errores en el código de funciones individuales. Pueden trabajar para capas de acceso a datos, bibliotecas matemáticas, etc., donde las entradas / salidas son bien conocidas y la estructura interna es compleja, pero en muchos casos son solo una pérdida de tiempo.
Fallan cuando los errores se deben a interacciones entre diferentes partes del código o con el sistema operativo y el usuario. Problemas como configuraciones de PPP alto / bajo que estropean un cuadro de diálogo o una configuración de idioma extranjero al cambiar un '.' y ',' no suelen encontrarse.

Martin Beckett
fuente
15
Creo que esta respuesta pierde un poco la marca. Las pruebas unitarias y las pruebas funcionales no son, ni deberían ser, lo mismo.
miércoles
4
Un elemento que le falta es que las pruebas unitarias no son una cosa de una sola vez. Si descubro más tarde que necesito corregir un error con fileopen () en un recurso compartido NFS, entonces puedo agregar una prueba a mi conjunto de pruebas para esto. Luego, cuando haga más desarrollo en el futuro, dispongo de pruebas de regresión.
Paul Osborne
2
Muchos errores provienen de interacciones fuera del código en las que los programadores no han pensado y no se pueden encontrar simplemente verificando el código. Un problema común de la interfaz gráfica de usuario son las máquinas con configuraciones de PPP muy altas / bajas; puede probar la función de diálogo todo lo que quiera, pero no detectará esto.
Martin Beckett
5
Sin embargo, esa no es la función de una prueba unitaria, y la interacción entre diferentes partes del código es muy comprobable unitariamente y, de hecho, si esas partes están siendo escritas por equipos separados, la prueba unitaria de su código contra una interfaz compartida y burlarse del componente del otro equipo es buenas practicas.
Steven Evers
1
TDD maneja el problema de las pruebas manipuladas de "el programador que escribió el código también luego escribe las pruebas" haciendo que usted escriba las pruebas antes de escribir el código.
Ophidian
15

Se han realizado estudios sobre el ROI de las pruebas unitarias; consulte esta pregunta .

Dominic Rodger
fuente
15

Encontré muchos desarrolladores que no están interesados ​​en las pruebas unitarias. Siempre parece mucho trabajo con poca recompensa cuando empiezas. Nadie quiere apuntarse a un trabajo extra y por eso se resisten. Una vez que las personas comienzan, por lo general se mantienen con entusiasmo, pero comenzar puede ser difícil.

Steve Rowe
fuente
12

Aparte del problema de la adopción de las pruebas unitarias, las pruebas unitarias no siempre valen la pena, aunque en general creo que lo es, cuando se aplican correctamente. No hay nada especial en las pruebas unitarias que las salve de ser vulnerables a una construcción deficiente.

Las pruebas unitarias tienen costos (creación, mantenimiento y ejecución) y solo valen la pena si brindan mayores beneficios que esos costos. La creación de pruebas es una habilidad como cualquier otra, requiere experiencia y conocimientos específicos para tener éxito. Sin la experiencia suficiente, es muy fácil, incluso para los desarrolladores con experiencia, crear pruebas unitarias de baja calidad, bajo valor y / o alto costo que no valen la pena. Especialmente teniendo en cuenta lo difícil que puede ser juzgar el valor de una prueba unitaria.

Además, las pruebas unitarias son solo una forma de mejorar la calidad del código, pero no es la única. En algunas circunstancias y con algunos equipos, puede que no sea la forma más eficaz de aumentar la calidad del software.

Tenga en cuenta que poner mucho esfuerzo en las pruebas unitarias no es garantía de software de calidad. Y, también, es posible producir software de la más alta calidad sin ninguna prueba unitaria.

3 revoluciones
fuente
Lo que está diciendo es cierto en lenguajes de tipo estático. En lenguajes tipados dinámicamente son absolutamente críticos. Quiero decir que su código está casi garantizado que será una mierda sin las pruebas. Encuentro que esto es una gran parte de por qué algunas personas parecen valorar tanto las pruebas unitarias.
Bill K
11

Bueno, mi empresa no ha optado por TDD o Unit Testing. Para ser honesto, no estamos seguros de cómo hacerlo. Obviamente, podemos hacerlo para funciones estúpidas como CapitalizeString (), etc., pero no sabemos cómo hacerlo para sistemas muy complejos con objetos complicados. Además, la mayoría de las personas entrevistadas no tienen experiencia o tienen experiencia limitada. Parece que Unit Testing es grande entre la multitud SO, pero no particularmente grande en el grupo de trabajo disponible.

TDD es un tema aparte. Nos oponemos moralmente a TDD. No somos programadores vaqueros, pero creemos que atrofia la creatividad y la flexibilidad en un proyecto. Además, tener al codificador que escribió la función de prueba unitaria no tiene sentido. Cuando hago algo, codifico todos los casos extremos que se me ocurren. Lo que necesito es otro cerebro para buscar cosas que podría haber pasado por alto. No tenemos eso. Los equipos son pequeños y autónomos.

En resumen, no creemos en TDD, pero nos gustaría hacer pruebas unitarias. Simplemente no tenemos la experiencia para hacerlo y no podemos encontrarlo fácilmente.

Steve
fuente
Cuando el lugar en el que trabajo tenía suficientes codificadores, hacíamos programación en pareja. Me pareció muy efectivo que uno escribiera pruebas mientras el otro estaba codificado. También llevó a preguntas muy inteligentes sobre el código.
Zan Lynx
4
El punto de TDD, que parece que te falta, es que escribes todos los casos extremos en tu prueba unitaria. Para cada caso, escribe una afirmación en tu prueba unitaria. Luego, si su código real falla en una afirmación, sabrá que su código tiene un error y ha implementado su lógica de manera incorrecta. Dado que las unidades son pequeñas y su afirmación prueba un código específico en la unidad, debería ser fácil identificar dónde está su error lógico. Lo importante es que primero escriba sus afirmaciones. Luego haz que tu código pase. ¿Puede señalar dónde este proceso obstaculiza todo menos el crecimiento de errores?
Christopher Parker
2
Probar una prueba unitaria sin escribir las pruebas primero será muy difícil. Esto se debe a que será difícil introducir el código en un arnés de prueba de forma retrospectiva. Este es uno de los principales beneficios de probar primero: el diseño se puede probar desde el principio porque las pruebas impulsaron el diseño.
Alan Christensen
3
¿Cómo puede ser que "no esté seguro de cómo" realizar la prueba unitaria pero cree que TDD atrofia la creatividad y la flexibilidad?
jcorcoran
1
@Steve 6 años después, sería bueno saber si alguna vez introdujo las pruebas unitarias (o incluso TDD) y si siguió adelante con ellas.
Luke Puplett
11

Hay muchas empresas que realmente no hacen nada de acuerdo con las mejores prácticas. Sin revisiones de código, sin pruebas unitarias, sin planes de prueba, sin nada, solo en el asiento de sus pantalones.

¡Aproveche esto como una oportunidad para que usen una plataforma de Integración Continua y desarrollen pruebas unitarias! Una manera fácil de impresionar a los poderes fácticos y aumentar la calidad y estabilidad de su código al mismo tiempo

Editar: En cuanto a la razón, creo que simplemente no están al tanto de las herramientas actuales que hacen que la IC y las pruebas unitarias sean extraordinariamente fáciles.

arroz Allen
fuente
Normalmente me encuentro en una posición en la que no tengo ninguna influencia sobre decisiones políticas como estas; Soy un senador junior que está siendo revocado por los presidentes de los comités.
jcollum
Se necesitan unos minutos para iniciar Hudson y escribir pruebas unitarias. Si las pruebas unitarias ya están en su lista "TODO", entonces solo está haciendo su trabajo. Los comités a menudo se impresionan con gráficos e imágenes elegantes, así que muéstreles algunos gráficos de tendencias bonitos de Hudson;)
Allen Rice
¡Si! Escuchémoslo por la verdad. A pesar de todo el tiempo que los desarrolladores dedicamos a insistir en las mejores prácticas, no siempre se utiliza en el mundo real. Lástima de verdad.
NeedHack
6

No creo que la pereza sea la causa principal de las pruebas unitarias incorrectas. Para mi empresa, las limitaciones de tiempo y la actitud de "simplemente hágalo" son los mayores impedimentos para realizar pruebas unitarias. Además, los lugares donde nuestros sistemas fallan tienden a ser más en el nivel de integración (servicios, accesos a bases de datos, consultas complejas que requieren datos específicos para las pruebas), no en el "nivel de unidad". Estas cosas son más difíciles de probar, y si apenas tiene tiempo suficiente para realizar la función, probablemente no tendrá tiempo para realizar pruebas útiles al mismo tiempo.

Andy White
fuente
Esto es común. Creo que el argumento es que si crees que alguna vez lo cambiarás en el futuro, deberías tener una prueba que asegure que funciona después de que cambie.
jcollum
6

Las pruebas unitarias deberían ser solo una parte natural del flujo de trabajo de desarrollo de código, al igual que el compilador.

Sin embargo, esto requiere educar a la gerencia sobre los beneficios de las pruebas unitarias. Sin embargo, los desarrolladores junior tienen posibilidades relativamente bajas de tener tal influencia. Por lo tanto, si una empresa propone las pruebas unitarias depende de si tiene un desarrollador o arquitecto senior que defienda las pruebas unitarias.

Creo que esta es la respuesta a su pregunta "qué falta y por qué no hay más empresas que realicen pruebas unitarias" . :-)

Franci Penov
fuente
1
+1 para "debería ser una parte natural del flujo de trabajo de desarrollo de código". Cada desarrollador profesional debería realizar sus propias pruebas unitarias independientemente del proceso oficial. El único argumento legítimo sobre este tema es la definición de unidad .
Dunk
1
@Dunk Si no define "unidad", entonces solo está diciendo que "los desarrolladores profesionales deberían hacer sus propias pruebas".
ChrisW
1
@ChrisW: Sí, los desarrolladores profesionales deberían realizar sus propias pruebas. No hay ninguna razón para que un desarrollador entregue código que no haya probado lo suficiente como para estar seguro de que funciona correctamente. Desafortunadamente, esto parece pedir demasiado a muchos desarrolladores.
Dunk
1
Cuando digo que la definición de una unidad es un argumento legítimo, me refiero a la granularidad de una unidad. Es una clase? ¿Es una colección de clases? ¿Es un componente? Creo que las pruebas unitarias a nivel de clase (con algunas excepciones) cuestan más de lo que benefician y conducen a muchas pruebas sin sentido ...
Dunk
que otros han señalado en este hilo. Mientras que, si uno define una colección de clases que trabajan juntas como una unidad, aún puede realizar pruebas automatizadas y sus pruebas son generalmente más significativas porque pueden enfocarse más en la funcionalidad requerida de mayor nivel.
Dunk
5

Probablemente sea una combinación de un par de cosas que ya mencionaste. Es difícil medir los ahorros de costos de TDD. Si desea subcontratar su TI, puede mostrar cuánto paga por año por las personas que tiene en el personal frente al costo de contratarlo; es muy concreto. ¿Cómo se dice: "Oh, esta prueba detectó un error que me habría llevado 4 horas depurar y corregir ..."?

Ovi Tisler
fuente
¿Cómo diablos puedes adivinar cuánto tardaría un error en depurar y arreglar? En general, la depuración es más aleatoria que eso en mi experiencia: tengo una idea de dónde está el problema o no.
Dominic Rodger
1
Sí, por eso dije que es tan difícil cuantificar los beneficios de las pruebas.
Ovi Tisler
5

La razón por la que algunos lugares no lo usan es simplemente porque se necesita mucho trabajo tanto para comenzar como para continuar. El hecho de que escribir pruebas unitarias lleve tanto tiempo como escribir la funcionalidad real les parece a algunos gerentes como si estuviera reduciendo la productividad de su desarrollador a la mitad.

Además de eso, construyes un equipo (o alguien) necesita poner la infraestructura en su lugar y mantenerla.

Y como dice Alan , muchos lugares simplemente no utilizan las mejores prácticas, solo quieren ver algo tangible.

Michael Burr
fuente
5

Por lo que he visto, muchas empresas tienen bases de código enormes y altamente acopladas que no son prácticamente probables por unidades. Tampoco tienen requisitos comprobables decentes, por lo que las pruebas unitarias se compararían con los requisitos de facto "tal como se construyeron".

Rob K
fuente
5

Creo que el programador tiene que empezar a hacerlo. Algunas pruebas sencillas para empezar son fáciles de justificar como parte del desarrollo.

Algo como una prueba unitaria es casi siempre necesario para obtener una depuración rápida. Simplemente explique cuánto más rápido es iniciar la prueba que organizar la entrada correcta, establecer un punto de interrupción del depurador, iniciar la aplicación, etc.

Documente la prueba en su código. Simplemente escriba un comentario que explique dónde está la prueba y cómo ejecutarla. Los futuros programadores lo verán y esperamos que las pruebas se extiendan.

Zan Lynx
fuente
4

La prueba unitaria es uno de esos términos de caja negra que la mayoría de la gente ha escuchado, pero no sabe qué constituye exactamente una prueba unitaria, por dónde empezar, cómo escribirlos, cómo ejecutar realmente las pruebas, qué es exactamente lo que deberían probar, etc. . etcétera etcétera.

En muchos casos, es más fácil para el desarrollador inseguro simplemente descartarlos como innecesarios o como algo que solo los "desarrolladores de nivel empresarial" necesitan.

Soviut
fuente
4

Soy un gran admirador de las pruebas unitarias y también soy socio de una empresa que realiza proyectos de desarrollo de contratos para varios tipos de clientes. En un mes, tocaremos 3-4 proyectos diferentes de diferentes tamaños.

Si un proyecto parece que va a ser único, no voy a invertir mucho en pruebas unitarias porque esas pruebas unitarias no dan resultado para mi negocio. En ese tipo de proyectos, voy a realizar pruebas unitarias con cosas con las que no estoy seguro / no estoy familiarizado o que podrían cambiar con frecuencia (como un analizador para una fuente de datos que no controlo).

Mientras que si estoy construyendo algo que sé que va a tener una larga vida útil, es un trabajo más grande, con el que trabajaré a través de múltiples iteraciones, o tendrá un gran impacto en mis clientes si ocurre un error. , Voy a invertir en más pruebas unitarias. Una vez más, la prioridad de las pruebas gira en torno al código incierto / desconocido / cambiante.

Creo que las pruebas unitarias deberían girar en torno a la complejidad de una tarea, así como a si van a dar sus frutos. No tiene sentido escribir código adicional que no se vaya a utilizar.

Gavin Miller
fuente
3

En mi experiencia, realmente depende del software que esté escribiendo. Descubrí que es extremadamente difícil escribir pruebas unitarias para una interfaz de usuario. Solo uso pruebas unitarias para partes del sistema que tienen una entrada / salida definida.

Shaun Bowe
fuente
Estoy de acuerdo. Si usa modelo / vista / controlador, tiene mucho sentido hacer una prueba unitaria del modelo y el controlador. La interfaz de usuario casi siempre la prueba mejor un humano.
Zan Lynx
3

Extraño las pruebas unitarias, simplemente hace la vida más fácil.

En realidad, esa no es una razón suficiente para que una empresa adopte las pruebas unitarias.

Una razón suficiente podría ser "más barata" (y / o "mejor"): lo cual no es tan fácil de demostrar sobre las pruebas unitarias.

La única buena razón podría ser "escribir pruebas unitarias es el mejor uso del tiempo de los desarrolladores", lo cual es realmente difícil de probar en mi opinión: y puede ser cierto en algunos lugares, para algún software, con algunos desarrolladores, y no en otros.

Hay muchos desarrolladores que no piensan en el mundo de las pruebas unitarias: incluidos algunos que piensan que otras formas de pruebas (por ejemplo, integración automatizada / pruebas funcionales) pueden ser más baratas y valiosas, por ejemplo, ¿Soy el único desarrollador que no? ¿Te gustan las pruebas unitarias?

ChrisW
fuente
3

Por supuesto, en el mundo ideal, no se puede argumentar en contra de tener una prueba unitaria.

Sin embargo, si escribe una prueba unitaria depende de varias cosas:

  • Cómo se utilizará el software. Si estuviera escribiendo software solo para usted, ¿escribiría pruebas unitarias? Probablemente no. Si estuviera escribiendo software preempaquetado para venderlo comercialmente, probablemente sí.

  • Cuántas personas mantienen el código ... si solo eres tú, entonces es posible que lo conozcas lo suficientemente bien como para estar lo suficientemente seguro después de hacer un cambio de que una ejecución rápida del código es suficiente para garantizar que nada se haya roto. Si otras personas que no escribieron originalmente el código ahora deben mantenerlo, entonces una prueba unitaria les dará la confianza de que cuando actualicen el código para arreglar un problema grande (¡que obviamente no fue capturado en la prueba unitaria!) No han roto nada. .

  • complejidad del código: solo código de prueba que necesita una prueba. Un método de asignación de variable de una línea no necesita pruebas. Un método de 50 líneas con múltiples rutas de ejecución probablemente lo haga.

  • Consideraciones comerciales comerciales prácticas: el hecho es que escribir pruebas unitarias lleva más tiempo que no hacerlo. Si está escribiendo un software prototipo, que tiene un futuro comercial incierto, entonces hay una recompensa entre tener un código rápido, ahora, que funciona suficientemente bien, versus tener un código probado por unidad en 2 semanas que funciona mejor. A veces vale la pena averiguar rápidamente (apetito del consumidor) si el software tendrá un estante corto como y pasar al siguiente proyecto.

y como otros han señalado, una prueba es tan buena como la persona que la escribió.

Joel
fuente
3

La razón principal es que muchos desarrolladores y gerentes de desarrollo no tienen ni idea de que existen pruebas unitarias o de cómo usarlas.

La segunda razón es que las pruebas unitarias solo se pueden usar (de manera sensata) con código que ya cumple con algunos estándares de calidad. Lo más probable es que algún código base existente no pertenezca a esa categoría.

La tercera razón es la pereza y / o la baratura.

Erich Kitzmueller
fuente
3

Porque las pruebas unitarias solo son útiles si escribe código comprobable. Y escribir código comprobable es difícil. Y la gente es perezosa y / o tacaña.

EDITAR: matizado "vago" como "vago y / o barato"; En ocasiones excepcionales, las personas tienen la habilidad, la capacidad y la voluntad de redactar pruebas, pero tienen algo más que hacer que afecta más directamente a los resultados.

phtrivier
fuente
Yo votaría a favor de esto, excepto que no creo que la gente 'sea vaga'. Piense en 'programación', es decir, 'su lenguaje de programación popular y herramientas relacionadas, documentos, capacitación, flujos de trabajo, cosas' nunca fue diseñado de una manera que facilite la escritura de código comprobable. Entonces, para escribir código comprobable, siempre debe hacer un esfuerzo adicional. Sin recompensa 'ya que ya funciona' en ese punto (de modo que escribir pruebas primero, código después, TDD, tiene sentido práctico). Piense que esto es más un sesgo cognitivo que engaña no solo a los programadores actuales, sino que ya engañó a los autores de las herramientas de 'programación' sobre las que ahora se basan los codificadores.
n611x007
1
Sí, claro, a veces la gente es barata / arruinada / tiene mejores cosas que hacer (o, como decimos cortésmente, "tiene que hacer concesiones"). Editado para reflejar eso. (Estaba a punto de agregar en broma que, además, la mayoría del código es inútil, por lo que probarlo también es inútil; pero eso es solo la falta de hablar dormido;))
phtrivier
2

Creo que parte del problema es que los desarrolladores esperan que los empresarios tengan el mismo conjunto de valores y que realmente se preocupen por la respuesta a "¿deberíamos hacer una prueba unitaria o no?". No obtenemos la aprobación de antemano de la empresa para usar un lenguaje de alto nivel en lugar del lenguaje ensamblador; por lo general, es la forma más sensata de hacer el trabajo.

El punto es que somos los únicos calificados para hacer la llamada (lo que no quiere decir que todos tengamos el mismo conocimiento sobre el tema). Además, incluso si su equipo no hace, como política, pruebas unitarias (o nombra-su-método-del-día), por lo general no significa que usted no pueda hacerlo.

La verdad es que realmente no podemos demostrar el ROI en la mayoría de las cosas que hacemos con una granularidad demasiado fina. Por qué las pruebas unitarias se someten a este estándar de prueba irrazonable / atípico está más allá de mí ...

Jeff Kotula
fuente
Sin embargo, es necesario que la administración se involucre, porque tiene que involucrar a sus co-desarrolladores y la mejor manera de que eso suceda es que sea un requisito de arriba hacia abajo.
Juan
2

La gente es perezosa y solo adopta el cambio cuando se ve obligada a hacerlo.

Hunter
fuente
2

Mis 2 centavos:

  • Requiere algo de educación y disciplina, pero los nuevos graduados ya vienen con los conocimientos adecuados.
  • Los gastos generales de las pruebas se pueden reducir con mejores herramientas y esto también está sucediendo (refactorización, etc.)

Entonces, es solo cuestión de tiempo.

Está el debate Martin-Coplien en el que Bob Martin afirma que:

"Hoy en día es irresponsable que un desarrollador envíe una línea de código que no ha ejecutado en una prueba unitaria".

[ http://www.infoq.com/interviews/coplien-martin-tdd]

robi-y
fuente
2
No creo en la existencia de un sistema del mundo real complejo en el que cada línea de código esté cubierta por pruebas unitarias.
quant_dev
2

Si desea vender a todos en las pruebas, haga lo siguiente:

  1. Escribe un montón de pruebas.
  2. Notifique a los otros desarrolladores que cambian el código y fallan en sus pruebas.
  3. Ellos arreglarán su código.
  4. Ahora puede lanzar sin esos errores particulares.

Incluso un gerente podría entender esto.

JeffO
fuente
Las pruebas unitarias no harán que su versión esté libre de errores. Puede reducir el recuento de errores, pero es muy difícil medir el número de errores que no afectaron la producción debido a las pruebas.
Tom
No sé si la administración estaría contenta con que alguien escribiera un montón de pruebas cuando podría estar codificando nuevas funciones. Si no están de acuerdo con TDD, es probable que se meta en problemas al escribir pruebas para cubrir el código que no escribió.
jcollum
@jcollum Como de costumbre, depende de la relación costo / beneficio.
quant_dev
2

Las empresas no están realizando pruebas unitarias por la misma razón por la que muchos sitios web están mal escritos: ignorancia y gente que se apega a los viejos hábitos. En mi empresa, desde que comenzamos las pruebas unitarias (con Nunit y Typemock ), alcanzamos una mayor cobertura de código y lanzamos el software en un tiempo más corto de comercialización.

Steve_0
fuente
2

Como la mayoría de las buenas ideas, la adopción tiene más que ver con la dependencia de la ruta organizativa que con la calidad de la idea.

En la mayoría de las empresas que han enviado productos, se ha creado una importante división de control de calidad con un jefe de control de calidad de alto nivel. Las pruebas son el feudo del equipo de control de calidad.

Es poco probable que el equipo de control de calidad escriba un código de prueba unitario porque la empresa normalmente no proporciona al equipo de control de calidad sus codificadores de alta resistencia.

El equipo de programación es reacio a escribir código de prueba porque crea un conflicto con el equipo de QA.

He observado más interés y adopción de las pruebas unitarias en grupos donde el control de calidad no se ha dividido en una función de trabajo separada.

zmanian
fuente
1

Sencillo: escribir y actualizar pruebas unitarias cuesta dinero. La mayoría de las empresas de software anterior no tienen pruebas unitarias y su escritura costará demasiado. Entonces no lo hacen y agrega tiempo al proceso de desarrollo para que tampoco lo agreguen a nuevas funcionalidades.

David Basarab
fuente
Debería leer los enlaces sobre ROI.
jcollum
1

La mayoría de las empresas son inútiles. No para el que trabajamos tú (o yo), obviamente.

Roger Lipscombe
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
AlexVogel
P: "¿Por qué no hay más empresas que realicen [pruebas unitarias]?" R: "Porque la mayoría de las empresas son inútiles". Suena como una respuesta para mí ...
Roger Lipscombe