Perché Cem Kaner considera un test che non rivela un bug una perdita di tempo?


15

Che dire di confermare la funzionalità in test positivi, dimostrando che funziona - dovrei dire che è una perdita di tempo? Che tipo di concetto c'è dietro questa citazione?

Test falliti, ovvero test che non rilevano errori sono una perdita di tempo.

Web Engineering: la disciplina dello sviluppo sistematico di applicazioni Web che cita Cem Kaner .


2
Non proprio. Kaner afferma che, in generale, i test dovrebbero trovare solo difetti.
Giovanni V,

4
È una posizione molto accademica. Il signor Kaner e il signor Schrödinger hanno bisogno di sedersi per una tazza di caffè qualche volta.
Blrfl

2
L'unico problema di @Blrfl è che il signor Schrödinger è morto. Oh, aspetta ... um ...
ikmac il

1
Quell'affermazione senza contesto sembra follemente folle ...
Rig

1
"Confermare la funzionalità nei test positivi" - Questo è fondamentalmente impossibile. Non puoi provare qualcosa di corretto, puoi solo dimostrarlo sbagliato.
Konrad Rudolph,

Risposte:


37

Ho scritto la maggior parte dei test di software per computer oltre 25 anni fa. Da allora ho indicato diverse parti del libro che considero obsolete o semplicemente sbagliate. Vedi http://www.kaner.com/pdfs/TheOngoingRevolution.pdf

Puoi vedere di più (visualizzazioni attuali, ma senza riferimenti espliciti a TCS) sul mio sito per il corso di test del software Black Box (video e diapositive disponibili gratuitamente), www.testingeducation.org/BBST

La cultura dei test allora era ampiamente confermativa.

Nei test moderni, l'approccio al test unitario è ampiamente confermato: scriviamo grandi raccolte di test automatizzati che verificano semplicemente che il software continui a funzionare come previsto. I test servono come rilevatori di cambiamenti: se qualcosa in altre parti del codice e questa parte ora presenta problemi, o se i valori di dati che erano impossibili nel mondo reale stanno raggiungendo l'applicazione, allora i rivelatori di cambiamento si attivano, avvisando il programmatore di un problema di manutenzione.

Penso che la mentalità di conferma sia appropriata per i test unitari, ma immagino un mondo in cui tutti i test di sistema fossero confermativi (per le persone che fanno una distinzione, si prega di interpretare "test di integrazione del sistema" e "test di accettazione" come incluso nei miei commenti sul sistema test.) Il punto di test era confermare che il programma soddisfaceva le sue specifiche e l'approccio dominante era quello di costruire un milione di test di regressione a livello di sistema (o almeno qualche centinaio) che mappassero parti delle specifiche ai comportamenti del programma. (Penso che la conferma da specifica al comportamento sia utile, ma penso che sia una piccola parte di un obiettivo più ampio.)

Esistono ancora gruppi di test che funzionano in questo modo, ma non è più la visione dominante. Allora, lo era. Ho scritto con enfasi e ho tracciato contrasti netti per evidenziare le persone che erano costantemente addestrate in questa mentalità. Oggi, alcuni dei forti contrasti (incluso quello citato qui) sono obsoleti. Vengono interpretati erroneamente come attacchi a visioni errate.

A mio avviso, il test del software è un processo empirico per l'apprendimento delle informazioni relative alla qualità di un prodotto o servizio software.

Un test dovrebbe essere progettato per rivelare informazioni utili.

All'epoca, a proposito, nessuno parlava dei test come metodo per rivelare "informazioni". All'epoca, il test era per (alcune versioni di ...) trovare bug o per (alcune versioni di ...) verificare (verificare) il programma rispetto alle specifiche. Non credo che l'affermazione secondo cui i test servono a rivelare informazioni utili sia entrata nel vocabolario dei test fino a questo secolo.

Immagina test di valutazione in termini di valore delle informazioni. Un test che molto probabilmente ci insegnerà qualcosa che non conosciamo sul software avrebbe un valore informativo molto elevato. Un test che molto probabilmente confermerà qualcosa che già ci aspettiamo e che è già stato dimostrato molte volte in precedenza, avrebbe un basso valore informativo. Un modo per dare priorità ai test è quello di eseguire test con valori di informazioni più alti prima di test con valori di informazioni più bassi.

Se dovessi semplificare eccessivamente questa prioritizzazione in modo da attirare l'attenzione di un programmatore, project manager o responsabile di processo che non ha idea dei test del software, direi "UNA PROVA CHE NON È PROGETTATA PER RIVELARE UN ERRORE È UN RIFIUTO DEL TEMPO ". Non è una traduzione perfetta, ma per i lettori che non possono o non capiscono alcuna sottigliezza o qualifica, è il più vicino possibile.

