+ All Categories
Home > Documents > 10.1 Maßnahmen der...

10.1 Maßnahmen der...

Date post: 07-Apr-2019
Category:
Upload: lyque
View: 218 times
Download: 0 times
Share this document with a friend
11
Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 75 10 Qualit¨ atssicherung Nach einer Vorlesung von Prof. Andreas Zeller Lehrstuhl Softwaretechnik, Universit¨ at des Saarlandes, Saarbr¨ ucken. Wie stellt man sicher, dass eine hohe Qualit¨at von Software erreicht wird? 10.1 Maßnahmen der Qualit¨ atssicherung Konstruktive Maßnahmen sorgen a priori ur bestimmte Eigenschaften des Produkts oder des Entwicklungsprozesses: Gliederungsschema f¨ ur Pflichtenhefte Einsatz von Programmiersprachen mit statischer Typpr¨ ufung Richtlinien f¨ ur den Entwicklungsprozess Analytische Maßnahmen diagnostizieren a posteriori die Qualit¨ at des Produkts oder des Entwick- lungsprozesses: Programmverifikation Programminspektion Software-Tests 10.2 Grundprinzipien Wir diskutieren die folgenden Grundprinzipien: Unabh¨ angige Qualit¨ atszielbestimmung Quantitative Qualit¨ atssicherung Maximale konstruktive Qualit¨ atssicherung Fr¨ uhzeitige Fehlerentdeckung und -behebung Entwicklungsbegleitende Qualit¨ atssicherung Unabh¨ angige Qualit¨ atssicherung 10.2.1 Unabh¨ angige Qualit¨ atszielbestimmung Prinzip der unabh¨ angigen Qualit¨ atszielbestimmung: Jedes Software-Produkt soll nach seiner Fertigstellung eine zuvor bestimmte Qualit¨ at be- sitzen – unabh¨ angig von Prozess oder Produkt. Kunden und Lieferanten sollen gemeinsam Qualitatsziel bestimmen Ziel: Explizite und transparente Qualit¨ atsbestimmung vor Entwicklungsbeginn.
Transcript
Page 1: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 75

10 Qualitatssicherung

Nach einer Vorlesung von Prof. Andreas Zeller Lehrstuhl Softwaretechnik, Universitat des Saarlandes,Saarbrucken.

Wie stellt man sicher, dass eine hohe Qualitat von Software erreicht wird?

10.1 Maßnahmen der Qualitatssicherung

Konstruktive Maßnahmen sorgen a priori fur bestimmte Eigenschaften des Produkts oder desEntwicklungsprozesses:

• Gliederungsschema fur Pflichtenhefte

• Einsatz von Programmiersprachen mit statischer Typprufung

• Richtlinien fur den Entwicklungsprozess

Analytische Maßnahmen diagnostizieren a posteriori die Qualitat des Produkts oder des Entwick-lungsprozesses:

• Programmverifikation

• Programminspektion

• Software-Tests

10.2 Grundprinzipien

Wir diskutieren die folgenden Grundprinzipien:

• Unabhangige Qualitatszielbestimmung

• Quantitative Qualitatssicherung

• Maximale konstruktive Qualitatssicherung

• Fruhzeitige Fehlerentdeckung und -behebung

• Entwicklungsbegleitende Qualitatssicherung

• Unabhangige Qualitatssicherung

10.2.1 Unabhangige Qualitatszielbestimmung

Prinzip der unabhangigen Qualitatszielbestimmung:

Jedes Software-Produkt soll nach seiner Fertigstellung eine zuvor bestimmte Qualitat be-sitzen – unabhangig von Prozess oder Produkt.

Kunden und Lieferanten sollen gemeinsam Qualitatsziel bestimmen

Ziel: Explizite und transparente Qualitatsbestimmung vor Entwicklungsbeginn.

Page 2: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

76 Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007

10.2.2 Quantitative Qualitatssicherung

Prinzip der quantitativen Qualitatssicherung:

“Ingenieursmaßige Qualitatssicherung ist undenkbar ohne die Quantifizierung von Soll-und Ist-Werten.” (Rombach)

Einsatz von Metriken zur Qualitatsbestimmung

Ziel: Qualitatssteigerung messbar machen.

10.2.3 Maximale konstruktive Qualitatssicherung

Prinzip der maximalen konstruktiven Qualitatssicherung:

