|
emi7oP <a href="http://etyxbsmwlbop.com/">etyxbsmwlbop</a>, [url=http://ejkbnyaqouhe.com/]ejkbnyaqouhe[/url], [link=http://iytqgxxmxvee.com/]iytqgxxmxvee[/link], http://ddjproogyauv.com/ |
ControlloDellaQualitaControllo della qualitàAutori: Alberto Taiocchi Sommario
Nelle righe di questo capitolo potete trovare una discussione sugli aspetti legati alla qualità sia di prodotto sia di processo, un nutrito compendio di informazioni riguardante il testing e l’introduzione del concetto di ispezione del codice; il capitolo si conclude con una paragrafo che verte sulla questione delle misure, dalla raccolta all’interpretazione.
Aspetti generaliLa qualità di un prodotto software deve soddisfare un insieme di caratteristiche:
Qualità di prodotto e processoCome fare a soddisfare questi requisiti e quindi ottenere qualità in un prodotto software? Per ottenere la qualità in un prodotto esistono due approcci complementari:
Se un processo è male organizzato e tecnicamente carente difficilmente genererà prodotti di qualità. Un processo è male organizzato se si verificano uno o più dei seguenti casi:
Il tutto porta ad avere prodotti di bassa qualità. Migliorando la qualità dei processi produttivi si genera una migliore qualità statistica dei prodotti. Ciò non assicura nulla però sulla qualità di uno specifico prodotto. Nella realtà si applicano tecniche per ottenere prodotti e processi di qualità. Il tutto funziona come un sistema retroazionato. Partendo da obiettivi di qualità prefissati si effetuano azioni sul prodotto software e se ne misurano i risultati. Il processo di controllo qualità viene ripetuto ciclicamente fino a che non viene raggiunto un livello accertato di qualità. La fase di controllo della qualità può essere interrotta a causa di uno dei seguenti motivi:
Modelli di qualitàI modelli di qualità sono uno schema di riferimento per definire la qualità di un prodotto. La normativa di riferimento è la ISO9126 (Software Product Quality, per la definizione della qualità del prodotto). FunzionalitàInsieme di attributi correlati all’esistenza di un insieme di funzioni (che soddisfano i requisiti) e delle loro specifiche proprietà. Questi attributi sono:
AffidabilitàInsieme di attributi correlati con la capacità del software di mantenere un certo livello di prestazioni in determinate condizioni e per un certo periodo di tempo. Questi attributi sono:
UsabilitàInsieme di attributi correlati alla facilità d’uso del prodotto. Dipende dal contesto e dalle persone che lo devono usare. Gli attributi sono:
EfficienzaInsieme di attributi correlati al livello di prestazioni del software e la quantità di risorse usate, in determinate condizioni. Gli attributi sono:
ManutenibilitàInsieme di attributi correlati allo sforzo per effettuare certe modifiche. Gli attributi sono:
PortabilitàInsieme di attributi correlati alla facilità di spostare un prodotto da un ambiente ad un altro. Gli attributi sono:
Tecniche di valutazione della qualità del prodottoPer valutare i modelli di qualità e quindi i parametri che concorrono alla valutazione della qualità del prodotto esistono diverse tecniche tra cui il testing, le ispezioni, le misure.
Processo di valutazione della qualità di un prodottoLa valutazione della qualità di un prodotto è basata sulla disponibilità dei documenti (specifica, progetto, codice). L’attività di valutazione avviene lungo tutto il processo di sviluppo. All’interno di un prodotto ogni caratteristica ha un suo peso determinato. Il processo di valutazione è composto da 4 passi fondamentali:
Definizione del profilo di qualitàAd ogni caratteristica di qualità è assegnato un valore (importanza, criticità, valore di misura atteso) relativo all’intero prodotto (Esempio: un grande sistema di automazione richiede un’attenzione particolare alla manutenibilità e all’affidabilità). Il profilo si estrae dall’analisi dei requisiti e da interviste con utenti e il cliente. Definizione del piano di qualitàPer ogni caratteristica di qualità è definito un modulo di attività di controllo (Test, ispezioni, misure). Un modulo di attività di controllo può eseguire verifiche su documenti diversi utilizzando tecniche diverse. Si ispeziona il documento di specifica per verificare la ricchezza delle funzioni messe a disposizione dell’utente. Si ispeziona il documento di progettazione per vedere se i risultati forniscono sufficiente garanzia di precisione). Esecuzione del piano di durante il processoIl piano viene eseguito dopo una delle fasi di studio del prodotto, come la progettazione architetturale o al termine della codifica. Raccolta risultati e applicazione di regole di interpretazione al finedi esprimere un giudizio finale Si effettua la raccolta dei risultati, si applicano delle regole di interpretazione e si valutano i risultati ottenuti. Criteri di valutazione possono essere: passa, non passa, insufficiente, sufficiente, buono, ottimo. In questo modo è possibile fornire delle spiegazioni al cliente sulle valutazioni, tali da poter essere utilizzate per migliorare il prodotto. La valutazione ha delle complicazioni. Un prodotto software è costituito da più moduli e le caratteristiche di qualità non sono ugualmente importanti per tutti i componenti. Allora si crea una matrice di qualità per differenziare questi aspetti. Inoltre la caratteristica di un componente può essere considerata più critica e necessita di maggiori attenzioni. Dato che lo sforzo globale di controllo è limitato conviene concentrarsi nei componenti più critici, introducendo dei livelli nei moduli di controllo. SpiegazioniQuesta fase ha il compito di fornire delle spiegazioni delle ragioni della valutazione tali da poter essere utilizzate per poter migliorare il prodotto. Il valore globale di una caratteristica di qualità è spiegato in termini di valori delle sottocaratteristiche e delle misure raccolte. TestingAlcune note teoricheIl test del software è la verifica dinamica del comportamento di un programma. Tale verifica viene fatta con un numero finito di casi di test selezionati da un dominio di ingresso, rispetto ad un comportamento atteso specificato. Supponiamo di avere un programma P, funzione da dominio D (input) a un codominio R (output). Eseguire un test di P significa eseguire P per tutti i punti dati di D e controllare la coerenza dei risultati R. Un test ideale è un test esaustivo di D i cui risultati soddisfano le specifiche. Il caso esaustivo nella pratica è impossibile da realizzare, per ragioni pratiche, di costo e di tempo. Allora bisogna selezionarne un sottoinsieme mirato che permetta di ottenere risultati utili al fine di accrescere la fiducia nel prodotto sofware. Il testing quindi è uno strumento per accrescere la fiducia nei confronti del prodotto. Si deve evitare di pensare al testing come strumento per creare un programma corretto, ma per realizzarne uno affidabile. Effettuando un buon test l’utilizzatore acquisce fiducia nei confronti del programma. La safety definisce ciò che il programma non deve fare, in altre parole rappresenta i comportamenti indesiderati del sistema. CostiIl costo tipico del testing è circa il 30% del costo totale di progetto, anche se nella realtà questa percentuale è estremamente variabile. I soldi disponibili per effettuare il testing (budget del testing) sono pochi e a carico del fornitore. Il test è una fase critica non solo per i costi ma perchE’ è collocato nella fase finale del progetto, poco prima della data di consegna. Rischia di essere fatto di fretta, sotto pressione del cliente, per poter essere consegnato in tempo. Si rischia di effettuare un test carente, pericoloso perchE’ potrebbe non soddisfare il cliente. Il fornitore dovrebbe rimediare ai difetti allungando il periodo di lavoro e il cliente, insoddisfatto, continuerebbe a non pagare. Per evitare questi problemi è necessario definire una strategia di test che definisca le risorse disponibili e le utilizzi in modo appropriato rispetto a:
Il test deve essere pianificato ed eseguito attraverso un processo di testing. Le tecniche di testing servono per offrire delle possibili soluzioni (anche se non esistono delle soluzioni giuste o sbagliate) a tipici problemi che si devono affrontare, come:
Le soluzioni offerte possono essere tecniche, euristiche, dettate dall’esperienze passate o dal confronto con casi analoghi. La strategia di un piano di test si trasforma in un processo omposto da tre punti principali:
Tipologie di test e coperturaEsistono tipologie di test:
Esistono tre tipologie di copertura:
Struttura di un caso di testUn caso di test è formato da quattro fasi:
Un caso di test può essere una struttura complessa che deve essere preparata prima. Applicarla per prodotti di mercato risulta più semplice rispetto a prodotti custom. Bisogna:
Si può identificare il comportamento del sistema utilizzandolo (coscientemente) in modo corretto o sbagliato ed analizzarne i risultati. Sono entrambi test per verificare la robustezza del sistema. Si ottengono due tipi di test:
Test funzionale (black box)Un test funzionale è formato da diversi casi, a seconda delle esigenze. Quelli possibili sono i seguenti: Casi di test da specifiche testualiSi deve suddividere la specifica in aree funzionali omogenee. Per ogni area sono estratte le funzioni elementari semplicemente sottolineando le parole adeguate. Per ogni funzione elementare si definiscono casi di test. Si avrà una lista delle funzioni organizzata in sezioni. Casi di test da modelliLa specifica è un modello formale o semi-formale da cui è possibile estrarre casi di test applicando un criterio definito. Esempio: un automa a stati finiti con tabella descrittiva. Classi di equivalenza del dominio di ingressoSi suppone che il programma si comporti allo stesso modo per ogni elemento della stessa classe. Si sceglie un caso di test per ogni classe.Ci sono delle regole euristiche che permetto di identificare queste classi. Esempio: nell’inserimento di numeri interi, le classi possono essere: numeri minori di 0, maggiori di 0 e lo 0. Valori limiteI valori limite sono gli estremi delle classi di equivalenza. Sono le possibili fonti di errori perchE’ trattano casi particolari. Il programmatore tratta i casi normali, quelli limite possono essere dimenticati oppure gestiti con codice specifico. Test negativiI dati di input simulano un uso scorretto del sistema da parte dell’utente. Per effettuare i casi di test si individuano classi di equivalenza di questi dati di input (classi non valide) Grafi causa effettoSono utilizzati per i casi di combinazioni complicate degli ingressi. Si selezionano casi di test significativi per verificare combinazioni di dati in ingresso che causano definite uscite. Si procede nel modo seguente:
effetti. La rete aiuta a validare la specifica;
quell’effetto;
Stima dei punti criticiSulla base dell’esperienza del programmatore e del settore specifico applicativo un esperto del testing può identificare possibili situazioni causa di effetti e scrivere specifici casi di test Casi di test da scenariSi definisce un insieme di scenari di utilizzo. Per ogni scenario sono identificate le varianti considerate più significative o critiche. Gli scenari sono derivati dall’analisi dei requisiti o sono scritti ad hoc per il testing. Per ogni scenario è definito un caso di test. Gli scenari definiti verranno poi riutilizzati nel test di collaudo finale. Test strutturale (white box)Vengono definiti i casi di test sufficienti per rispettare un criterio di copertura di elementi definiti del programma. Il programma viene tradotto nel grafo di controllo, costituito da cerchi rapresentanti comandi, gruppi di comandi o condizioni e frecce rappresentanti i flussi di controllo. Il test strutturale viene eseguito basandosi su cinque criteri:
C0 = n istr.eseguite / n istruzioni
Test di modulo, integrazione di sistemaUn sistema può essere costituito da più componenti interconnessi tra loro. E’ possibile effettuare dei test anche a insiemi di componenti per verificarne il funzionamento collettivo. Si utilizzano metodi diversi:
Test di sistemi ad oggettiNei sistemi ad oggetti non si testano procedure ma classi e oggetti che incorporano procedure e dati (ogni oggetto ha una relazione di ingresso, di uscita e i suoi dati). Nel testing è necessario tenere conto dell’ereditarietà e del polimorfismo. Testare una classe vuol dire:
Nel testare ereditarietà e polimorfismo si deve considerare che l’informazione non è localizzata. Inoltre, quando si ereditano delle funzioni, è bene testare solo le differenze. Bisogna testare le diverse implementazioni per quegli oggetti che si riferiscono ad un certo codice solo a livello runtime. I sistemi ad oggetti non sono una struttura gerarchica ma una rete. Quindi un oggetto può vedere gli altri oggetti. I livelli di integrazione sono meno distinti e quindi bisogna studiare dei test che tengono conto di queste differenze. I livelli di test sono:
Test di accettazione / collaudoIl test di accettazione/collaudo utilizza la tecnica degli scenari. Si identificano un insieme di scenari di utilizzo, concordati con il cliente, i quali esercitano il prodotto nell’ambiente del cliente, con gli utenti tipici, nei casi tipici e in casi considerati critici. Gli scenari di test includono anche caratteristiche non funzionali. Test di non regressioneSupponiamo di avere un insieme di casi di test T, eseguiti senza manifestare malfunzionamenti. Ad un certo punto si trova un difetto che viene corretto. La modifica però può aver introdotto altri difetti. Allora la batteria di test T viene rifatta, per accertarsi che la modifica non abbia introdotto difetti laterali. Questa procedura si può rifare risparmiando tempo se si studia una procedura automatica di test. Test di caratteristiche non funzionaliSi possono costruire test relativi non solo a specifiche funzionali, ma anche a quelle non funzionali. Ad esempio:
Strategia di testLa teoria del testing e le relative tecniche convergono nella strategia di test. Gli ingredienti per costruire una strategia di test sono:
Bisogna sapere come bilanciare questi fattori per ottenere la strategia più adatta alla situazione. Scegliere la strategia di test più adatta implica sapere:
Le risorse e i tempi disponibili vanno negoziati con il cliente. Si devono analizzare gli scenari e i casi d’uso, in quanto non tutti gli aspetti sono critici. Di conseguenza bisogna scegliere le tecniche di testing e i criteri di copertura più adatti. Infine si deve creare il documento della strategia di test che definisca le scelte, ne spieghi il perchE’ e pianifichi le azioni. Processo di testUn processo di test è definito dalle seguenti fasi, che si intrecciano con quelle della progettazione del prodotto:
Per facilitare e, in generale, velocizzare un processo di test è possibile realizzare un programma che automatizza alcune fasi, noiose e lunghe da preparare, come:
I processi di test devono essere adattati alle specifiche necessità e ai vincoli:
L’attività di test è una specifica competenza. E’ utile che venga eseguita da persone diverse dagli sviluppatori, per i seguenti motivi:
DocumentiIl processo di test rilascia dei documenti:
DebuggingIl debugging è avviato dal manifestarsi di un malfunzionamento causato da un difetto di programma. Permette di identificare e correggere il difetto che ha causato il malfunzionamento. In questa fase ha molta rilevanza l’aspetto della manutenibilità del prodotto (come la comprensibilità e il rischio ridotto di generare effetti laterali non desiderati). Analisi dei malfunzionamenti e dei difettiQuando si rilevano degli errori devono essere registrati al fine di essere utilizzati:
I dati raccolti devono essere catalogati con processi ordinati:
I dati raccolti possono essere analizzati con diverse tecniche, tra cui:
Quando si ha una serie di dati che descrivono alcuni difetti è possibile valutare le cause di difficoltà per un eventuale intervento di correzione, come:
IspezioniConcetto e tipi di ispezioneSono verifiche statiche di prodotto applicate alla documentazione (specifiche, architettura, ecc) e al codice sorgente. Hanno lo scopo di valutare aspetti di qualità del prodotto. Si possono eseguire delle verifiche di processo che permettono di capire a che punto del lavoro si è arrivati, quanto si ha speso e quanto rimane, sia in termini di denaro sia in termini di tempo. La procedura di ispezione è composta da quattro fas. Nella prima il gruppo di progetto definisce una release di uno o più documenti. Successivamente, un gruppo di ispezione esamina criticamente i documenti. I risultati vengono documentati e verranno intraprese azioni di sistemazione. Ci sono due tipi di ispezioni:
Per applicare queste due ispezioni con successo ci sono delle condizioni da rispettare:
L’ispezione è una tecnica semplice ed utile che permette di:
Processo di ispezioneLa verifica è eseguita in modo strutturato attraverso un processo definito. Si utilizzano due tecniche: Walkthrought
da revisionare e la legge separatamente
è percorsa e sono documentati difetti scoperti, valutazioni ed azioni richieste Inspection
Gruppo di ispezioneIl gruppo di ispezione è formato da:
Deve essere definito un responsabile del processo che lo pianifica e lo gestisce. Inoltre uno dei partecipanti si incarica di annotare i risultati e le decisioni ChecklistL’ispezione di un documento può essere strutturata e guidata da una lista predefinita di aspetti da esaminare. Nella checklist abbiamo:
Strumenti automatici di analisiSi utilizzano strumenti automatici di analisi statica. Si applicano a documenti scritti con linguaggi formali (tipicamente codice sorgente). Una di queste tecniche è l’analisi del codice:
MisureMisure di prodotto, concetti generaliLa qualità di un prodotto, conforme alle caratteristiche ISO 9126, può essere valutata non solo attraverso il testing o le ispezioni, ma anche raccogliendo misure relative a specifici aspetti del prodotto, al fine di stimare le caratteristiche di qualità. Esempio: dalla misura del grado di coesione e accoppiamento dei moduli, dalle dimensioni medie dei componenti in linee di codice, dalla densità dei commenti, è possibile stimare la manutenibilità. Alcune caratteristiche non sono valutabili effettuando dei test. La manutenibilità, per esempio, deve essere prevista organizzando in modo appropriato o con tecniche diverse la realizzazione del prodotto. A parità di condizioni si devono effettuare delle prove di manutenibilità ed osservare quale tecnica risulti esssere la più efficiente. Durante la vita di un prodotto software si possono misurare indicatori utili per predire o tenere sotto controllo caratteristiche di qualità (es. per l’affidabilità, è utile la copertura del test, il n_di difetti trovati / linee di codice nella fase di test, il n_ di difetti trovati / linee di codice in esercizio). La misura è il risultato della misurazione diuno specifico attributo. La metrica è un insieme di regole per definire:
Le misure interne misurano:
Le misure esterne sono valutate sul prodotto nell’ambiente di utilizzo. Ci sono una serie di assunzioni che si devono considerare:
Definire e validare una relazione tra gli indicatori e le caratteristiche di qualità è difficile e controverso. E’ utile in contesti definiti anche se la capacità predittiva è difficile da ottenere. UtilizzoEcco come utilizzare le misure:
Esempi di misure
di applicazione da realizzare.
V(G)=e-n+2
dove e è il numero di archi (flusso di controllo) e n è il numero di nodi (comandi). Un valore elevato di V(G) per un modulo indica una struttura complessa di controllo che influenzerà (assieme ad altri fattori) la manutenibilità del modulo stesso. Si dimostra che V(G)=d+1 (con d numero di decisioni binarie) misura un attributo della struttura di controllo di un programma. Non è una misura di manutenibilità.
Es. confronto penna USB - smart card. Raccolta, interpretazione e integrazionePer ottenere stime di caratteristiche di qualità è necessario:
Raccogliere un insieme di misure diverse vuol dire ottenere:
Successivamente bisogna definire dei criteri per poter interpretare le misure ottenute. Si deve integrare l’insieme dei risultati al fine di ottenere, a partire dalle singoli interpretazioni, il valore stimato dell’attributo. Misure di processoLe misure relative ai prodotti possono essere utilizzate anche per valutare, controllare e gestire i processi. Possiamo individuare:
Un processo può essere gestito e migliorato attivando la raccolta e la valutazione periodica di un insieme di misure al fine di valutare la qualità del processo (maturità) e intraprendere azioni di miglioramento. Esempi di misure:
|