Cos'è il test di loop? Metodologia, esempio

⚡ Riepilogo intelligente

Il test dei cicli convalida le strutture di ciclo all'interno di un programma, verificando cosa accade quando un ciclo viene saltato, eseguito una volta, eseguito al suo limite e spinto di un passaggio oltre il numero massimo consentito.

  • 🔘 Definizione: Una tecnica di struttura di controllo white box mirata alla validità del ciclo, non alle schermate.
  • 🔁 Quattro classi: I cicli semplici, annidati, concatenati e non strutturati richiedono ciascuno una propria strategia.
  • 📍 Tre punti di controllo: Ingresso nel ciclo, comportamento durante l'esecuzione e condizione di uscita.
  • 🧪 Passi di confine: Zero, uno, due, un conteggio tipico, poi b-1, b e b+1 iterazioni.
  • 🪜 Ordine annidato: Iniziate dall'anello più interno, mantenete quelli esterni al minimo, quindi procedete verso l'esterno.
  • 🐞 Difetti riscontrati: Limiti sfasati di uno, contatori non inizializzati, cicli infiniti e colli di bottiglia di capacità.
  • ⚠️ Limitazione: I bug di tipo loop si annidano nel codice di basso livello e, una volta individuati, raramente risultano subdoli.

Metodologia di test dei cicli, tipologie di cicli ed esempi di casi di test

Cos'è il test di loop?

Test del circuito è un tipo di test del software che si concentra interamente sulla validità delle strutture di ciclo in un programma. È una parte del test della struttura di controllo, insieme test del percorso, test di convalida dei dati e test delle condizioni.

Il test del circuito è a test della scatola bianca Si tratta di una tecnica che viene applicata da chi è in grado di leggere il codice sorgente e individuare la condizione del ciclo, il contatore e il percorso di uscita. Il tester non deve dedurre il comportamento dall'interfaccia utente; l'oggetto del test è il ciclo stesso.

Il diagramma seguente mostra la posizione dei test di ciclo all'interno della famiglia dei test di struttura di controllo.

Il test dei cicli viene mostrato come una branca del test della struttura di controllo

Tipi di loop testati

Prima di scegliere una strategia, identifica quale delle quattro classi di cicli stai considerando. Esempi di tipi di cicli testati sono:

  • Ciclo semplice — un singolo ciclo con un ingresso e un'uscita, come ad esempio un semplice per, while or fare mentre costruire.
  • Ciclo annidato — un ciclo inserito all'interno di un altro, in modo che il ciclo interno venga completato ad ogni passaggio del ciclo esterno.
  • Ciclo concatenato — due o più cicli che si susseguono in sequenza.
  • Ciclo non strutturato — una combinazione non pianificata di cicli annidati e concatenati, solitamente il risultato di salti all'interno o all'esterno del corpo di un ciclo.

La classe determina l'impegno richiesto. Un ciclo semplice necessita di poche iterazioni; un ciclo non strutturato, invece, di solito richiede una riprogettazione del codice prima ancora di poterlo testare.

Perché eseguire il test di loop?

Il test del loop viene eseguito per i seguenti motivi

  • I test possono risolvere i problemi di ripetizione del loop
  • I test di loop possono rivelare colli di bottiglia in termini di prestazioni e capacità.
  • Attraverso il test dei cicli, è possibile determinare le variabili non inizializzate nel ciclo.
  • Aiuta a identificare i problemi di inizializzazione del ciclo.

Esiste anche una ragione commerciale. Un ciclo che esegue un'iterazione di troppo corrompe il totale; un ciclo che non termina mai blocca un processo. Entrambi i difetti sono economici da individuare quando il codice è ancora sulla macchina di uno sviluppatore, ma costosi da trovare in produzione.

Come eseguire il Loop Testing: metodologia completa

Durante il test di un ciclo, è necessario verificarlo a tre livelli diversi:

  • Quando si entra nel ciclo
  • Durante la sua esecuzione, e
  • Quando il ciclo viene lasciato

La strategia di test per tutti questi cicli è la seguente.

Ciclo semplice

Un ciclo semplice ha un singolo punto di ingresso e una singola uscita, come mostrato di seguito.

Diagramma di flusso ad anello semplice con un punto di ingresso e una condizione di uscita.

Un ciclo semplice viene testato nel modo seguente:

  1. Salta l'intero ciclo
  2. Effettuare un passaggio attraverso il circuito
  3. Fai 2 passaggio attraverso il cappio
  4. Make a passa attraverso il ciclo dove a < b, ovvero un tipico numero di iterazioni di fascia media
  5. Make b, b-1 e b+1 passa attraverso il ciclo dove b è il numero massimo di passaggi consentiti attraverso il ciclo.

