Qual è la differenza tra debug e test?


11

Introduzione a Software Testing (Ammann & Offutt) menzioni a p.32 un modello di maturità di test a 5 livelli:

Livello 0 Non c'è differenza tra test e debug.

Livello 1 Lo scopo del test è dimostrare che il software funziona.

Livello 2 Lo scopo del test è mostrare che il software non funziona.

Livello 3 Lo scopo del test non è dimostrare nulla di specifico, ma ridurre il rischio di utilizzo del software.

Il test di livello 4 è una disciplina mentale che aiuta tutti i professionisti IT a sviluppare software di qualità superiore.

Anche se non entrano in ulteriori dettagli. Quali sono le differenze tra debug e test?


1
Quale parte della pagina di Wikipedia sul debug ti ha confuso? en.wikipedia.org/wiki/Debugging Per favore, inserisci frasi o citazioni specifiche che hai trovato confuse.
S.Lott

4
Tempo medio trascorso da un programmatore per i test: 10 minuti. Tempo medio impiegato da un programmatore per il debug di qualcosa che avrebbe dovuto testare: 2,5 ore.
Craige,

1
È davvero necessario formalizzare i test, quando l'80% di tutti i negozi non ha test in corso?
Giobbe

@Craige: il test richiede in genere molto più di 10 minuti. Potrebbe anche richiedere più tempo del tempo totale dedicato al debug. Tuttavia, il tempo dedicato ai test è proattivo (raggiungendo una copertura completa, anche se solo una piccola percentuale dei test rivelerebbe difetti), mentre il tempo impiegato per il debug è reattivo (il difetto salta sul programmatore nel momento più scomodo, mettendone uno sotto pressione per sbarazzarsi del bug e finendo per introdurre altri bug come parte della correzione.)
rwong

Risposte:


21

Il test ha lo scopo di trovare difetti nel codice, o da una diversa angolazione, per dimostrare a un livello adeguato (che non può mai essere del 100%) che il programma faccia quello che dovrebbe fare. Può essere manuale o automatizzato e ha molti tipi diversi, come unità, integrazione, sistema / accettazione, stress, carico, ammollo ecc.

Il debug è il processo di ricerca e rimozione di un bug specifico dal programma. È sempre un processo manuale, una tantum, poiché tutti i bug sono diversi.

La mia ipotesi è che l'autore significhi che, al livello 0, vengono eseguiti solo test manuali, in modo ad hoc, senza un piano di test o altro per garantire che il tester abbia effettivamente testato a fondo la funzionalità sotto test e che i test possano essere ripetuto in modo affidabile.


Si noti che in questo contesto un bug è una differenza tra ciò che il programma doveva fare e ciò che effettivamente fa.

1
Quel "test" è la mia comprensione di un test unitario. Il debug, specialmente se è il tuo codice, è solo prova ed errore.
ott--

4

Il debug è un processo manuale passo passo che è coinvolto, non strutturato e inaffidabile. Testando attraverso il debug si creano scenari non ripetibili, quindi inutili per i test di regressione. Tutti i livelli diversi da 0 (nel tuo esempio) escludono il debug a mio avviso per questo motivo esatto.


Lo squeeze Saff è una tecnica di debug che è molto strutturato, molto affidabile, non particolarmente interessata e plausibilmente almeno parzialmente automatizzabile. Ciò si ottiene riconoscendo che, di fatto, non vi è alcuna differenza tra test e debug.
Jörg W Mittag,

Se il debug è "non strutturato, inaffidabile e manuale" non lo stai facendo bene! O chiaramente usiamo solo queste due parole per indicare cose diverse.
MemeDeveloper il

3

Il debug è un tentativo di risolvere problemi noti e sconosciuti andando metodicamente sul codice. Quando esegui il debug di solito non ti concentri sul codice nel suo insieme e lavori quasi sempre nel back-end, nel codice effettivo.

Il test è un tentativo di creare un problema attraverso vari modi di utilizzare il codice che può quindi essere sottoposto a debug. È quasi sempre fatto nello spazio utente, dove stai eseguendo il codice come viene eseguito da un utente finale e provando a farlo rompere.


