Stavo parlando con alcuni colleghi della build dell'applicazione e abbiamo alcune divergenze su ciò che ognuno considera una buona pratica o qualcosa di cui preoccuparsi.
Ho appreso che una buona applicazione build è autosufficiente , indipendentemente da quante dipendenze e test abbia, la build si prenderà cura di loro ed eseguirà la costruzione liscia.
Ad esempio, se ho un'applicazione che usa Maven, mi aspetto che un mvn clean install
funzioni con i requisiti minimi: Java, lavorando su Internet e maven installato (se usi mvnw
nel progetto, anche maven installato è facoltativo).
In questo scenario, non importa se la build esegue l'unità oi test di integrazione con MongoDB, Oauth2, RabbitMQ ... è il lavoro del programmatore simulare / stub queste dipendenze per i test eseguiti e la compilazione essere indipendente da servizi / database esterni / code / etc in esecuzione.
Per essere più chiari, quando parlo di test di integrazione , sto parlando di quelli "stretti": link , che in genere viene eseguito con il plug-in Maven failsafe nel mondo Java.
Ma alcuni colleghi non vedono alcun problema se una build dell'applicazione dipende da un MongoDB, un server Oauth2, RabbitMQ ed ecc avviati sul computer degli sviluppatori solo per la build. Anche usando la finestra mobile per aiutare, per me questo è l'approccio sbagliato, perché:
- La compilazione è più lenta.
- Aggiungi complessità nel processo di generazione.
- Hai bisogno di una Wiki / guida solo per spiegare come funziona la build.
- Consuma più memoria, perché le dipendenze esterne non vengono prese in giro.
- Devi "resettare" la dipendenza esterna da ogni build.
Quando parliamo dei test di sistema (o dei test di integrazione "ampi" ), sì, abbiamo bisogno di tutti queste dipendenze esterne sono attive e in esecuzione, ma questo tipo di test non si verifica durante la compilazione.
Penso che la resistenza a creare una build autosufficiente derivi dalla complessità per gestire queste dipendenze dai test di integrazione. Anche usando Spring, non è facile bypassare un'autenticazione RabbitMQ e Oauth2, per esempio.
Sebbene sia chiaro per me qual è l'approccio giusto, non riesco a trovare alcuna discussione su Internet su questo argomento. Cosa ne pensate?