Gli ultimi due casi hanno il maggior valore.ping il ciclo dimostra che la condizione di uscita viene valutata prima che il corpo venga eseguito e il bIl caso +1 dimostra che il ciclo si rifiuta di lavorare oltre il limite dichiarato anziché sovrascrivere un array.

Ciclo annidato

Un ciclo annidato moltiplica il numero di possibili combinazioni di iterazioni, quindi viene testato dall'interno verso l'esterno anziché tutto in una volta.

Diagramma di flusso a ciclo annidato con un ciclo interno racchiuso da un ciclo esterno

Per creare un ciclo annidato, è necessario seguire i seguenti passaggi.

  1. Imposta tutti gli altri cicli al loro valore minimo e inizia dal ciclo più interno
  2. Per il ciclo più interno, esegui un semplice test del ciclo e mantieni i cicli esterni al valore minimo del parametro di iterazione
  3. Eseguire il test per il ciclo successivo e procedere verso l'esterno.
  4. Continuare finché non è stato testato il circuito più esterno.

Loop concatenati

Come mostrato nel diagramma, i cicli concatenati si susseguono nello stesso percorso di esecuzione.

Diagramma di flusso di cicli concatenati che mostra due cicli eseguiti in sequenza

Nei cicli concatenati, se due cicli sono indipendenti l'uno dall'altro, vengono testati utilizzando l'approccio del ciclo semplice; altrimenti, vengono testati come cicli annidati.

Tuttavia, se il contatore di un ciclo viene utilizzato come valore iniziale per l'altro, i due cicli non sono considerati indipendenti.

Loop non strutturati

I cicli non strutturati rappresentano il caso più difficile, perché il controllo entra ed esce dal corpo del ciclo in punti arbitrari.

Diagramma di flusso ad anello non strutturato con salto di controlloping dentro e fuori dal corpo del ciclo

Per i cicli non strutturati, la progettazione deve essere ristrutturata per riflettere l'uso di costrutti di programmazione strutturata. Una volta che il codice è stato ridotto a forme semplici, annidate o concatenate, si applica la strategia di corrispondenza descritta sopra.

Esempio di test di ciclo con casi di test

Un esempio pratico rende concreto il conteggio delle iterazioni. Consideriamo una routine che moltiplica un risultato corrente per ogni intero da 1 a n, un calcolo fattoriale. Il contatore del ciclo parte da 1, la condizione di uscita è contrastare > ne il ciclo è dichiarato per accettare un massimo di 12 passaggi prima che il risultato superi il tipo intero dichiarato.

Trattando questo come un semplice ciclo, il numero di iterazioni raccomandato sopra si traduce in quanto segue casi test.

Caso di prova Valore di n Passaggi eseguiti Cosa dimostra
TC01 0 0 (ciclo saltato) La condizione di uscita viene valutata prima dell'esecuzione del corpo del programma e il risultato rimane al suo valore iniziale di 1.
TC02 1 1 Un singolo passaggio produce il risultato corretto e il contatore si incrementa di una volta.
TC03 2 2 L'accumulatore riporta un valore tra due passaggi consecutivi.
TC04 5 5 Un conteggio tipico di fascia media restituisce il valore atteso di 120, confermando un comportamento normale.
TC05 11 11 Un passaggio al di sotto del massimo si completa comunque normalmente (b-1).
TC06 12 12 Il valore massimo dichiarato viene accettato e il ciclo termina (b).
TC07 13 respinto Un passaggio oltre il massimo viene rifiutato anziché traboccare silenziosamente (b+ 1).

Si noti che TC01 e TC07 sono i due casi che gli sviluppatori più spesso omettono, e sono i due che espongono difetti di inizializzazione saltata e overflow. Un valore negativo di n appartiene allo stesso insieme se la specifica consente di fornirlo, che collega il test del ciclo a test negativo.

Difetti comuni rilevati tramite test di loop

I test di ciclo continuano a individuare la stessa piccola famiglia di errori, ed è questo che giustifica l'esecuzione con un numero fisso di iterazioni.

  • Confini fuori uno — una condizione scritta come < where <= era previsto, quindi il ciclo esegue un passaggio in meno o uno in più.
  • Contatori o accumulatori non inizializzati — un totale che include un valore residuo da una chiamata precedente.
  • Cicli infiniti — una condizione di uscita che il corpo del ciclo non può mai soddisfare perché il contatore viene aggiornato solo su alcuni rami.
  • Presupposti del ciclo saltato — codice dopo il ciclo che legge una variabile che il corpo del ciclo avrebbe dovuto impostare, e che fallisce quando il ciclo viene eseguito zero volte.
  • Guasti di capacità e prestazioni — un ciclo corretto ma che rilegge il database a ogni iterazione, quindi il costo aumenta con il numero di iterazioni.
  • Interferenza ad anello annidato — un ciclo interno che riutilizza il contatore del ciclo esterno e modifica silenziosamente il conteggio delle iterazioni del ciclo esterno.