1
Sono d'accordo e vorrei sottolineare il tuo punto sull'esecuzione del codice come verrebbe eseguito da un utente finale solo per evidenziare l'enfasi eccessiva che le persone tendono a mettere su test automatici e TDD. Soprattutto per le app basate sul Web: cosa c'è di più informativo, codice di test del codice o persone che testano le pagine Web?
MemeDeveloper il

2

In termini semplici, si dice che si sia verificato un "bug" quando il programma, in esecuzione, non si comporta come dovrebbe. Cioè non produce l'output o i risultati previsti. Qualsiasi tentativo di trovare l'origine di questo errore, trovare modi per correggere il comportamento e apportare modifiche al codice o alla configurazione per correggere il problema può essere definito debug.

Il test è dove ti assicuri che il programma o il codice funzioni correttamente e in modo robusto in diverse condizioni: "collaudi" il tuo codice fornendo input, input corretti standard, input intenzionalmente errati, valori limite, ambiente in evoluzione (sistema operativo, file di configurazione) . In sostanza, possiamo dire che si tenta di scoprire i bug e infine di "eseguirne il debug" nel processo di test. Spero che aiuti.


1

Non ce ne sono. Se lo fai bene:

Hit 'em High, Hit' em Low :

Test di regressione e Saff Squeeze

Kent Beck, Three Rivers Institute

Riassunto: per isolare efficacemente un difetto, iniziare con un test a livello di sistema e progressivamente in linea e potare fino ad avere il test più piccolo possibile che dimostri il difetto.


In alcuni sistemi - Smalltalk, ad esempio - non c'è alcuna differenza, perché puoi eseguire il tuo ciclo write-test / run-test / write-code interamente all'interno del tuo debugger.
Frank Shearar l'

@FrankShearar: Probabilmente non è un caso che il documento sopra sia stato scritto da un vecchio Smalltalker. Il ciclo TDD (che è ovviamente anche di Kent Beck) è sostanzialmente una descrizione di come il codice Smalltalk è stato scritto dall'alba dei tempi: scrivere un codice di esempio nell'area di lavoro, lasciare che il debugger prenda l'eccezione del metodo no, fare clic su crea metodo , scrivere il codice, riprendere l'esecuzione (yay per eccezioni ripristinabili!), ripetere.
Jörg W Mittag,

1

Il test è un privilegio che ti piace prima di rilasciarlo al client.

I bug sono un incubo che devi sopportare dopo averlo rilasciato al cliente.


haha. La risposta più realistica / pratica ... se solo potessi votare x 100.
MemeDeveloper

1

Altri hanno menzionato quali sono le differenze tra test e debugging.

Vorrei sottolineare una parte comune . Quando un tester rileva un difetto, deve essere isolato. Il debug è una delle tecniche per isolare il problema e trovare le cause alla radice analizzando lo stato dell'applicazione e il suo codice in fase di esecuzione. In effetti, il debugging è definito dai dizionari di Oxford come "il processo di identificazione e rimozione di errori dall'hardware o dal software del computer".

Chi isolerà (o eseguirà il debug in particolare) un difetto, che si tratti di un tester o di uno sviluppatore, è una domanda secondaria.


0

Il modello di maturità del test che hai elencato sono le descrizioni della mentalità del team di sviluppo.

Ciò che l'elenco implica, senza dire esplicitamente, è come il cambiamento di mentalità influisce sul modo in cui vengono condotti i test.

Mentre un team di sviluppo avanza al livello successivo, l'ambito dei test viene ampliato.

Al livello 0, non viene eseguito alcun test, poiché il team ritiene che non sia necessario.

Al livello 1, i test vengono eseguiti per fornire una copertura nominale delle funzionalità di base.

A livello 2, i test vengono ampliati per includere tutto nel livello 1 e si aggiungono ai test distruttivi (un team di test dedicato che ha accesso a tutte le informazioni a cui gli sviluppatori hanno accesso, inclusi codice sorgente e binari, e cerca di trovare bug che possono essere attivato da un ruolo utente)

Al livello 3, oltre a tutto ciò che si trova nei livelli 1-2, vengono aggiunti test non funzionali / test non basati sulla correttezza (come le caratteristiche prestazionali).

