Haz que sea imposible liberar algo sin arreglar las pruebas.
- Fallar la compilación si alguna prueba falla.
- Fallar la compilación si se ignora alguna prueba.
- Falla la compilación si la cobertura de la prueba cae por debajo de un cierto nivel (por lo que las personas no pueden simplemente eliminar las pruebas para evitarlo).
- Use el servidor CI para realizar sus compilaciones de lanzamiento y solo permita que las compilaciones de la caída de compilación del servidor se promocionen a UAT / staging / production / lo que sea.
El hecho es que, si su compilación se rompe durante más de 15 minutos a la vez (y eso incluye pruebas fallidas), entonces no está haciendo una integración continua .
La "opción nuclear" es hacer que su servidor de control de origen rechace las confirmaciones / registros de cualquier usuario que no sea el que rompió la compilación. Obviamente, un administrador debe poder anular esto temporalmente si dicha persona se va de vacaciones, pero si todos saben que todo el equipo está jodido hasta que arreglen sus pruebas, lo resolverán muy rápido.
Una buena política (que es aún mejor cuando está automatizada) es revertir la fuente a la última confirmación estable conocida después de 15 minutos de la falla de compilación. En otras palabras, si no puede solucionarlo, o no sabe qué causó la ruptura de la compilación o la prueba, revísela y trabaje localmente hasta que se resuelva; nunca haga que otros desarrolladores muevan sus pulgares mientras usted trabaja problema que no les importa.
PD Si ya tiene muchas pruebas fallidas, puede usar un "umbral final" en CI. Configúrelo para que la compilación solo falle si hay más fallas de prueba que la última vez. Esto, junto con una regla de cobertura, obligará a los desarrolladores a mejorar eventualmente la situación de prueba si quieren seguir trabajando.
PPS Me doy cuenta de que esto puede parecer draconiano para algunos, pero todo depende de tu cultura. Si llega a un punto en el que la gente simplemente no deja la construcción rota o las pruebas fallan (mi equipo casi nunca lo hace, aunque ocasionalmente tengo que recordarles), entonces no necesita continuar con el conjunto más estricto de reglas. Aunque IMO siempre debe fallar la compilación en una prueba de unidad rota. Las pruebas de integración / navegador a veces pueden fallar.