“Vorbeugen ist besser als heilen” (Volksmund)

FORTRAN hat Mangel in der konstruktiven Qualitatssicherung:

Der Tippfehler DO 3 I = 1.3 statt DO 3 I = 1,3 fuhrte 1962 zur Zuweisung von 1.3 anDO3I und zum Verlust der amerikanischen Venussonde Mariner-1.

Ziel: Fruhzeitig Fehler vermeiden helfen (durch Einsatz klarer Spezifikationen, geeigneter Program-miersprachen usw.).

10.2.4 Fruhzeitige Fehlerentdeckung und -behebung

Prinzip der fruhzeitigen Fehlerentdeckung und -behebung:

”Je fruher ein Fehler entdeckt wird, desto kostengunstiger kann er behoben werden”

Vergleiche Prozessmodelle – Kosten der Fehlerbehebung verzehnfachen sich pro Phase

Ziel: Fehler mussen so fruh wie moglich erkannt und behoben werden.

10.2.5 Entwicklungsbegleitende Qualitatssicherung

Prinzip der entwicklungsbegleitenden Qualitatssicherung:

Jeder Schritt, jedes Dokument im Entwicklungsprozess ist der Qualitatssicherung unter-worfen.

Ziel: Qualitatssicherung in jedem Schritt der Software-Entwicklung.

10.2.6 Unabhangige Qualitatssicherung

Prinzip der unabhangigen Qualitatssicherung:

“Testing is a destructive process, even a sadistic process” (Myers)

Derjenige, der ein Produkt definiert, entwirft und implementiert, ist am schlechtesten geeignet, dieErgebnisse seiner Tatigkeit destruktiv zu betrachten.

Ziel: eine unabhangige und eigenstandige organisatorische Einheit “Qualitatssicherung”.

Page 3: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 77

10.3 Was ist ein “Fehler”?

Die analytische Qualitatssicherung stutzt sich im allgemeinen auf den Begriff Fehler ab:

• jede Abweichung der tatsachlichen Auspragung eines Qualitatsmerkmals von der vorgesehenenSoll-Auspragung

• jede Inkonsistenz zwischen Spezifikation und Implementierung

• jedes strukturelle Merkmal des Programmtextes, das ein fehlerhaftes Verhalten des Programmsverursacht

Ziel des Testens ist, durch gezielte Programmausfuhrung Fehler zu erkennen.

Program testing can be used to show the presence of bugs, but never to show their absence. (Dijkstra)

Das deutsche Wort Fehler wird fur verschiedene Dinge gebraucht:

1. Der Programmierer macht einen Fehler. . .

2. . . . und hinterlasst einen Fehler im Programmcode.

3. Wird dieser ausgefuhrt, haben wir einen Fehler im Programmzustand. . .

4. der sich als ein Fehler nach außen manifestiert.

Im Englischen spielt diese Rolle das Wort “Bug” (= Kafer, Wanze)

Auszug aus Logbuch des Mark II Computers in Harvard vom 9. September 1945. “First actual caseof bug being found:”

Diese unterschiedlichen “Fehler” werden besser so unterschieden:

1. Der Programmierer begeht einen Irrtum (mistake) . . .

2. . . . und hinterlaßt einen Defekt (defect) im Programmcode.

3. Wird dieser ausgefuhrt, haben wir eine Infektion im Programmzustand . . .

4. der sich als ein Fehlschlagen (failure) nach außen manifestiert.

Page 4: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

78 Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007

10.4 Vom Defekt zum Fehlschlagen

Es gilt: Fehlschlagen ⇒ Infektion ⇒ Defekt (⇒ Irrtum) . . .

. . . aber nicht umgekehrt – nicht jeder Defekt fuhrt zu einem Fehlschlagen.

Dies ist das Kernproblem des Testens!

10.5 Vom Fehlschlagen zum Defekt

Beispiel – Berechnung des Maximums dreier Zahlen:

int max3(int x, int y, int z) {int ret;if (x > y)

ret = x;else

ret = max(y, z);return ret;

}

Fehlschlagen max3(5, 2, 9) liefert 5Infektion ret hat den Wert 5Defekt statt ret = x muss es ret = max(x, z) heißen

Debugging = Schließen von Fehlschlagen auf Defekt

10.6 Welche Testfalle auswahlen?