Al livello 4, gli obiettivi del test del software sono ben compresi da ogni persona, compreso il personale IT rivolto al cliente. Pertanto, il personale IT sarà in grado di fornire feedback su quali scenari testare, migliorando la copertura del rischio di Livello 4.

(Dichiarazione di non responsabilità: non ho accesso al libro di testo, pertanto la mia terminologia potrebbe non essere corretta.)


0

I bug sono errori visibili. Il debug è il processo avviato dopo la progettazione del caso di test. È un compito più difficile del test, perché nel processo di debug dobbiamo scoprire l'origine dell'errore e rimuoverlo, quindi a volte il debug frustra l'utente.


0

Parlando in termini quotidiani e pratici, penso che dipenda totalmente dal contesto .

In un team di grandi dimensioni, lavorando a standard elevati / molto elevati (pensa a sistemi bancari, militari, su larga scala, a budget elevato o sistemi di business critical), penso che chiaramente il "debugging" dovrebbe essere "un risultato di test" , e sono chiaramente cose molto diverse . Idealmente il test porta al debug (in un ambiente di gestione temporanea) e in produzione abbiamo bisogno di quasi zero di uno dei due.

I test sono di ampia portata, regolari e molto formalizzati - mentre il debug è un processo particolare che si verifica occasionalmente quando è necessario correggere un determinato errore - che non è ovvio e richiede un'analisi più approfondita del funzionamento di un sistema e dei risultati risultanti.

Qui nella mia mente il testing è qualcosa di essenziale, mentre il debug è uno strumento specifico necessario solo quando la risoluzione di un errore è opaca.

Capisco perfettamente l' ovvia utilità in TDD per grandi team e / o sistemi che semplicemente non possono permettersi di essere "buggy". Inoltre ha chiaramente molto senso per sistemi complessi (spesso "back-end") o se esiste un'alta percentuale di complessità nel codice rispetto all'output. Quindi il "test" ha una possibilità realistica di informare quando e perché si verificano guasti. I sistemi che svolgono molte attività complesse e che generano output chiaramente misurabili sono generalmente facilmente testabili, pertanto i test sono distinti dal debug. In questi casi, il testing implica fortemente un metodo formalizzato e basato sulla procedura per confermare o confermare la corrispondenza tra aspettative e risultati effettivi. I test vengono eseguiti continuamente e occasionalmente ci informano della necessità di eseguire il debug.

Sarebbe bello se questa fosse una verità onnipresente, mi piacerebbe che i miei cicli di sviluppo fossero delimitati da un output binario chiaramente definito (rosso, verde) ma ...

Nel mio caso (che è certamente particolare - lavorando da solo al 98% su sistemi di amministrazione aziendale focalizzati sui dati di piccole e medie dimensioni, basati sul web e poco finanziati), non riesco proprio a vedere come TDD possa eventualmente aiutarmi. O meglio "debugging" e "testing" sono praticamente gli stessi.

Principalmente sebbene l'uso del termine "test" implichi / sia strettamente correlato alla metodologia del TDD.

So che questa è una cosa totalmente, assolutamente non Zeitgeist, "evitare il non credente, evitare, evitare", cosa spiacevolmente non fredda da dire. Ma pensando al mio contesto, con un cappello pratico sopra, non lo faccio nemmeno vagamente, nella mia immaginazione più sfrenata vedo come TDD potrebbe eventualmente aiutarmi a fornire più valore in denaro ai miei clienti.

O meglio, non sono assolutamente d'accordo con l'ipotesi comune che il "testing" sia un processo formale basato su codice.

La mia obiezione di base (applicabile nel mio particolare * contesto *) è che ...

Se non riesco a scrivere un codice che funzioni in modo affidabile, allora come diavolo dovrei scrivere un codice che funzioni in modo affidabile per testare il presumibilmente sotto codice standard.

