Odora di una domanda a casa.
Sono necessari test nel campo del software?
Sì. Assolutamente. A tutti i livelli. Al di fuori di alcuni domini specializzati, non siamo ancora in una fase in cui possiamo dimostrare matematicamente che il nostro codice è corretto contro bug specifici (almeno non in un lasso di tempo ragionevole), quindi dobbiamo lanciarci contro per vedere se e dove si rompe.
Se creiamo un software con grande cura, perché dovremmo testarlo?
Il test non riguarda solo la ricerca di errori di codifica. Si tratta anche di assicurarsi di aver soddisfatto tutti i requisiti e che l'intero sistema funzioni come previsto. Se ho la necessità che una transazione fallita debba restituire un codice di errore specifico, allora devo scrivere un test per verificare sia l' esistenza della funzionalità sia il corretto funzionamento.
E tutto ciò presuppone che le specifiche e il design siano completi, corretti e coerenti internamente, il che spesso non è il caso. Anche se soddisfi le specifiche alla lettera e segui il disegno fino all'ultimo punto e punto e virgola, se la specifica o il disegno sono sbagliati, ci saranno problemi al momento dell'integrazione. Spesso, i test di sistema o di integrazione si verificano quando si scopre che le specifiche stesse sono errate e devono essere riviste (vedere la storia di guerra di seguito).
Dopo i test possiamo essere sicuri di aver raggiunto questo obiettivo (il prodotto / software funziona come previsto) perché abbiamo fatto i test per questo? È possibile?
No, non al 100%. Non possiamo testare ogni possibile combinazione di input o percorsi di esecuzione in nessun altro che nel codice più semplice. Non possiamo tenere conto di tutti i fattori ambientali. Non possiamo immaginare tutte le possibili modalità di fallimento.
Possiamo testare al punto in cui siamo ragionevolmente sicuri che non ci siano grossi problemi. Ancora una volta, è per questo che dobbiamo testare a tutti i livelli. Scrivi una serie di test per assicurarti che il codice gestisca correttamente le condizioni dei bordi (input errato, risultati imprevisti, eccezioni, ecc.). Unit test per verificare che il codice soddisfi i suoi requisiti. Test di sistema per verificare l'elaborazione end-to-end. Test di integrazione per verificare che tutti i componenti si parlino correttamente. Esegui test di usabilità per assicurarti che tutto funzioni in modo tale che i clienti non vogliano spararti.
Scenario del mondo reale: stavo lavorando su un sistema di back-end che occasionalmente inviava aggiornamenti a un servizio GUI per la visualizzazione in una tabella sullo schermo. Durante il progetto, è stato aggiunto un requisito per aggiungere filtri al display (ad esempio, l'operatore può scegliere di visualizzare un sottoinsieme delle voci nella tabella). Errore di progettazione n. 1: il filtro avrebbe dovuto essere filtrato dal servizio della GUI (ho questa idea antica e antiquata secondo cui le funzioni di gestione dello schermo dovrebbero essere responsabilità del software di gestione dello schermo), ma a causa della politica e della mia incapacità di riconoscere i problemi prima che diventino problemi , tale requisito è stato posto sul servizio back-end. Bene, ok, nessun problema, posso farlo. Lo stato del filtro cambia, ricevo un messaggio e quindi invio un messaggio di creazione o eliminazione perogni riga nella tabella , perché è così che funziona l'interfaccia (errore di progettazione n. 2: non è possibile inviare aggiornamenti a più righe in un singolo messaggio; non è nemmeno possibile inviare un singolo messaggio "cancella" o "elimina" per cancellare l'intero tavolo).
Bene, tutto funziona bene durante lo sviluppo; test di unità, sistema e integrazione dimostrano che invio le informazioni giuste e gestisco correttamente le modifiche al filtro. Quindi arriviamo ai test di usabilità e tutto cade a fatica , perché il volume di dati è stato travolgente. La latenza di rete tra il mio servizio di back-end e la GUI è stata dell'ordine da .15 a .25 secondi. Non male se devi solo inviare aggiornamenti per una dozzina di righe o giù di lì. Mortale quando devi inviare aggiornamenti per diverse centinaia. Abbiamo iniziato a ricevere segnalazioni di bug secondo cui la GUI si stava bloccando dopo aver modificato lo stato del filtro; beh, no, quello che stava succedendo era che stava prendendo nell'ordine di diversi minuti per aggiornare il display perché il protocollo di aggiornamento testa a fila una volta alla volta non poteva gestire uno scenario del mondo reale.
Si noti che tutto questo potrebbe avere e dovrebbe sono stati anticipati da tutti, dal prime contractor tutta la strada fino al piccolo vecchio me se avessimo preso la briga di fare anche l'analisi più semplice in anticipo. L'unica difesa che offrirò è che stavamo chiudendo il secondo anno di un progetto di sei mesi che sarebbe stato spazzato via quasi immediatamente dopo la consegna, ed eravamo tutti disperati nel vedere il retro di esso.
Il che ci porta all'ultimo motivo per testare - CYA. I progetti del mondo reale falliscono per una serie di motivi, molti dei quali politici, e non tutti agiscono in buona fede quando le cose vanno male. Le dita vengono puntate, le accuse vengono fatte e alla fine della giornata devi essere in grado di indicare un record che mostra che almeno le tue cose hanno funzionato come previsto.
If we create a software with care in during its development period then why should we go for Test?
- perché in ogni caso, anche il programmatore più abile commette errori.