Ich kann nur eine beschrankte Zahl von Laufen testen – welche soll ich wahlen?

• Funktionale Verfahren: Auswahl nach Eigenschaften der Eingabe oder der Spezifikation

• Strukturtests: Auswahl nach Aufbau des Programms

Ziel im Strukturtest – hohen Uberdeckungsgrad erreichen:

⇒ Testfalle sollen moglichst viele Aspekte der Programmstruktur abdecken (Kontrollfluss, Datenfluss)

Page 5: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 79

10.7 Anwendung: Zeichen zahlen

Das Programm ZaehleZeichen soll

• Zeichen von der Tastatur einlesen, bis ein Zeichen erkannt wird, das kein Großbuchstabe ist

• Die Zahl der eingelesenen Zeichen und Vokale ausgeben

java ZeichenZaehlenBitte Zeichen eingeben: HALLELUJA!Anzahl Vokale: 4Anzahl Zeichen: 9

Process finished with exit code 0

Programm:

import java.io.IOException;

public class ZaehleZeichen {static int vokalAnzahl;static int gesamtAnzahl;

private static void zaehleZeichen () throws IOException {int zeichen;zeichen=System.in.read();while(zeichen>=’A’ && zeichen<=’Z’ && gesamtAnzahl <Integer.MAX_VALUE){

gesamtAnzahl++;if(zeichen==’A’ || zeichen==’E’ || zeichen==’I’ || zeichen==’O’ || zeichen==’U’){

vokalAnzahl++;}zeichen=System.in.read();

}}

public static void main (String[] args) throws IOException{

System.out.print("Bitte Zeichen eingeben: ");System.out.flush();zaehleZeichen();System.out.println("Anzahl Vokale: "+vokalAnzahl);System.out.println("Anzahl Zeichen: "+gesamtAnzahl);

}}

Page 6: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

80 Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007

10.8 Kontrollflussgraph

zeichen=System.in.read();

while(zeichen>='A' && zeichen<='Z'

&& gesamtAnzahl <Integer.MAX_VALUE)

gesamtAnzahl++;

if(zeichen=='A' || zeichen=='E’

|| zeichen=='I' || zeichen=='O'

|| zeichen=='U')

vokalAnzahl++;

zeichen=System.in.read();

10.9 Einfache Uberdeckungsmaße

Eine Menge von Testfallen kann folgende Kriterien erfullen:

• Anweisungsuberdeckung: Jeder Knoten im Kontrollflussgraph muss einmal durchlaufen wer-den (= jede Anweisung wird wenigstens einmal ausgefuhrt)

• Zweiguberdeckung: Jede Kante im Kontrollflussgraph muss einmal durchlaufen werden;schließt Anweisungsuberdeckung ein

• Pfaduberdeckung: Jeder Pfad im Kontrollflussgraphen muss einmal durchlaufen werden

Der Uberdeckungsgrad gibt an, wieviele Anweisungen / Zweige / Pfade durchlaufen wurden.

10.9.1 Anweisungsuberdeckung (C0)

zeichen=System.in.read();

while(zeichen>='A' && zeichen<='Z'

&& gesamtAnzahl <Integer.MAX_VALUE)

gesamtAnzahl++;

if(zeichen=='A' || zeichen=='E’

|| zeichen=='I' || zeichen=='O'

|| zeichen=='U')

vokalAnzahl++;

zeichen=System.in.read();

Page 7: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 81

10.9.2 Zweiguberdeckung (C1)

zeichen=System.in.read();

while(zeichen>='A' && zeichen<='Z'

&& gesamtAnzahl <Integer.MAX_VALUE)

gesamtAnzahl++;

if(zeichen=='A' || zeichen=='E’

|| zeichen=='I' || zeichen=='O'

|| zeichen=='U')

vokalAnzahl++;

zeichen=System.in.read();

Der Zweig (n4,n6) wir nicht notwendig ausgefuhrt.

10.10 Uberdeckung messen

Mit einem Tool wie jcoverage kann man die Anweisungs- und Zweiguberdeckung von Java Program-men messen. (Fur C/C++ gibt es GCOV).

Fur die Eingabe KFZ. ergibt sich die folgende Zahlung:

private static void zaehleZeichen () throws IOException {1 int zeichen;1 zeichen=System.in.read();4 while(zeichen>=’A’ && zeichen<=’Z’

&& gesamtAnzahl <Integer.MAX_VALUE){

3 gesamtAnzahl++;3 if(zeichen==’A’ || zeichen==’E’ || zeichen==’I’

|| zeichen==’O’ || zeichen==’U’){

0 vokalAnzahl++;}

3 zeichen=System.in.read();}

}

93.33% von 15 Zeilen wurden ausgefuhrt.

10.10.1 Zweiguberdeckung messen

Fur die Eingabe KFZ. ergeben sich folgende Zahlen:

93.33% of 15 source lines executed in method zaehleZeichen90.91% of 11 branches executed in method zaehleZeichen36.36% of 11 branches taken at least once100.00% of 10 calls executed in method zaehleZeichen

3 gesamtAnzahl++;

Page 8: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

82 Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007

3 if(zeichen==’A’ || zeichen==’E’ || zeichen==’I’|| zeichen==’O’ || zeichen==’U’)

branch 0 taken = 0%branch 1 taken = 0%branch 2 taken = 0%branch 3 taken = 0%branch 4 taken = 0%branch 5 taken = 100%

Branch 0–4 sind die Einzelbedingungen; Branch 5 ist der else-Fall.

10.11 Anweisungs- und Zweiguberdeckung

Anweisungsuberdeckung

• Notwendiges, aber nicht hinreichendes Testkriterium

• Kann Code finden, der nicht ausfuhrbar ist

• Als eigenstandiges Testverfahren nicht geeignet

• Fehleridentifizierungsquote: 18%

Zweiguberdeckung

• gilt als das minimale Testkriterium

• kann nicht ausfuhrbare Programmzweige finden

• kann haufig durchlaufene Programmzweige finden (Optimierung)

• Fehleridentifikationsquote: 34%

10.11.1 Schwachen der Anweisunguberdeckung

Warum reicht Anweisungsuberdeckung nicht aus?

Wir betrachten den folgenden Code:

x = 1;if (x >= 1) // statt y >= 1

x = x + 1;

Hier wird zwar jede Anweisung einmal ausgefuhrt; die Zweiguberdeckung fordert aber auch die Suchenach einer Alternative (was hier schwerfallt ⇒ Defekt).

Page 9: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 83

10.12 Pfaduberdeckung

zeichen=System.in.read();

while(zeichen>='A' && zeichen<='Z'

&& gesamtAnzahl <Integer.MAX_VALUE)

gesamtAnzahl++;

if(zeichen=='A' || zeichen=='E’

|| zeichen=='I' || zeichen=='O'

|| zeichen=='U')

vokalAnzahl++;

zeichen=System.in.read();

Menge der Pfade P = p(q1 | q2)r ⇒ |P | = 2 Integer.MAX VALUE − 1.

Pfaduberdeckung

• Machtigstes kontrollstrukturorientiertes Testverfahren

• Hochste Fehleridentifizierungsquote

• Keine praktische Bedeutung, da Durchfuhrbarkeit sehr eingeschrankt

Wichtige Variante:Strukturierter Pfadtest (jede Schleife wird wenigstens k-mal durchlaufen)

• Erlaubt die gezielte Uberprufung von Schleifen

• Uberpruft zusatzlich Zweigkombinationen

• Im Gegensatz zum Pfaduberdeckungstest praktikabel

• Fehleridentifikationsquote: um 65% (Strukturierter Pfadtest)

10.13 Qualitatssicherung durch Menschen

Wir betrachten nun Verfahren, in denen Menschen die Qualitat sichern:

• Eine Programminspektion ist ein formales Verfahren, in dem ein Programm durch andere Perso-nen als den Autor auf Probleme untersucht wird.

• Review und Walkthrough sind vereinfachte Formen der Inspektion.

• Pair Programming ist eine Form des kontinuierlichen Gegenlesens.

10.13.1 Programminspektion

1. Eine Inspektion wird durch den Autor ausgelost, sein Produkt zu uberprufen. Dies geschiehttypischerweise zur Freigabe fur eine weitere Entwicklungsaktivitat.

2. Das Programm wird von mehreren Gutachtern beurteilt, wobei jeder Gutachter sich auf einenoder mehrere Aspekte konzentriert.

Page 10: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

84 Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007

3. Jeder Gutachter pruft das Produkt anhand von Referenz-Dokumenten (etwa die Spezifikation)und notiert Erkenntnisse

4. In einer gemeinsamen Sitzung aller Gutachter mit einem ausgebildeten Moderator werden ge-fundene und neu entdeckte Fehler protokolliert.Losungen werden nicht diskutiert.

Ergebnis der Programminspektion

1. Ergebnis ist ein formalisiertes Inspektionsprotokoll mit Fehlerklassifizierung

2. Außerdem werden Statistiken (Inspektionsmetriken) uber die Fehlerhaufigkeit erstellt, die zurVerbesserung des Entwicklungsprozesses dienen

3. Der Autor uberarbeitet das Produkt anhand der neuen Erkenntnisse.

4. Der Moderator gibt das Produkt frei oder weist es zuruck

Details der Programminspektion

1. Der Inspektionsaufwand (individuelle Prufzeiten, Zeit fur die gemeinsame Sitzung) muss einge-plant sein

2. Inspektionen haben hohe Prioritat; d.h. sie sind kurzfristig einzuberufen

3. Inspektionsergebnisse durfen nicht zur Beurteilung von Mitarbeitern eingesetzt werden

4. Vorgesetzte und Zuhorer durfen an den Inspektionen nicht teilnehmen

Was bringt die Programminspektion?

1. Prufaufwand liegt bei 15 bis 20% des Erstellungsaufwands

2. 60 bis 70% der Fehler konnen in einem Dokument gefunden werden

3. Nettonutzen bei 20% in der Entwicklung, 30% in der Wartung

“Der Return on investment ist bei Inspektionen wesentlich besser als bei anderen Investitionen.”(Balzert)

10.13.2 Varianten der Programminspektion

Ein Review ist eine weniger formale manuelle Prufmethode (kein definierter Ablauf, informales Inspek-tionsprotokoll).

• Nutzen bei Fehlersuche ahnlich wie bei formalen Inspektionen

• Verbesserungen im Entwicklungsprozess nur indirekt

Ein Walkthrough ist eine weiter abgeschwachte Form, in der der Autor das Prufobjekt Schritt furSchritt vorstellt. Die Gutachter stellen spontane Fragen, und versuchen so, Probleme zu identifizieren.

• Geringer Aufwand

• aber wesentlich schlechterer Nutzen

• geeignet fur “unkritische” Dokumente

Page 11: 10.1 Maßnahmen der Qualit¨atssicherungab.inf.uni-tuebingen.de/teaching/ss07/soft/script/10_qualitaet_25... · Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A.

Software Engineering, SoSe’07, WSI, D. Huson, (Original Author: A. Zeller), 25. Juni 2007 85

10.13.3 Pair Programming

Im pair programming (Paar-Programmierung) arbeiten zwei Programmier Seite an Seite an einemRechner, um Programme zu entwerfen, implementieren und zu testen.

Ein Programmierer “fahrt” (halt die Tastatur oder macht Notizen), der andere ist “Beifahrer” (begut-achtet die Arbeit). Der Beifahrer nimmt aktiv teil am Geschehen. Diese Rollen werden kontinuierlichgewechselt.

Durch das kontinuierliche Begutachten werden Fehler und Alternativen fruhestmoglich erkannt

Ist ein Kontinuierliches Review-Verfahren.

Ergebnisse des Pair Programming

Erste Studien zeigen, dass sich der doppelte Personalaufwand auszahlt. Paare . . .

• . . . benotigen einen 100% hoheren Personalaufwand

• . . . reduzieren die Codierungszeit hingegen um 40–50%

• . . . verbessern die Codequalitat (z.B. 94,4% bestandene Testfalle statt 78,1% bei Individuen)

Grundregeln des Pair Programming

• Beide Programmierer sind gleichermaßen verantwortlich fur ihre Arbeit.

• Es gibt keine individuelle Schuld (kein “Du hast hier aber einen Fehler gemacht”, sondern “Wirhaben alle Tests bestanden”).

• Weil der Partner dabei ist, muss man sich auf das Ziel konzentrieren (und nicht auf die e-mailusw.)

• Egoless programming ist hilfreich (der eigenen Schwachen bewußt sein, keine ubermaßige Iden-tifizierung mit dem “eigenen” Code)

• Pausen einplanen! Pair programming ist anstrengend.

Pair programming ist eine Technik des extreme programming.


Recommended