Per me non ho mai visto alcun esempio o argomento che (nel mio particolare contesto) mi ha entusiasmato abbastanza da disturbarmi a pensare di scrivere un singolo test , potrei scrivere un codice di test ridicolmente inconsistente in questo momento, forse "il mio repository restituisce un utente entità con Nome == X, quando lo chiedo esattamente - e solo - quello? ", ma probabilmente c'è più utilità in me che scrivo questo streaming, forse-the-internet-real-is-just-pure-foolish-spouting- spazzatura auto-gratificante-selvaggiamente-sotto-informata-bollente-bollente-sprecamente-sciocca, ma sento solo il bisogno di recitare qui l'avvocato del diavolo. (Spero che qualcuno mi mostri la luce e mi converta, forse questo finirà per dare ai miei clienti un miglior rapporto qualità-prezzo?).

Probabilmente il "debug" a volte è lo stesso del "testing". Con questo intendo davvero che nella mia vita lavorativa quotidiana trascorro almeno un terzo del mio tempo a giocare con la versione locale del mio sistema in diversi browser, cercando disperatamente varie cose stravaganti nel tentativo di interrompere il mio lavoro e quindi indagare i motivi per cui ha fallito e correggerli.

Concordo al 100% con l'ovvia utilità nel mantra TDD "rosso / verde / refactor", ma per me (lavorando con budget basso, terra di sviluppo personale RIA) mi piacerebbe davvero che qualcuno mi mostrasse come potevo possibilmente , logicamente e in modo realistico realisticamente ottenere qualsiasi valore aggiuntivo dalla scrittura di più ( proprio come codice di test potenzialmente imperfetto ) di quello che faccio dall'interazione effettiva con l'output completo (ed essenzialmente solo) dei miei sforzi che sono essenzialmente legati alla vera interazione umana.

Per me quando gli sviluppatori parlano di "test", in genere implica TDD.

Provo a programmare come se ci fossero test, penso che tutti i modelli / pratiche e tendenze che tutti questi test incentrati sullo sviluppo hanno incoraggiato siano fantastici e belli, ma per me nel mio piccolo mondo "test" non sta scrivendo più codice, è in realtà testare il mondo reale lo produce in modo realistico e si avvicina allo stesso modo del debug, o piuttosto il cambiamento attivo qui è il "debug" che è il risultato diretto di "test" umani non incentrati sull'output. Ciò è in contrasto con la visione generalmente accettata di "test" come qualcosa di automatizzato e formale e di "debug" come qualcosa di umano e ad hoc o non strutturato.

Se l'obiettivo è davvero un rapporto qualità / prezzo e stai realizzando applicazioni interattive basate sul web, l'output dello sforzo sono le pagine Web e in sostanza il modo in cui reagiscono all'input umano , quindi il "test" è meglio ottenuto testando quelle pagine web, attraverso una vera interazione umana. Quando questa interazione porta a output imprevisti o indesiderati, si verifica il "debug". Il debug è inoltre strettamente correlato all'idea di ispezione in tempo reale dello stato del programma. I test sono generalmente associati all'automazione che penso sia spesso un'associazione sfortunata.

Se l'obiettivo è davvero un valore per lo sforzo e i test automatizzati sono efficienti e altamente vantaggiosi, mentre il debug è solo un risultato di tali test o un sostituto scadente per i test automatizzati, allora perché è il secondo sito Web più visitato al mondo (Facebook ) così spesso pieno di bug palesemente ovvi (per gli utenti, ma chiaramente non per il team di test e il codice di test)?

Forse è perché si stanno concentrando sulle rassicuranti luci verdi e si stanno dimenticando di utilizzare effettivamente i risultati del loro lavoro?

Troppi sviluppatori pensano che il testing sia qualcosa che fai con il codice e il debugging è qualcosa che fai occasionalmente con l'IDE perché un'icona diventa rossa e non riesci a capire perché? Penso che queste parole abbiano giudizi di valore sfortunati associati ad esse, che generalmente oscurano la realtà pratica di ciò su cui dovremmo concentrarci per colmare le lacune tra aspettative e risultati.


-3

Semplicemente,

Test significa che trovare gli input che causano un errore del software durante il debug è il processo per trovare l'errore di un determinato errore.


questo non sembra offrire nulla di sostanziale rispetto ai punti formulati e spiegati nelle precedenti 10 risposte
moscerino
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.