Allora, e lo vedo di nuovo qui, alcune persone che non capiscono i test risponderebbero che un test progettato per trovare casi angolari è una perdita di tempo rispetto a un test di un uso importante di una funzione principale. Non capiscono due cose. In primo luogo, quando i tester del tempo trovano il tempo per controllare i valori limite, gli usi principali delle funzioni principali sono già stati esercitati più volte. (Sì, ci sono eccezioni e la maggior parte dei gruppi di test presterà particolare attenzione a tali eccezioni.) In secondo luogo, il motivo per testare con valori estremi è che il programma ha maggiori probabilità di fallire con valori estremi. Se non fallisce all'estremo, prova qualcos'altro. Questa è una regola efficiente. D'altra parte, se fallisce a un valore estremo, il tester potrebbe arrestarsi e segnalare un bug o il tester potrebbe risolvere ulteriormente, per vedere se il programma fallisce allo stesso modo con valori più normali. Chi esegue la risoluzione dei problemi (tester o programmatore) è una questione di cultura aziendale. Alcune aziende prevedono un budget per il tempo del tester, alcune programmano i programmatori e alcune si aspettano che i programmatori correggano i bug del caso angolare se sono generalizzabili o meno in modo che la risoluzione dei problemi non sia rilevante. Il malinteso comune - che i tester stanno perdendo tempo (piuttosto che massimizzare l'efficienza) testando valori estremi è un'altra ragione per cui "Un test che non è progettato per rivelare un bug è una perdita di tempo" è un messaggio appropriato per i tester. È un contrappunto all'incoraggiamento di alcuni programmatori a (in effetti) non eseguire mai test che potrebbero sfidare il programma. Il messaggio è semplificato, ma l'intera discussione è semplificata.

A proposito, il "valore informativo" non può essere l'unico sistema di definizione delle priorità. Non è mia regola progettare suite di test unitari. Non è la mia regola quando progetto test di verifica della costruzione (ovvero controlli di integrità). In entrambi i casi, sono più interessato ai tipi di copertura che alla potenza dei singoli test. Esistono altri casi (ad esempio test automatizzati ad alto volume che sono economici da installare, eseguire e monitorare) in cui la potenza dei singoli test è semplicemente irrilevante per il mio progetto. Sono sicuro che puoi pensare ad altri esempi.

Ma come regola generale, se potessi dichiarare solo una regola (ad esempio parlare con un dirigente la cui testa esplode se tenta di elaborare più di una frase), sarebbe che un test a basso valore di informazione di solito è una perdita di tempo.


4
+1 per aver dedicato del tempo a rispondere a una domanda di cui sei la fonte autorevole, oltre a convalidare il mio uso del termine "Costruisci test di verifica" per cui così tante persone mi guardano divertente per l'utilizzo ... Sempre bello vedere le persone della tua statura impiegando tempo per aiutare le persone qui intorno
Jimmy Hoffa,

1
Eric G: Penso che se rileggi che vedrai Cem affermare che, come parte dei lettori, capire che la sua visione sull'argomento si è evoluta nel tempo. Oppure puoi semplicemente continuare e ignorare la sottigliezza e le qualifiche, per parafrasare Cem. (e prendo "qualifiche" non come sue credenziali, ma come eccezioni.)
Jim Holmes,

La tua citazione mi ricorda qualcosa che ho osservato sulla scienza: non si può provare (o addirittura sostenere in modo significativo) una teoria scientifica conducendo esperimenti che ci si aspetta che producano risultati coerenti con la teoria; il modo di sostenere una teoria è fare uno sforzo in buona fede per sperimentare dispositivi che non la supportano, ma non essere in grado di farlo.
supercat

