¿Por qué ejecutaría pruebas unitarias en un servidor CI?
Seguramente, para cuando algo se comprometa a dominar, un desarrollador ya ha ejecutado todas las pruebas unitarias antes y ha corregido cualquier error que pueda haber ocurrido con su nuevo código. ¿No es ese el punto de las pruebas unitarias? De lo contrario, acaban de cometer un código roto.
master
siempre debe ser sensato y, preferiblemente, implementarse automáticamente en cada fusión en un entorno de preparación para el control de calidad interno y las pruebas.Respuestas:
O no. Puede haber muchas razones por las cuales esto puede suceder:
Pero el punto real es ejecutar las pruebas en una máquina que no sea la máquina del desarrollador. Uno que está configurado de manera diferente.
Esto ayuda a detectar problemas en los que las pruebas y / o el código dependen de algo específico de un cuadro de desarrollador (configuración, datos, zona horaria, configuración regional, lo que sea).
Otras buenas razones para que las compilaciones de CI ejecuten pruebas:
fuente
Como desarrollador que no ejecuta todas las pruebas de integración y unidad antes de comprometerse con el control de código fuente, ofreceré mi defensa aquí.
Tendría que construir, probar y verificar que una aplicación se ejecute correctamente en:
Agregue el Fortran (con los compiladores Intel y GNU), Python (y sus diversas versiones dependiendo del sistema operativo) y los componentes de script bash / bat y, bueno, creo que puede ver cómo las cosas se disparan.
Entonces son dieciséis máquinas que tendría que tener, solo para ejecutar algunas pruebas un par de veces al día. Sería casi un trabajo de tiempo completo solo administrar la infraestructura para eso. Creo que casi todos estarían de acuerdo en que no es razonable, especialmente multiplicándolo por la cantidad de personas en el proyecto. Entonces dejamos que nuestros servidores CI hagan el trabajo.
Las pruebas unitarias no te impiden cometer código roto, te dicen si saben que has roto algo. La gente puede decir "las pruebas unitarias deben ser rápidas", y continuar con los principios y patrones de diseño y metodologías, pero en realidad a veces es mejor dejar que las computadoras que hemos diseñado para tareas repetitivas y monótonas hagan eso y solo se involucren si dinos que han encontrado algo.
fuente
Aparte de la excelente respuesta de Oded:
Una vez trabajé en una empresa que tenía muchos errores en la implementación debido al proceso de fusión e implementación. Esto fue causado por un extraño marco propietario que dificultó las pruebas y el CI. No fue una experiencia feliz encontrar que el código que funcionó perfectamente en el desarrollo no llegó directamente a la producción.
fuente
Uno pensaría que no, pero los desarrolladores son humanos y a veces se olvidan.
Además, los desarrolladores a menudo no pueden extraer el último código. Sus últimas pruebas podrían funcionar bien, luego, en el momento del check-in, alguien más comete un cambio importante.
Sus pruebas también pueden depender de un recurso local (sin marcar). Algo que las pruebas de tu unidad local no detectarían.
Si cree que todo lo anterior es fantástico, hay un nivel por encima de CI (al menos en TFS) llamado Gated donde las construcciones que tienen pruebas fallidas se archivan y no se comprometen con la base del código.
fuente
Normalmente configuro mi CI para que se ejecute en cada confirmación. Las ramas no se fusionan en master hasta que la rama ha sido probada. Si confía en ejecutar pruebas en el maestro, eso abre una ventana para que se rompa la compilación.
La ejecución de las pruebas en una máquina CI tiene que ver con resultados reproducibles. Debido a que el servidor CI tiene un entorno limpio conocido extraído de su VCS, sabe que los resultados de la prueba son correctos. Cuando se ejecuta localmente, puede olvidar confirmar el código necesario para que lo aprueben, o tener un código no confirmado que los haga pasar cuando deberían fallar.
También puede ahorrar tiempo a los desarrolladores al ejecutar diferentes suites en paralelo, especialmente si algunas son pruebas lentas de varios minutos que probablemente no se ejecutarán localmente después de cada cambio.
En mi trabajo actual, nuestra implementación de producción está cerrada cuando CI pasa todas las pruebas. Los scripts de implementación evitarán la implementación a menos que estén pasando. Esto hace que sea imposible olvidar accidentalmente ejecutarlos.
El hecho de que CI sea parte del flujo de trabajo también quita la carga de los desarrolladores. Como desarrollador, ¿usualmente ejecuta un linter, un analizador estático, una prueba unitaria, una cobertura de código y una prueba de integración para cada cambio? CI puede, de forma completamente automática y sin necesidad de pensarlo, reduciendo la fatiga de la decisión.
fuente
Para cuando algo se compromete a dominar, un desarrollador ya debería haber ejecutado todas las pruebas unitarias ... pero ¿y si no lo han hecho? Si no ejecuta las pruebas unitarias en el servidor CI, no lo sabrá hasta que otra persona extraiga los cambios en su máquina y descubra que las pruebas simplemente se rompieron en ellos.
Además, el desarrollador puede haber cometido un error y hacer referencia a un recurso local específico para su máquina. Cuando registran el código y falla la ejecución de CI, el problema se identifica de inmediato y se puede corregir.
fuente
Suponiendo (al contrario de otras respuestas) que los desarrolladores son bastante disciplinados y ejecutan pruebas unitarias antes de comprometerse, puede haber varias razones:
fuente
Es posible imaginar casos en los que el cambio A no interrumpe la prueba y el cambio B no interrumpe la prueba, pero A y B juntos lo hacen. Si A y B están hechos por diferentes desarrolladores, solo el servidor CI detectará el nuevo error. A y B pueden ser incluso dos partes de la misma oración más larga.
Imagine un tren conducido por las dos locomotoras A y B. Quizás uno sea más que suficiente y esta sea la solución para aplicar. Sin embargo, si se aplican las dos "soluciones" eliminando ambas, el tren no se moverá.
Además, no todos los desarrolladores ejecutan todas las pruebas de Unidad, mientras que la mayoría de los buenos desarrolladores lo hacen.
fuente
Hagamos una pregunta equivalente:
Hay varias razones para hacer CI, pero el punto principal de CI es tener una idea de cuál es el estado del código con el tiempo. El principal beneficio (de varios) que proporciona esto es que podemos averiguar cuándo se rompe la compilación, averiguar qué lo rompió y luego solucionarlo.
Si el código nunca se rompe, ¿por qué usamos CI? Para entregar compilaciones para pruebas, las compilaciones nocturnas serían lo suficientemente buenas.
fuente