Per me esiste un criterio semplice per decidere se sono necessari test automatici:
Hai intenzione di evolvere e mantenere il progetto? "Sì": dovresti scrivere test.
Ci sono alcuni casi in cui puoi andare senza test, principalmente è "fai una volta e dimentica" il tipo di lavoro, come il piccolo sito web, l'installazione CMS, ecc.
Tutto ciò che fai in fretta, verifica se funziona e dimenticalo.
Per qualsiasi cosa siano necessari test più complessi. E non ci sono svantaggi:
Increased initial development time
Questo è un errore molto comune. I test riducono i tempi di sviluppo in qualsiasi fase di sviluppo.
Se non scrivi test il processo di sviluppo è il seguente:
- Scrivi un nuovo codice, spesso toccando anche un vecchio codice
- Verifica manualmente se funziona
- Indovina cos'altro può essere rotto dalle tue modifiche, ricontrollalo anche
- Se sei fortunato, puoi trovare qualcosa che ha funzionato prima, ma ora è rotto (regressioni)
- Vai a risolverlo
- Ripeti il processo di test / correzione
Oltre al tuo obiettivo principale (scrivere il nuovo codice), devi fare un sacco di lavoro noioso e ripetitivo.
La quantità di questo lavoro cresce molto rapidamente man mano che il progetto si evolve.
Ciò che è ancora peggio è che devi fare questo noioso lavoro ripetitivo e non puoi ancora garantire che non hai infranto nulla che funzionasse prima.
Non puoi garantire di aver ben testato tutti i casi per il nuovo codice.
Bug e regressioni andranno in produzione. Per l'utente è davvero fastidioso vedere gli aggiornamenti quando le nuove funzionalità non funzionano come previsto e le vecchie funzionalità non funzionano.
E questi bug mangeranno ancora più tempo - utenti, supporto, manager e sviluppatori, tutti passeranno il tempo a cercare e correggere questi bug.
Confronta questo con lo scenario in cui esegui test e aggiungi test per qualsiasi bug che risolvi:
- Scrivi un nuovo codice, spesso toccando anche un vecchio codice
- Aggiungi test per il nuovo codice
- Esegui la suite di test
- Correggi errori
- Ripeti fino a quando non passa
Il test / ciclo di correzione con test automatici sarà molto più rapido rispetto al test manuale e testerà di nuovo tutto ciò che funzionava prima. Non puoi nemmeno sognarlo con un test manuale.
L'unico passaggio aggiuntivo è add tests for the new code
. Ci vorrà molto meno tempo di tutti gli sforzi e i problemi aggiuntivi che hai con i test manuali.
Inoltre non è noioso né ripetitivo - questo è qualcosa che i programmatori dovrebbero fare e possono fare - scrivere il codice.
Sì, non puoi ancora garantire che non ci siano errori.
Ma sei sicuro che tutte le funzionalità esistenti funzionino e che funzioni anche la nuova funzione (almeno in quei casi per cui hai aggiunto nuovi test).
Increased lines of code per requirement (test code + implementation)
Forse, ma le linee di codice non significano nulla quando sappiamo che i test salvano il tempo di sviluppo.
Ad esempio, devi implementare un calendario popup sul tuo sito web:
- Programmatore A si occupa di linee di codice e scrive il calendario in puro JS in 3000 righe di codice e ci vogliono due settimane
- Il programmatore B è incauto, ottiene jquery + jquery ui + qualche plugin e aggiunge 50000 righe di codice, ci vogliono 3 ore
Che cosa preferisci?
The patterns required for certain features to be testable is, in some cases, said to drastically increase complexity / lines of actual implementation code required per feature
Ancora, questo è un errore.
Gli stessi schemi richiesti per i test migliorano anche la struttura del codice. Il test ti fa dividere il codice in unità piccole, riutilizzabili e testabili indipendentemente ed è solo una vittoria per la struttura generale del codice.
Increased developer skills requirement
Non esattamente vero. Anche se hai sviluppatori principianti che devono scrivere test unitari, dovranno anche imparare come organizzare il loro codice in modi migliori e miglioreranno come programmatori.
Se non è necessario scrivere test, verrà implementato un intero progetto come un disastro solido, che andrà a pezzi molto rapidamente.
L'aggiunta di una nuova funzione genererà 10 nuovi bug e ad un certo punto non sarà possibile aggiungere nuove funzionalità.
Increased tooling
Non sono sicuro di aver capito questo punto.
Vuoi dire che dovrai usare un server di Continuous Integration? Questa è una buona cosa. Ti aiuterà ad abbreviare il ciclo di "sviluppo-rilascio" e non avrai paura di dare agli utenti la nuova versione.
Intendi un'infrastruttura per scrivere ed eseguire test? Ci sono molte opzioni disponibili per ogni linguaggio di programmazione.
Riguardo ai limiti generali dei test unitari che hai menzionato: questi sono reali e ti consigliamo di risolverli una volta che inizi a scrivere test.
Ma non è questo il motivo per cui non ci sono test.
Scrivi test dove è possibile, prova manualmente il resto e troverai rapidamente alcuni modi per aggiungere test anche per il resto, solo per evitare questo noioso compito.