@supercat puoi supportare una teoria con un test per qualcosa di coerente con la teoria se il test non ti si sarebbe verificato prima della teoria (es. mostrare l'accelerazione di un oggetto che cade nel vuoto è come se lo calcolassi dice più che mostrare che cade). I test sui casi limite sono analoghi; Potrei aspettarmi che il software si comporti correttamente quando ha a che fare con valori estremi, ma dà più fiducia nella qualità nel vedere ciò che accade che nel ripetere i valori di input che probabilmente ha visto durante lo sviluppo, oltre ad avere maggiori probabilità di trovare un bug.
Jon Hanna,

@JonHanna: il mio fraseggio era scarso: il problema non è l'attesa, ma lo sforzo. Non si può provare una teoria cercando di trovare i test che supererà; bisogna fare uno sforzo in buona fede per trovare prove che fallirebbero se non valide.
Supercat

11

L'idea è, secondo Kaner, "dal momento che si esaurisce il tempo prima che si esauriscano i casi di test, è essenziale utilizzare il tempo disponibile nel modo più efficiente possibile".

Il concetto dietro la citazione di cui si chiede è presentato e spiegato in dettaglio nell'articolo Testing Computer Software di Cem Kaner , Jack Falk, Hung Quoc Nguyen, nel capitolo "GLI OBIETTIVI EI LIMITI DEL TEST":

Quindi, perché test?

Non riesci a trovare tutti i bug. Non puoi provare il programma corretto e non vuoi farlo. È costoso, frustrante e non ti fa vincere concorsi di popolarità. Quindi, perché preoccuparsi dei test?

LO SCOPO DI TESTARE UN PROGRAMMA È TROVARE PROBLEMI

Trovare problemi è il cuore del tuo lavoro. Dovresti trovare il maggior numero possibile; più grave è il problema, meglio è.

Dal momento che si esaurisce il tempo prima di esaurire i casi di test, è essenziale utilizzare il tempo disponibile nel modo più efficiente possibile. I capitoli 7,8,12 e 13 considerano le priorità in dettaglio. Il principio guida può essere semplicemente:


Un test che rivela un problema è un successo. Un test che non ha rivelato un problema era una perdita di tempo.


Considera la seguente analogia, da Myers (1979). Supponi che qualcosa non vada in te. Vai da un dottore. Dovrebbe eseguire dei test, scoprire cosa c'è che non va e raccomandare azioni correttive. Esegue test dopo test dopo test. Alla fine, non riesce a trovare nulla di sbagliato. È un grande tester o un diagnostico incompetente? Se sei davvero malato, è incompetente e tutti quei test costosi erano una perdita di tempo, denaro e fatica. Nel software, sei il diagnostico. Il programma è il paziente (sicuramente) malato ...


Vedete, il punto di cui sopra è che dovreste dare la priorità ai test saggiamente. I test dovrebbero richiedere un tempo limitato ed è impossibile testare tutto nel tempo indicato.

Immagina di aver passato un giorno (settimana, mese) a eseguire test, a non trovare bug e a lasciar passare alcuni bug perché non hai avuto il tempo di eseguire un test che lo rivelasse. Se ciò accade, non puoi semplicemente dire "non è colpa mia perché ero impegnato a eseguire altri test" per giustificare questa mancanza - se lo dici, sarai comunque ritenuto responsabile.

Hai perso tempo a eseguire test che non hanno rivelato bug e per questo motivo hai perso un test che avrebbe trovato un bug.

(Nel caso in cui ti chiedi, le mancate come sopra sono generalmente inevitabili, non importa come ci provi, e ci sono modi per gestirle, ma sarebbe più un argomento per una domanda separata ... e probabilmente una soluzione migliore per SQA. SE.)


12
Questa risposta rappresenta correttamente la sua posizione, ma vale la pena sottolineare che molte persone pensano che la sua posizione sia sbagliata. Data la scelta tra un test che dimostra la funzione più importante nell'app funziona correttamente (test di accettazione, se lo desideri) e un test che trova un bug insignificante (allineamento di un pixel) in un angolo dell'app raramente utilizzato, I sapere quale sceglierei nel mio tempo limitato. E per l'analogia del medico: se sto andando PER UN CONTROLLO piuttosto che in risposta ai sintomi, confermare il cuore è buono, i polmoni sono buoni ecc. Ecc. È un buon risultato. Quindi lì.
Kate Gregory,

@KateGregory Sono d'accordo, penso lo stesso. Personalmente trovo la sua opinione sbagliata, testiamo principalmente per raccogliere informazioni ..
Giovanni V

2
@KateGregory è d'accordo - non credo sia corretto etichettare qualsiasi test superato come rifiuto totale. Tuttavia, penso che un punto che sottolinea sia senza tempo : se il bug scivola attraverso i test di rilascio, il QA avrebbe bisogno di qualcosa di più di "oh ma eravamo impegnati a eseguire altri test" per coprirgli la schiena. Ho passato questo test come me stesso in passato, e vedo questo in giro ora che sono uno sviluppatore, e non penso che svanirà mai
moscerino

4

Beh, non conosco il signor Caner, ma l'IMHO

test che non trovano potenzialmente errori

sono una perdita di tempo. Ciò include la situazione in cui hai già alcuni test (non importa se sono automatici o solo in una lista di controllo) e aggiungi nuovi test che convalidano essenzialmente gli stessi casi che hai già. Quindi i tuoi nuovi test non troveranno più errori di quelli esistenti.

Una situazione del genere può accadere, ad esempio, se si passa attraverso un elenco casuale - potrei dire anche "senza cervello" (perdonami quella parola) - hai scelto casi di test nel tuo programma, senza pensare se controllano un nuovo caso limite, una nuova equivalenza classi dei dati di input o se aumentano la copertura del codice in relazione ai test già scritti.


-1

Secondo me questa citazione si riferisce a test troppo generici o non verbalizzati.

Se si esegue un test per una funzione che convalida le e-mail e sul test si forniscono solo e-mail valide, tale test è completamente inutile. Dovresti testare questa funzione per "qualsiasi" stringa possibile, e-mail non valide, e-mail troppo lunghe, caratteri unicode (áêñç ....)

Se si codifica un test che controlla solo che name@dom.com restituisce true e name @ com restituisce false, quel test è lo stesso di nessun test.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.