Software Testing und Qualitätssicherung

Post on 26-Jun-2015

1.536 views 0 download

Transcript of Software Testing und Qualitätssicherung

Software Technik

Christian Baranowski

HTWG Konstanz

Software Testing

Requirement Analysis

Testing

System Design

Coding

Delivery

Wasserfallmodell

WiederholungGrundlagen Software

Qualitätssicherung

Was ist Software Qualität ?Funktionalität

Benutzbarkeit

Zuverlässigkeit

Portabilität

Wartbarkeit

Effizienz

Was soll sichergestellt werden?

Fehlerwirkung (Failure)Nach außen sichtbare Fehlverhalten

Fehlerzustand (Bug)Zustand in der Anwendung der zu einer Fehlerwirkung führen kann.

Fehlhandlung (Error, Misstake)Irrtum bei der Software-Entwicklung.

FehlermaskierungWirkung eines Fehlers (Fehlerzustand) ist nach außen nicht sichtbar, weil er durch einen weiteren Fehler verborgen (überlagert / maskiert) wird.

Wege zu guter Software

analytische Qualitätssicherung

konstruktive Qualitätssicherung

Methoden die dazu dienen eine Anwendung strukturiert (analytisch) nach Fehlerwirkungen, Fehlerzuständen und Fehlermaskierung zu untersuchen. Die Qualität wird gemessen. Anzahl der Fehlerwirkungen, Fehlerzuständen und Fehlermaskierung bestimmt.

Methoden die dazu dienen die Wahrscheinlichkeit für Fehlhandlungen zu minimieren. D.h. die Methoden führen dazu dass es zu einer geringeren Fehlerwahrscheinlichkeit im Projekt kommt.

Software Tests

Fragestellung beim Testen

ValidationIst es die richtige Software?

VerifikationDie Software ist richtig!

TestIst die Software richtig?

DebuggingWarum ist die Software nicht richtig?

• dynamische Testverfahren

• statische Testverfahren

Testmethoden

• Black-Box Testen

• Gray-Box Testen

•White-Box Testen

Testmethoden

Testmethoden

Client tier Presentation tier Business logic tier

GU

I

Clie

nt lo

gic

Mar

shal

ling

De-

Mar

shal

ling

Pre

sent

atio

n

Ser

ializ

atio

n

De-

Ser

ializ

atio

n

Bus

ines

s lo

gic

O/R

map

ping

Database tier

Modul / Komponententest

Integrationstest

Systemtest

SUT (System Under Test)

Systemtest

Komponententest

Integrationstest

Testmethoden

Kosten zur Fehlerbehebung

Anforderungsanalyse Systementwurf Umsetzung Integrationstest Systemtest Betrieb

Kosten (€)

Fehler frühzeitig in einem Projekt (Entwicklungsprozess) zu finden spart Geld !!!

Komponententests (Modultests) und Testabdeckung

Komponententest Charakter •Was wird getestet ? (Testobjekt)

-Klasse / Komponente (mehre Klassen mit definierter Schnittstelle)

•Wer testet? (Tester)

-Entwickler (White-Box / Gray-Box) / Tester (Black-Box)

•Welche Qualitätseigenschaft (ISO9126) wird geprüft?

-Funktionalität, Robustheit, Effizienz

•Mit welchen Werkzeugen wird getestet?

-xUnit Frameworks und Coverage Messung z.B. Cobertura, Emma

Test Design Pattern vier Phasen Test

Setup SUT in einen definierten Zustand bringen.

ExerciseSUT aufrufen mit Test Parametern (Daten).

Verify Prüfen ob das SUT im erwarteten Zustand ist.

Teardown SUT und Testumgebung aufräumen.

JUnitpublic class QuicksortTest {

! Quicksort<Integer> quicksortSUT;

! @Before! public void setUp() {! ! quicksortSUT = new Quicksort<Integer>(new IntComperator());! }

! @Test! public void testSort() throws Exception {! ! quicksortSUT.sort(new Integer[] { 5, 8, 2, 4, 7 });! ! assertArrayEquals(new Integer[] { 2, 4, 5, 7, 8 }, values);! }

! @After! public void tearDown() {! ! quicksortSUT = null;! }

}

Phase 1: Setup

Phase 2: Exercise

Phase 3: Verify

Phase 4: tearDown

White-Box Testen

Test Coverage / Testabdeckung

Testabdeckung

„Als Testabdeckung bezeichnet man das Verhältnis an tatsächlich getroffenen Aussagen eines Tests gegenüber den theoretisch möglich treffbaren Aussagen bzw. der Menge der gewünschten treffbaren Aussagen.“ - Wikipedia

Testabdeckung (100 %)public boolean aAndbOrC(boolean A, boolean B, boolean C) {! return (A && B) || C;}

Erwartet A B Cfalse false false falsetrue false false truefalse false true falsetrue false true truefalse true false falsetrue true false truetrue true true falsetrue true true true

vollständige Testabdeckung

„Eine vollständige Testabdeckung stellt eine Ausnahme dar, weil die Anzahl möglicher Testfälle sehr schnell ungeheuer groß wird (durch kombinatorische Explosion). Ein vollständiger Funktionstest für eine einfache Funktion, die zwei 16-Bit-Werte als Argument erhält, würde schon 2^(16+16), also ca. 4 Milliarden Testfälle bedeuten, um die Spezifikation vollständig zu testen.“ - Wikipedia

Testabdeckung beim White-Box Testen

Statement Coverage (Anweisungsüberdeckung)

public static boolean aAndBOrC(boolean A, boolean B, boolean C) { if(A && B){ return true; } else if(C) { return true; } else { return false; } }

Statement Coverage (Anweisungsüberdeckung)

A && B true

C true

false

Statement Coverage (Anweisungsüberdeckung)

A && B true

C true

false

Erwartet A B C

true true true false

1.

1.

Statement Coverage (Anweisungsüberdeckung)

A && B true

C true

false

Erwartet A B C

true true true false

true false false true

1.

2. 1.

2.

Statement Coverage (Anweisungsüberdeckung)100 %

A && B true

C true

false

Erwartet A B C

true true true false

true false false true

false false false false

1.

2.3.

1.

2.

3.

Statement Coverage (Anweisungsüberdeckung)

public static boolean aAndBOrC(boolean A, boolean B, boolean C) { if(A && B || C){ return true; } else { return false; } }

Statement Coverage (Anweisungsüberdeckung)100%

A && B || C true

false

Erwartet A B C

true false false true

false false false false

1.

2.

1.

2.

Statement Coverage (Anweisungsüberdeckung)

public static int sum(int values[], int offset){ int result = 0; for (int value : values) { if(offset > 0){ if(offset < value) result += offset; } result += value; } return result; }

Statement Coverage (Anweisungsüberdeckung)100%

result = 0

for (value : values)

offset > 0 offset < value

result += value

return result

result += offset

Erwartet values offset

3 [2] 1

Statement Coverage (Anweisungsüberdeckung)100 %

result = 0

for (value : values)

offset > 0 offset < value

result += value

return result

result += offset

Erwartet values offset

3 [2] 1

Branch Coverage 100 % (Zweigabdeckung)

result = 0

for (value : values)

offset > 0 offset < value

result += value

return result

result += offset Erwartet values offset

3 [2] 1

2 [2] 0

2 [2] 2

100% Pfadabdeckung

100 % Pfadabdeckung wird in der Regel nicht erreicht (halting problem)

Testabdeckung automatisiert bestimmen

Übung 1I

•Erstellen Sie einen Unit Test für die Demo Quicksort Implementierung

•Messen Sie die Code Abdeckung in Eclipse

Black-Box Testen

Äquivalenzklassenbildung

„Ziel der Äquivalenzklassenbildung ist es, Äquivalenzklassen zu bilden und so eine hohe Fehlerentdeckungsrate mit einer möglichst geringen Anzahl von Testfällen zu erreichen.“ - Wikipedia

Äquivalenzklassenbildung Beispiel Artikel verkaufen

ÄquivalenzklassenbildungParameter Äquivalenzklasse Repräsentant

Basar Nummer gÄK1_01: [0,...,MAX_LONG] 100Basar Nummer

uÄK1_02: [-MAX_LONG,..., 0[uÄK1_03: NaN

-1„abc“

Preis gÄK2_01: [0,...,MAX_LONG]gÄK2_02: X,50 | X = [0,..., MAX_LONG]gÄK2_03: X,5 | X = [0,..., MAX_LONG]gÄK2_04: X,00 | X = [0,..., MAX_LONG]

100,500,511,00

Preis

uÄK2_05: [-MAX_LONG,...,0]uÄK2_06: X,Y | X = [-MAX_LONG,..., 0[ Y = [-MAX_LONG,..., MAX_LONG]uÄK2_07: X,Y | X = [0,..., MAX_LONG] Y = ]0,..., 5[uÄK2_08: X,Y | X = [0,..., MAX_LONG] Y = ]5,..., 50[uÄK2_09: X,Y | X = [0,..., MAX_LONG] Y = ]50,..., MAX_LONG[uÄK2_10: X,Y | X = [0,..., MAX_LONG] Y = NaNuÄK2_11: NaNuÄK2_12: X,Y | X = NaN Y = [0,..., MAX_LONG]

-1-1,100

100,2

100,40

100,510

100,“abc„

“abc„

“abc„,50

BeschreibunggÄK3_01: [NULL...TEXT] “abc„

Äquivalenzklassenbildungabgeleitete TestfälleTestfall Basar Nummer Preis Beschreibung Summe (hinzugefügt)

1 100 10 abc 10 Euro

2 100 0,50 abc 0,50 Euro

3 100 0,5 abc 0,50 Euro

4 100 11,00 abc 11,00 Euro

5 -1 10 abc 0,00 Euro

6 abc 10 abc 0,00 Euro

7 100 -1 abc 0,00 Euro

8 100 -1,100 abc 0,00 Euro

9 100 100,2 abc 0,00 Euro

10 100 100,40 abc 0,00 Euro

11 100 100,510 abc 0,00 Euro

12 100 100,abc abc 0,00 Euro

13 100 abc abc 0,00 Euro

14 100 abc,50 abc 0,00 Euro

Tipp: gute Tester nutzen Sonderzeichen z.B. &“§$%äöü nicht abc!!!

Statische TestverfahrenCode Reviews

Walkthrough

•Autor stellt seinen Code Dokument vor.

•Autor ist der Moderator

•Vorteile:

•Wenig Vorbereitungsaufwand

•Prüfung findet durch spontane Fragen statt.

Inspektion•Formalste Form eines Review

•oft formale Vorprüfung

•Gutachter bekommen die Dokumente vorab

•Gutachter prüfen erst einzeln

•Anschließende Sitzung mit Autor, Gutachtern und Moderator

Technisches Review•Autor nimmt am Review nicht teil

•Gutachter stimmen ab

•Prüfen gegen Spezifikation

•Gutachter prüfen einzeln vorab

Informelles Review

•Gutachter bekommt Dokument zum lesen und gibt schriftliche Rückmeldung

Zusammenfassung Reviews

Grad der Formalisierung

geringster höchsten mittel gering

AnwesendAutorPrüfer

AutorGutachterModerator

GutachterModerator

einzelne Gutachter

AnwendbarkeitCode

DokumenteLernen

Dokumente Dokumente CodeDokumente

Vorbereitung kaum Formale Prüfung Formale Prüfung kaum

Walkthrough Inspektion TechnischesReview

InformellesReview

Statische TestverfahrenNamens Konventionen

Namens Konventionen

• Klassennamen • beginnt mit einem Großbuchstaben, danach in Kleinbuchstaben

weiter • beginnt ein neuer wesentlicher Teil des Klassennamens, wird er

mit einem Großbuchstaben verdeutlicht

• Beispiele• Color, Button, TextField, String

Namens Konventionen

• Methodennamen • beginnt mit einem Kleinbuchstaben, weiter klein geschrieben• beginnt ein neuer wesentlicher Teil wird er mit einem

Großbuchstaben verdeutlicht

• Beispiele• equals(), setColor(), drawOval()...

Namens Konventionen

• Konstantennamen • komplett in Großbuchstaben

• Beispiele• LEFT, PI, BLOD

Integrationsstrategien

Test A Test B

Test C

Test D Test E

Test F

Test G Test A- G

Big-bang

Integrationsstrategien

Test C Test E Test F Test G

Test A- G

Test B, E, F

Test D, G

Bottom-up

Integrationsstrategien

DatabaseSeller DAOTest Treiber

Setup

execute

verify

SUT

Integrationsstrategien

Integrationsstrategien

Test A

Test A, B, C, D

Test A- G

Top-down

Top-Down Integrationstest Pattern Test Doubles

gesamtes SUT dieses soll ohne die DB geprüft werden

Top-Down Integrationstest Pattern Test Doubles

Test Doubles:- Dummy- Mock Object

TOP Down Integration

Integrationsstrategien

Backbone Integration

IntegrationsstrategienContinuous Integration

betrachten wir noch in einer der folgendenVorlesung

Integrationstests

Test Charakterisierung

•Was wird getestet ? (Testobjekt)

•Wer testet? (Tester)

•Welche Qualitätseigenschaft (ISO9126) wird geprüft?

•Mit welchen Werkzeugen wird getestet?

Integrationstest Charakter •Was wird getestet ? (Testobjekt)

-Zusammenspiel von zwei oder mehrere Module.-Passen die Schnittstellen?

•Wer testet? (Tester)

-Entwickler (White-Box / Gray-Box) / dezidierte Tester (Black-Box)

•Welche Qualitätseigenschaft (ISO9126) wird geprüft?

-Robustheit, Portabilität,Funktionalität, Wartbarkeit, Effizienz

•Mit welchen Werkzeugen wird getestet?

-JUnit, DBunit, Mocking Frameworks

Systemtests Charakter •Was wird getestet ? (Testobjekt)

-komplettes System (vollständiger Integrationstest)-bis zur Systemgrenze

•Wer testet? (Tester)

- dezidierte Tester (Black-Box)

•Welche Qualitätseigenschaft (ISO9126) wird geprüft?

-Funktionalität, Effizienz, Benutzbarkeit, Robustheit, Portabilität

•Mit welchen Werkzeugen wird getestet?

-JUnit, FIT, Selenium ... HP Test Runner, GUIdancer ...

funktionale Systemtest / Akzeptanztests mit FIT

Überblick Fit Framework for Integrated Tests

FIT wurde entwickelt von Ward Cunningham WIKI-Erfinder...

Motivation von Fit Tests

• Automatisierung von Akzeptanztests mittels Tabellen.

• Framework für Datengetriebene Tests – Data-Driven-Test (xUnit Test Patterns - Gerard Meszaros)

Testen mit Fit TabellenFit Tests für einen Beispiel Zinsrechner

Betrag

10

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Betrag Zinssatz

10 2,5

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Betrag Zinssatz Laufzeit

10 2,5 2

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Betrag Zinssatz Laufzeit Summe

10 2,5 2 10,51

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Betrag Zinssatz Laufzeit Summe()

10 2,5 2 10,51

Eingehende - Werte Prüfung eines Ergebnis

Testfall

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Betrag Zinssatz Laufzeit Summe()

10 2,5 2 10,51

10 10 3 25,94

10 10 10 100000

... ... ... ...

Testfälle

Testen mit Fit TabellenFit Tests als Column Test Tabelle

Gelb =Ausnahme - Fehler im Test

Grün = erfolgreicher Test

Rot = Fehler in der Anwendung

Testen mit Fit TabellenFit Test als Action Tabelle

fit.Ac?onFixturefit.Ac?onFixturefit.Ac?onFixture

start ZinsenAc(onFixtureZinsenAc(onFixture

enter Betrag 10

enter Zinssatz 2,5

enter Laufzeit 2

press SubmitSubmit

check Summe 10,51

Anbindung an die Applikation (Java)

Argumente

Objekt / Auswahl / Target

Testfall

Befehle / Kommandos

Testen mit Fit TabellenFit Test als Action Tabelle

Prüfung

Eingaben

Aktion - Zinsen Berechnen

Anwendung Starten

Fit Designdrei Klassen Framework

Fit Tabellen und Applikation verknüpfen

Fit Tabellen und Applikation verknüpfen

onlinerechner.ZinsenFixtureonlinerechner.ZinsenFixtureonlinerechner.ZinsenFixtureonlinerechner.ZinsenFixtureBetrag Zinssatz Laufzeit Summe()10 2,5 2 10,5110 10 3 25,9420 10 10 100000... ... ... ...

Fit Tabellen und Applikation verknüpfen

SUTAnbindung an SUT

Fit Tabellen und Applikation verknüpfen

public class ZinsenFixture extends ColumnFixture {

private Zinsen zinsen = new Zinsen();

public double betrag; public double zinsatz; public double laufzeit;

public double summe() { zinsen.setBetrag(betrag); zinsen.setLaufzeit(laufzeit); zinsen.setZinssatz(zinsatz); return zinsen.berechneZinsen(); } }

Eingehende - Werte

SUT

Prüfung - Ausgabe

Basis Klasse für Fit Extension

Anbindung an SUT

Fit Tabellen und Applikation verknüpfen

fit.Ac?onFixturefit.Ac?onFixturefit.Ac?onFixture

start onlinerechner.ZinsenAc(onFixtureonlinerechner.ZinsenAc(onFixture

enter Betrag 10

enter Zinssatz 2,5

enter Laufzeit 2

press berechneZinsenberechneZinsen

check Summe 10,51

GOF - Dekorierer-Muster

Fit Tabellen und Applikation verknüpfen

Fit Tabellen und Applikation verknüpfen

public class ZinsenActionFixture extends Fixture { Zinsen zinsen = new Zinsen(); double summe; public void betrag(double betrag) { zinsen.setBetrag(betrag); }… public void berechneZinsen() { summe = zinsen.berechneZinsen(); } public double summe() { return summe; }}

Eingaben / Enter

Aktion / Press

Ausgabe Prüfung / Check

OberflächentestsEinführung in Selenium

Selenium Core

Selenium IDE

Selenium RC

Selenium Core

open /JugsBase/zinsrechner.jsp

type betrag 20.0

type zinsatz 22.0

type laufzeit 100.0

clickAndWait submit

assertTextPresent 8649939365.27  Euro

Action - TabelleSelenium Befehl

Target

Argumente

am Beispiel eines Zinsrechner

Selenium IDECapture & Replay Tests mit Selenium

Action Tabelle

Selenium Remote ControlAnbindung Selenium in Java Code als Test Treiber

JAVA, PHP...

Selenium Server

Selenium Core

HTTP Proxy SUTWebapplikation

BrowserFirefox, IE

Übung 1I

•Erweitern Sie den Basar FIT Test so dass auch für den zweiten Kunden mehre Buchung durchgeführt werden.