Documente Academic
Documente Profesional
Documente Cultură
Este etapa in care se construieste solutia problemei. Rezultatul este un model fizic al viitorului
sistem, care este descris in Documentul de Proiectare Arhitecturala.
Cerintele din documentul Cerintelor Software sunt alocate unor componente ale viitorului sistem.
Rezulta un set de subsisteme/componente interconectate. Arhitectura software rezulta printr-un
proces iterativ de descompunere a cerintelor.
1. Abordare descendenta:
Se pleaca de la specificatia cerintelor software: S
Se descompune setul cerintelor, S, in subseturi relativ independente, S1, S2,
Fiecare subset de cerinte, Si, este alocat unui subsistem al arhitecturii
software: SA1, SA2...
Fiecare subset de cerinte Si este descompus in subseturi mai simple, Si1, Si2, .. care sunt
alocate unor subsisteme ale subsistemului SAi: SAi1, SAi2,..
Descompunerea modelului de proiectare arhitecturala se opreste atunci cand nivelul sau de
detaliu permite:
continuarea dezvoltarii in paralel de catre mai multi membrii ai echipei de dezvoltare,
planificarea activitatilor urmatoare ale procesului de dezvoltare (pana la livrare),
estimarea resurselor umane necesare si a costurilor.
Rezultatul este o structura ierarhica alcatuita din subsisteme interconectate, fiecare subsistem
fiind descompus pana la nivel de module.
Un modul de proiectare poate fi: modul functional (functie, procedura), clasa, componenta, in
functie de metoda de proiectare folosita: functionala sau orientat obiect.
2. Abordare ascendenta
Centrata pe reutilizare
Se pleaca de la un set de module existente : module functionale sau clase
Se cauta o descompunere a cerintelor in subseturi care pot fi implementate folosind
componentele existente
3. Abordare hibrida
Se pleaca de la setul de cerinte software, care se descompune iterativ, dar in procesul de
descompunere se urmareste definirea de module care pot fi implementate folosind module
existente.
Diagrama de structura
Planul testelor de integrare precizeaza ordinea in care vor fi integrate modulele in subsisteme si
apoi subsistemele pana la nivel de sistem precum si testele care vor fi efectuate la integrare.
Principii de modularizare:
o O schimbare mica a cerintelor nu conduce la modificari majore ale arhitecturii software (gruparea
cerintelor corelate in acelasi modul)
1. Un nume prin care poate fi referit. Prin atribuirea de nume sabloanelor de proiectare se
creaza un vocabular de proiectare, un limbaj comun de comunicare si documentare. Alegerea
numelui este importanta deoarece el devine parte din vocabularul de proiectare.
3. Descrierea solutiei. Sunt descrise elementele care compun proiectul, relatiile dintre ele,
responsabilitatile si colaborarile.
Ce realizeaza sablonul
1.TESTAREA PROGRAMELOR
Un test constă în execuţia programului pentru un set de date de intrare convenabil ales, pentru
a verifica dacă rezultatul obţinut este corect.
Un caz de test este un set de date de intrare împreună cu datele de ieşire pe care programul ar
trebui să le producă. Cazurile de test se aleg astfel încât să fie puse în evidenţă, dacă este
posibil, situaţiile de funcţionare necorespunzătoare.
Testarea este activitatea de concepţie a cazurilor de test, de execuţie a testelor şi de evaluare a
rezultatelor testelor, în diferite etape ale ciclului de viaţă al programelor.
Testarea în vederea verificării programului foloseşte date de test alese de participanţii la
procesul de dezvoltare a programului. Ea este efectuată la mai multe nivele: la nivel de unitate
funcţională, de modul, de subsistem, de sistem.
Testarea în vederea validării programului, numită şi testare de acceptare, are drept scop
stabilirea faptului că programul satisface cerinţele viitorilor utilizatori. Ea se efectuează în
mediul în care urmează să funcţioneze programul, deci folosindu-se date reale. Prin testarea de
acceptare pot fi descoperite şi erori, deci se efectuează şi o verificare a programului.
Testarea unui modul este realizată de programatorul care implementează modulul. Toate
celelalte teste sunt efectuate, de persoane care nu au participat la dezvoltarea programului.
Scopul testarii unui modul este de a se stabili ca modulul este o implementare corecta a
specificatiei sale (conforma cu specificatia sa).
In cursul testarii unui modul, modulul este tratat ca o entitate independentă, care nu necesită
prezenţa altor componente ale programului. Testarea izolată a unui modul ridică două probleme:
- simularea modulelor apelate de cel testat;
- simularea modulelor apelante.
Modulele prin care se simulează modulele apelate de modulul testat se numesc module "ciot"
(în engleză, "stub") . Un modul "ciot" are aceeaşi interfaţă cu modulul testat şi realizează în mod
simplificat funcţia sa.
Cazurile de apel ale modulului testat de către celelalte module ale programului sunt
simulate în cadrul unui "modul driver". Modulul driver apelează modulul testat furnizndu-i ca
date de intrare datele de test ale modulului. Datele de test pot fi generate de modulul driver, pot
fi preluate dintr-un fişier sau furnizate de testor într-o manieră interactivă.
2.2. Testele de integrare
Sunt dedicate verificării interacţiunilor dintre module, grupuri de module, subsisteme, până la
nivel de sistem. Există mai multe metode de realizare a testelor de integrare.
Testele de integrare presupun, ca şi testele unitare, realizarea de module "ciot" şi module
"driver". Numărul de module "driver" şi de module "ciot" necesare în testele de integrare
depinde de ordinea în care sunt testate modulele (metoda de integrare). Testele de integrare
necesită de asemenea instrumente de gestiune a versiunilor şi a configuraţiilor.
2.2.1. Metoda "big-bang"
Sunt integrate într-un program executabil toate modulele existente la un moment dat. Modulele
driver" şi "ciot" necesare sunt de asemenea integrate. Metoda este periculoasă căci toate erorile
apar în acelaşi timp şi localizarea lor este dificilă.
2.2.2. Integrare progresiva
Metodele de integrare progresivă sunt mult mai eficiente. In fiecare moment se adaugă
ansamblului de module integrate numai un singur modul. Astfel, erorile care apar la un test
provin din modulul care a fost ultimul integrat.
2.2.2.1. Integrarea ascendentă ("de jos în sus")
Se începe prin testarea modulelor care nu apelează alte module, apoi se adaugă progresiv
module care apelează numai modulele deja testate, până când este asamblat întregul sistem.
Metoda necesită implementarea câte unui modul "driver" pentru fiecare modul al programului (şi
nici un modul "ciot").
Avantajele testării de jos în sus
Nu sunt necesare module ciot. Modulele driver se implementează mult mai uşor decât modulele
ciot. Există chiar instrumente care produc automat module driver.
Dezavantajele testării de jos în sus
1. Programul pe baza căruia se efectuează validarea cerinţelor este disponibil numai după
testarea ultimului modul.
2. Corectarea erorilor descoperite pe parcursul integrării necesită repetarea procesului de
proiectare, codificare şi testare a modulelor. Principalele erori de proiectare sunt descoperite de
abia la sfârşit, când sunt testate modulele principale ale programului. ceea ce, în general,
conduce la reproiectare şi reimplementare.
In alegerea datelor de test trebuie să se elimine redundanţele rezultate din considerarea atât a
claselor de echivalenţă de intrare cât şi a celor de ieşire.
Unele programe tratează datele de intrare în mod secvenţial. În aceste cazuri se pot detecta
erori în program testându-l cu diverse combinaţii ale intrărilor în secvenţă. Metoda de
partiţionare în clase de echivalenţă nu ajută în alegerea unor astfel de combinaţii. Numarul de
combinaţii posibile este foarte mare chiar şi pentru programe mici. De aceea nu pot fi efectuate
teste pentru toate combinaţiile. în aceste cazuri este esenţială experienţa celui care alcătuieşte
setul de cazuri de test. Testarea "cutie neagră" este favorizată de existenţa unei specificaţii
formale a componentei testate.
Se consideră căile care încep cu nodul de intrare şi se termină cu nodul de ieşire. Testarea
structurală constă în execuţia componentei testate pentru date de intrare alese astfel încât să
fie parcurse unele dintre aceste căi. Nu este necesar, şi în general este imposibil, să se
execute toate căile de la intrare la ieşire ale unui program sau ale unei componente program.
Prezenţa ciclurilor conduce la un număr foarte mare (deseori infinit) de căi. De asemenea,
anumite căi sunt ne-executabile.
Testele structurale favorizează evidenţierea următoarelor tipuri de erori logice:
1. Căi absente în graful program - ca urmare a ignorării unor condiţii
(de exemplu: test de împărţire la zero);
2. Selectarea unei căi necorespunzătoare - datorită exprimării
incorecte (de multe ori incomplete) a unei condiţii;
3. Acţiune necorespunzătoare sau absentă(de exemplu: calculul unei valori cu o metodă
incorectă, neatribuirea unei valori unei anumite variabile, apelul unei proceduri cu o listă de
argumente incorectă etc.).
Dintre acestea, cel mai simplu de depistat sunt erorile de tip 3. Pentru descoperirea lor este
suficient să se asigure execuţia tuturor instrucţiunilor programului.
Alegerea căilor de testat are loc pe baza unor “criterii de acoperire” a grafului de control. Dintre
acestea cele mai cunoscute sunt:
Rezultatele experimentale ale testelor statistice uniforme sunt inegale. Ele nu acoperă căile
care corespund tratării excepţiilor. De aceea trebuie completate cu teste folosind date de
intrare în afara domeniului intrărilor.
Testele statistice operaţionale sunt în general teste de fiabilitate. Prin ele nu se urmăreşte în
general descoperirea de erori ci mai ales comportarea programului în timp. Căderile observate
în timpul acestor teste permit estimarea masurilor de fiabilitate, cum ar fi MTBF (Mean Time
Between Failures).
Prin aceste activitati se verifica daca software-ul satisface specificatiile sale, in timpul fiecarei
faze a ciclului sau de dezvoltare.
Se realizeaza:
Verificand ca fiecare articol software indeplineste cerintele specificate;
Verificand fiecare articol software inainte de a fi utilizat ca intrare pentru o alta
activitate;
Asigurand ca fiecare articol software este verificat, pe cat posibil, de o persoana
diferita de aceea care l-a produs;
Asigurand ca efortul de verificare si validare este adecvat pentru ca fiecare articol
software sa fie operational.
Verificarea inseamna:
Actul de a stabili si documenta faptul ca articolele, procesele, serviciile sau
documentele sunt in conformitate cu cerintele specificate. (sunt produsele in conformitate cu
cerintele lor specificate? )
Validarea este, conform definitiei din ANSI/IEEE:
Procesul de a evalua un sistem sau o componenta in timpul sau la sfarsitul procesului
de dezvoltare pentru a determina daca satisface cerintele specificate. (sunt produsele in
conformitate cu cerintele clientului?)
Documentul de cerinte sotware este verificat fata de documentul de cerinte utilizator, conform
sectiunii SR din planul de verificare si validare.
1. Revizii
O revizie este o intrunire in timpul careia un produs sau set de produse este prezentat
personalului care participa la proiect, managerilor, utilizatorilor, clientilor sau altor persoane
interesate, pentru comentarii sau aprobare.
Inainte de intrunire:
o Fiecare membru al echipei studiaza documentele revizuite si inregistreaza fiecare
problema intalnita. Inregistrarea este transmisa autorului documentului revizuit.
o Autorul studiaza problemele care i-au fost transmise si intocmeste un raspuns care
este transmis conducatorului echipei de revizie.
o Acesta le clasifica in: majore, minore, de editare.
In timpul intrunirii:
Se discuta fiecare problema transmisa si se stabileste starea sa:
o Inchisa: a fost rezolvata
o De actualizat: documentul va fi actualizat (modificat)
o Actiune: cu specificarea pers resp si data pana la care documentul tre completat
o Rejectare: problema este inchisa fara actualizare sau actiune
Fiecare intrunire se termina prin:
Obiectivul unei prezentari este de a evalua un element software specific (adica un document
sau modul sursa).
o Se cauta identificarea defectelor si se considera solutiile posibile.
o Spre deosebire de celelalte forme de revizie, prezentarile au si un obiectiv secundar, de
a educa si a rezolva probleme de stil.
1.3. Audituri
Un audit este o revizie independenta efectuata de un grup extern (persoane care nu fac parte
din echipa de dezvoltare).
Obiectivul unui audit este de a verifica faptul ca produsele si procesele software sunt in
conformitate cu standardele, specificatiile si procedurile stabilite.
Verificarile audit pot fi de rutina sau nu.
o Exemple de audituri de rutina sunt cele fizice si functionale efectuate inainte de livrarea
unui software
o Audituri ne-uzuale pot fi initiate de clientul care primeste software-ul sau de echipa de
management sau de asigurare a calitatii din organizatia care produce software-ul.
1.4. Inspectari
Inspectiile software pot fi utilizate pentru detectarea defectelor in proiectul de detaliu inainte
de codare si in cod inainte de testare
Pot fi de asemenea folosite pentru a verifica proiectarea cazurilor de test si a procedurilor de
testare
Sunt eficiente. Pot fi detectate peste 50% din numarul total de defecte introduse in timpul
dezvoltarii
Sunt economice deoarece reduc numarul de defecte si costul eliminarii lor.
Se deosebesc de Parcurgeri prin:
Repetarea procesului pana la atingerea unui nivel de defecte acceptabil
Analiza rezultatelor procesului si transmiterea lor inapoi pentru imbunatatirea produsului
Evitarea discutarii solutiilor in timpul intrunirii si concentrarea pe gasirea defectelor
Verificarea faptului ca defectele au fost corectate si nu au fost introduse alte defecte
2.Urmarie
Urmarirea consta in stabilirea unei relatii intre doua sau mai multe produse ale procesului de
dezvoltare. De exemplu, o relatie intre o cerinta data si elementul din proiect care
implementeaza cerinta.
Urmarirea se face in doua sensuri: Inainte, Inapoi
Urmarirea “Inainte” cere ca fiecare intrare a unei faze sa fie in relatie cu o iesire a fazei.
Se realizeaza cu ajutorul unei matrici in care se reprezinta corespondenta dintre intrari si iesiri.
Pot rezulta “intrari lipsa” sau “posibile duplicate”-intrari care corespund la mai multe iesiri.
Urmarirea “Inapoi” cere ca fiecare iesire a unei faze sa fie in relatie cu o intrare a fazei
respective.
Iesirile care nu au o relatie cu intrarile sunt un semn de eroare, exceptand cazurile in care
intrarile sunt incomplete.
3. Demonstratii formale
Calitatea unui produs este uneori definita ca “ totalitatea caracteristicilor sale prin care el satisface
o serie de necesitati definite sau impuse”.
Calitatea unui produs software este data de « capacitatea sa de a putea fi utilizat eficient, efectiv
si confortabil, de catre un set de utilizatori, pentru un set de scopuri, in conditii specificate ».
Calitatea ceruta pentru un produs software trebuie sa fie definita in documentul de definitie a
cerintelor software (SRD). De asemenea, trebuie specificate definitiile atributelor de calitate,
metodele de masurare si criteriile de acceptare pentru atribute.
Exista multe cerinte de calitate particulare care se incadreaza sau nu in cele din ISO 9126.
Caracteristici de calitate software care afecteaza procesul de inginerie software
Stilul codului
Reutilizabilitatea codului
Modularitatea codului si independenta modulelor
Metrici de complexitate
1. Complexitatea ciclomatica
Utilizeaza Graful de Control al programului. Ipoteza: dificultatea de intelegere a unui program
este in mare masura determinata de complexitatea grafului fluxului de control
Este o masura a dificultatii de testare a modulelor si a fiabilitatii la nivel de modul.
Complexitatea unei entitati este determinata de relatiile dintre partile sale.
Partile unui modul software sunt instructiunile sale. Relatiile dintre ele se bazeaza pe trei
structuri:
Secventa: bloc maximal indivizibil de instructiuni care se executa intotdeauna in aceeasi
ordine
Selectia (conditia)
Iteratia (ciclul). Iteratia poate fi simulata prin salt la o conditie.
Complexitatea ciclomatica este definita pentru un modul pe baza grafului de control al modulului.
McCabe defineste complexitatea ciclomatica a unui graf de control astfel:
v=e-n+2
unde:
e este numarul de arce (edges);
n este numarul de noduri.
Pentru o secventa, v=1. Este necesara o singura executie de test pentru a executa fiecare
instructiune din secventa.
Fiecare salt adaugat la un modul creste complexitatea sa cu 1 si necesita o executie de test
suplimentara pentru testarea sa.
Deci, complexiatea ciclomatica a unui modul da numarul minim de executii de test ale unui
modul, pentru acoperirea tuturor arcelor.
Grafuri de control
Complexitatea proiectarii unui modul, notata de McCabe cu iv, masoara efectul individual al unui
modul asupra proiectului programului.
Complexitatea proiectarii unui modul este evaluata plecand de la graful de control al modulului si
marcand nodurile care contin apeluri de module externe.
5. Complexitatea integrarii
Complexitatea integrarii unui ansamblu de N module, notata de McCabe cu S1,
Este definita astfel:S1 = S 0 - N + 1
Complexitatea integrarii a N module care nu contin ramificatii este deci 1.
Formal, complexitatea integrarii necesita masurarea complexitatii proiectarii
fiecarui modul.
In timpul proiectarii arhitecturale, de regula, nu este disponibil graful fluxului de
control al fiecarui modul. Totusi, ar trebui sa fie disponibila suficienta informatie
pentru a defini complexitatea proiectarii fiecarui modul, chiar fara a cunoaste
logica modulelor.
Figura urmatoare reda o diagrama de structura prin care se ilustreaza cum trebuie evaluata S1
cunoscand doar conditiile de apel ale fiecarei componente, adica fluxul controlului.
Dreptunghiurile corespund componentelor de proiectare iar sagetile marcheaza fluxul
controlului. Prin romb se indica un transfer al controlului conditional:
componenta a apeleaza fie componenta b fie componenta c
componenta b apeleaza secvential componenta d si componenta e
componenta c apeleaza una dintre componentele e, f, g sau nici una
Complexitatea integrarii modulelor reprezentate in diagrama de structura este 5.
Numarul de parametri
Determina puterea cuplarii intre module.
Intelegerea modulelor cu un numar mare de parametri cere mai mult timp si efort.
Modificarea modulelor cu un numar mare de parametri poate avea efecte asupra altor
module.
Numarul de module apelate estimeaza complexitatea intretinerii
Pentru un modul:
Fan-in: numarul de module care il apeleaza
Fan-out: cate module sunt apelate de el
“Fan-in” mare: un numar mare de module depind de el
„Fan-out“ mare: modulul depinde de multe module
Cuplarea prin date
Fie tripletul (p,X,q), unde:
o p si q sunt module
o X este o variabila accesibila din p si q
Cuplarea potentiala prin date:
o X este declarata in ambele, dar nu se verifica accesul la ea
o Reflecta posibilitatea ca p si q sa comunice prin variabila X
Cuplarea prin date utilizate
o p si q utilizeaza X.
o Mai greu de determinat decat cuplarea potentiala. Necesita mai multa informatie
despre logica interna a modulului.
Cuplarea prin date efectiva
o p atribuie o valoare lui X si q o refera.
o Cel mai greu de determinat, dar indica un flux de informatie de la p la q.
Metrici ale coeziunii
Se construieste graful de flux pentru un modul
o Pentru fiecare nod, se inregistreaza variabilele referite in instructiunile din
nod
Se determina cat de multe cai independente ale modulului trec prin fiecare
nod
o Un modul are coeziune mare daca cea mai mare parte a variabilelor sunt
utilizate pe majoritatea cailor
o Cea mai mare coeziune: toate caile independente utilizeaza toate
variabilele din modul