Sente l'odore di una domanda a casa.
Is testing in the software field needed?
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 rispetto a bug specifici (almeno non in un ragionevole lasso di tempo), quindi dobbiamo rocce su di esso per vedere se e dove si rompe.
If we create a software with great care, then why should we test?
I test non riguardano solo la ricerca di errori di codifica. Si tratta anche di assicurarsi di aver soddisfatto tutti i requisiti e che il sistema complessivo funzioni come previsto. Se ho il requisito che una transazione fallita debba restituire un codice di errore specifico, allora ho bisogno di scrivere un test per verificare che la funzionalità esista e che funzioni correttamente.
E tutto ciò presuppone che le specifiche e il design siano completi, corretti e coerenti internamente, cosa che spesso non accade. Anche se si soddisfano le specifiche per la lettera e si segue il disegno fino all'ultimo punto e punto e virgola, se la specifica o il design è negativo, allora 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 buggate e devono essere riviste (vedi la storia di guerra di seguito).
After testing can we be sure that we have achieved this goal (the product/software works as intended) because we have done the testing for it? Is it possible?
No, non al 100%. Non possiamo testare ogni combinazione immaginabile di input o percorsi di esecuzione in nessun codice tranne il più semplice. Non possiamo tenere conto di tutti i fattori ambientali. Non possiamo immaginare tutte le possibili modalità di errore.
Possiamo testare fino a un punto in cui siamo ragionevolmente sicuri che non ci siano grossi problemi. Di nuovo, questo è il motivo per cui dobbiamo testare a tutti i livelli. Scrivi una serie di test per assicurarti che il tuo codice gestisca correttamente le condizioni del bordo (input errati, risultati imprevisti, eccezioni, ecc.). Test unitario per verificare che il tuo 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. Fai test di usabilità per assicurarti che tutto funzioni in modo tale che i clienti non vogliano spararti.
Scenario del mondo reale - Stavo lavorando a un sistema di back-end che occasionalmente inviava aggiornamenti a un servizio della GUI per la visualizzazione in una tabella sullo schermo. Durante il progetto, è stato aggiunto un requisito per aggiungere il filtro al display (ad esempio, l'operatore potrebbe scegliere di visualizzare un sottoinsieme delle voci nella tabella). Errore di progettazione n. 1 - il filtro dovrebbe essere stato eseguito dal servizio GUI (ho questa caratteristica antiquaria che le funzioni di gestione del display dovrebbero essere responsabilità del software di gestione display), ma a causa della politica e della mia incapacità di riconoscere i problemi prima che diventino problemi , tale requisito è stato inserito nel servizio back-end. Bene, ok, nessun problema, posso farlo. Modifica lo stato dei filtri, ricevo un messaggio e poi invio un messaggio di creazione o eliminazione per ogni riga nella tabella , perché è così che funziona l'interfaccia (errore di progettazione n. 2 - non c'è modo di inviare aggiornamenti su più righe in un singolo messaggio, non potremmo nemmeno inviare un singolo messaggio "cancella" o "cancella" per cancellare l'intera tabella).
Bene, tutto funziona bene durante lo sviluppo; i test di unità, sistema e integrazione mostrano che invio le informazioni corrette e gestisco correttamente le modifiche del filtro. Poi arriviamo ai test di usabilità, e tutto si riduce difficile , perché il volume dei dati era schiacciante. La latenza di rete tra il mio servizio di back-end e la GUI era dell'ordine di 15-15 secondi. Non male se devi solo inviare aggiornamenti per una decina di righe o giù di lì. Deadly quando devi inviare aggiornamenti per diverse centinaia. Abbiamo iniziato a ricevere segnalazioni di bug che la GUI si stava bloccando dopo aver cambiato lo stato del filtro; beh, no, quello che stava succedendo era che stava assumendo l'ordine di diversi minuti per aggiornare il display perché il protocollo del messaggio di aggiornamento con una sola fila alla volta non poteva gestire uno scenario reale.
Si noti che tutto ciò che avrebbe potuto e dovrebbe essere stato anticipato da tutti, dall'imprenditore principale fino a poco meno di me, se ci fossimo presi la briga di fare anche l'analisi più elementare in anticipo. L'unica difesa che offrirò è che stavamo chiudendo il secondo anno di un progetto di sei mesi che sarebbe stato cancellato quasi immediatamente dopo il parto, e noi eravamo tutti disperati a vedere il retro di esso.
Il che ci porta all'ultima ragione 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 puntare a un record che mostri che almeno i tuoi elementi hanno funzionato come previsto.