Poiché ogni errore corrisponde a uno specifico numero di iterazioni, i difetti qui evidenziati sono facili da riprodurre e rapidi da correggere rispetto ai difetti riscontrati a livelli superiori. livelli di prova.

Test dei cicli rispetto ad altre tecniche di test delle strutture di controllo

Il test di ciclo appartiene alla famiglia delle tecniche di controllo e può essere facilmente confuso con le tecniche affini. La tabella seguente le distingue.

Tecnica A cosa si rivolge Obiettivo di copertura tipico
Test del ciclo Strutture del ciclo: ingresso, conteggio delle iterazioni e uscita Zero, uno, tipico e conteggio delle iterazioni limite per ogni ciclo
Test delle condizioni Espressioni booleane all'interno delle decisioni Ciascuna condizione è stata valutata sia vera che falsa
Test del flusso di dati Definizione e utilizzo di ciascuna variabile Ogni coppia definizione-uso esercitata almeno una volta
Test del percorso di base Percorsi indipendenti attraverso il grafo di flusso di controllo Un numero di percorsi pari alla complessità ciclomica

In pratica, queste tecniche sono complementari anziché in competizione. Complessità ciclomatica ti dice quanti percorsi indipendenti esistono, il test del percorso di base li copre e il test del ciclo aggiunge quindi i conteggi di iterazione che la sola copertura del percorso non imporrebbe. Tutti loro sono test dinamico attività, poiché il codice deve essere eseguito affinché i risultati siano osservabili.

Limitazione nel test del circuito

Questa tecnica ha dei limiti ben precisi, e conoscerli previene un investimento eccessivo.

  • I bug dei loop si manifestano principalmente nei software di basso livello
  • I bug identificati durante il test del loop non sono molto nascosti
  • Molti bug potrebbero essere rilevati dal sistema operativo, poiché causano violazioni dei limiti di memoria, errori di puntatore rilevabili e guasti simili.
  • Identificare la classe di ogni ciclo e testarla di conseguenza richiede tempo, il che è difficile da giustificare in percorsi di codice che comportano un rischio minimo.

DOMANDE FREQUENTI

Gli sviluppatori e i tester tecnici con accesso al codice sorgente, di solito durante unit test o revisione del codice. I tester aziendali non possono applicarlo, perché la condizione del ciclo è invisibile dall'interfaccia utente.

Un modello legge la condizione del ciclo e propone automaticamente i conteggi di iterazioni zero, uno, tipici e limite, incluso il caso di overflow. Un revisore verifica infine che ogni risultato atteso corrisponda alle specifiche.

Il sistema li elabora rapidamente, poiché il modello di iterazione è schematico. Gli assistenti virtuali possono anche eseguire la suite e segnalare quali conteggi falliscono, ma la decisione sul numero massimo di passaggi consentiti rimane una scelta di progettazione di competenza umana.

Eseguire il caso con un timeout o una protezione iterativa in modo che il test fallisca rapidamente invece di bloccare la suite. Verificare il numero di passaggi registrati, non solo il valore di output finale.

Molto meno di ogni possibile combinazione. Testare dall'interno verso l'esterno mantiene il conteggio approssimativamente additivo tra i livelli piuttosto che moltiplicativo, perché i cicli esterni sono bloccati al loro valore minimo mentre il ciclo interno viene esercitato.

Nessuno strumento è dedicato a questo. I team combinano un framework di test unitario come JUnit oppure esegui pytest con uno strumento di copertura che riporta la copertura dei rami, quindi leggi il report per confermare che il percorso a zero iterazioni è stato raggiunto.

No. La copertura dei rami è soddisfatta una volta che un ciclo è entrato e uscito una volta. Il test dei cicli richiede inoltre il conteggio dei passaggi saltati e dei confini, cosa che la sola copertura dei rami non impone mai.

Ogni volta che non è strutturato — controllo saltoping dentro o fuori dal corpo. Ristrutturare in forme semplici, annidate o concatenate costa meno che progettare test per ogni punto di ingresso irregolare.

Riassumi questo post con: