Scriviamo test per verificare la correttezza del comportamento di un programma.
Verificare la correttezza del comportamento di un programma ispezionando il contenuto delle dichiarazioni di output usando i propri occhi è un processo manuale o, più specificamente, visivo .
Potresti discuterne
l'ispezione visiva funziona , controllo che il codice faccia quello che deve fare, per questi scenari e una volta che riesco a vedere che è corretto siamo pronti.
Ora, prima di tutto, è fantastico che tu sia interessato a sapere se il codice funziona correttamente. È una buona cosa. Sei davanti alla curva! Purtroppo, ci sono problemi con questo come approccio.
Il primo problema con l'ispezione visiva è che sei un brutto incidente di saldatura lontano dal non poter mai più verificare la correttezza del codice.
Il secondo problema è che la coppia di occhi utilizzata è strettamente accoppiata al cervello del proprietario degli occhi. Se l'autore del codice possiede anche gli occhi utilizzati nel processo di ispezione visiva, il processo di verifica della correttezza dipende dalla conoscenza del programma interiorizzato nel cervello dell'ispettore visivo.
È difficile per un nuovo paio di occhi entrare e verificare la correttezza del codice semplicemente perché non sono associati al cervello del programmatore originale. Il proprietario del secondo paio di occhi dovrà conversare con l'autore originale del codice per comprendere appieno il codice in questione. La conversazione come mezzo per condividere la conoscenza è notoriamente inaffidabile. Un punto controverso se il Coder originale non è disponibile per i nuovi occhi della coppia. In quel caso il nuovo paio di occhi deve leggere il codice originale.
Leggere il codice di altre persone che non è coperto dai test unitari è più difficile della lettura del codice a cui sono associati test unitari. Nella migliore delle ipotesi leggere il codice di altre persone è un lavoro complicato, nella peggiore delle ipotesi questo è il compito più turgido nell'ingegneria del software. C'è una ragione per cui i datori di lavoro, quando pubblicizzano offerte di lavoro, sottolineano che un progetto è greenfield (o nuovo di zecca). Scrivere codice da zero è più semplice che modificare il codice esistente e quindi rendere il lavoro pubblicizzato più attraente per i potenziali dipendenti.
Con i test unitari dividiamo il codice nelle sue parti componenti. Per ogni componente abbiamo quindi stabilito la nostra stalla dichiarando come dovrebbe comportarsi il programma . Ogni unit test racconta una storia di come quella parte del programma dovrebbe agire in uno scenario specifico. Ogni unit test è come una clausola di un contratto che descrive cosa dovrebbe accadere dal punto di vista del codice client.
Ciò significa quindi che un nuovo paio di occhi ha due filoni di documentazione dal vivo e accurata sul codice in questione.
Innanzitutto hanno il codice stesso, l'implementazione, il modo in cui il codice è stato fatto ; in secondo luogo hanno tutte le conoscenze che il programmatore originale ha descritto in una serie di dichiarazioni formali che raccontano la storia di come dovrebbe comportarsi questo codice .
I test unitari catturano e descrivono formalmente le conoscenze possedute dall'autore originale durante l'implementazione della classe. Forniscono una descrizione di come si comporta quella classe quando viene utilizzata da un client.
È corretto mettere in dubbio l'utilità di farlo perché è possibile scrivere test unit che sono inutili, non coprono tutto il codice in questione, diventano obsoleti o obsoleti e così via. Come possiamo garantire che i test unitari non solo imitino ma migliorino il processo di un autore consapevole e coscienzioso che ispeziona visivamente le dichiarazioni di output del loro codice in fase di esecuzione? Scrivi prima il test unitario, quindi scrivi il codice per far passare quel test. Quando hai finito, lascia che i computer eseguano i test, sono veloci, sono bravi a svolgere attività ripetitive e sono ideali per il lavoro.
Garantire la qualità dei test rivedendoli ogni volta che si sfiora il codice che testano ed eseguono i test per ogni build. Se un test ha esito negativo, risolverlo immediatamente.
Automatizziamo il processo di esecuzione dei test in modo che vengano eseguiti ogni volta che realizziamo un progetto. Automatizziamo anche la generazione di rapporti sulla copertura del codice che descrivono in dettaglio quale percentuale di codice è coperta ed esercitata dai test. Ci impegniamo per percentuali elevate. Alcune società impediranno il check-in delle modifiche al codice per il controllo del codice sorgente se non dispongono di test unitari sufficienti scritti per descrivere eventuali cambiamenti nel comportamento del codice. In genere un secondo paio di occhi esaminerà le modifiche al codice insieme all'autore delle modifiche. Il revisore esaminerà le modifiche assicurando che le modifiche siano comprensibili e sufficientemente coperte dai test. Quindi il processo di revisione è manuale, ma quando i test (test di unità e integrazione e, eventualmente, test di accettazione da parte dell'utente) superano questo processo di revisione manuale, diventano parte del processo di compilazione automatica. Questi vengono eseguiti ogni volta che viene registrato un cambiamento. Aintegrazione continua il server esegue questa attività come parte del processo di compilazione.
I test eseguiti automaticamente, mantengono l'integrità del comportamento del codice e aiutano a impedire che future modifiche alla base di codice interrompano il codice .
Infine, la fornitura di test consente di ricodificare in modo aggressivo il codice poiché è possibile rendere sicuri i miglioramenti di codice di grandi dimensioni nella consapevolezza che le modifiche non interrompono i test esistenti.
C'è un avvertimento per Test Driven Development e cioè che devi scrivere codice con un occhio per renderlo testabile. Ciò comporta la codifica di interfacce e l'utilizzo di tecniche come l'iniezione di dipendenza per creare istanze di oggetti collaborativi. Scopri il lavoro di Kent Beck che descrive molto bene TDD. Cerca la codifica per le interfacce e studiamodelli di progettazione