SlideShare ist ein Scribd-Unternehmen logo
1 von 91
Downloaden Sie, um offline zu lesen
Software Technik
            HTWG Konstanz




                   Software Testing



                            Christian Baranowski
Requirement Analysis          Wasserfallmodell

              System Design



                          Coding



                                   Testing



                                             Delivery
Wiederholung
Grundlagen Software
 Qualitätssicherung
Was ist Software Qualität ?
                                    Funktionalität
              Effizienz




Wartbarkeit
                                                     Zuverlässigkeit




                     Portabilität   Benutzbarkeit
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.


  Fehlermaskierung
  Wirkung 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
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                      konstruktive
Fehlermaskierung bestimmt.
                                                               Qualitätssicherung


                                 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

      Validation                               Test                        Verifikation
Ist es die richtige Software?         Ist die Software richtig?         Die Software ist richtig!




                                          Debugging
                                Warum ist die Software nicht richtig?
Testmethoden

• dynamische Testverfahren

• statische Testverfahren
Testmethoden

• Black-Box Testen

• Gray-Box Testen

• White-Box Testen
Testmethoden
                                                       SUT (System Under Test)


         Client tier                        Presentation tier                                 Business logic tier                                      Database tier




                                                                                               De-Serialization
                                          De-Marshalling




                                                                                                                  Business logic

                                                                                                                                   O/R mapping
                                                           Presentation


                                                                          Serialization
                            Marshalling
             Client logic
   GUI




Modul /
Komponententest
                                                                                                                                                 Integrationstest
                                                                                          Systemtest
Testmethoden

    Komponententest



              Integrationstest



                            Systemtest
Kosten zur Fehlerbehebung
  Kosten (€)



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




  Anforderungsanalyse   Systementwurf   Umsetzung   Integrationstest   Systemtest   Betrieb
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.

                      Exercise
        SUT aufrufen mit Test Parametern (Daten).


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


                      Teardown
            SUT und Testumgebung aufräumen.
JUnit
public class QuicksortTest {

! Quicksort<Integer> quicksortSUT;          Phase 1: Setup

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

!   @Test                                        Phase 2: Exercise
!   public void testSort() throws Exception {
!   ! quicksortSUT.sort(new Integer[] { 5, 8, 2, 4, 7 });
!   ! assertArrayEquals(new Integer[] { 2, 4, 5, 7, 8 }, values);
!   }
                              Phase 3: Verify
!   @After
!   public void tearDown() {
!   ! quicksortSUT = null;
!   }                            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               C
      false          false           false           false
      true           false           false           true
      false          false           true            false
      true           false           true            true
      false          true            false           false
      true           true            false           true
      true           true            true            false
      true           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)

         1.
A && B               true        Erwartet    A      B      C

                            1.     true     true   true   false
  C           true



 false
Statement Coverage (Anweisungsüberdeckung)

              1.
A && B                    true        Erwartet    A       B       C

         2.                      1.     true     true    true    false
  C                true
                                 2.     true     false   false   true


 false
Statement Coverage (Anweisungsüberdeckung)
100 %
               1.
 A && B                    true
                                       Erwartet    A       B       C

          2.                      1.     true     true    true    false
3. C                true
                                  2.     true     false   false   true

                                  3.     false    false   false   false
  false
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%
               1.
 A && B || C        true        Erwartet    A       B       C

2.
     false
                           1.     true     false   false   true

                           2.     false    false   false   false
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)


                                                  Erwartet values   offset
     offset > 0         offset < value


                                                     3       [2]      1
                               result += offset


  result += value




   return result
Statement Coverage (Anweisungsüberdeckung)
100 %
     result = 0




 for (value : values)


                                                  Erwartet values   offset
     offset > 0         offset < value


                                                     3       [2]      1
                               result += offset


  result += value




   return result
Branch Coverage 100 % (Zweigabdeckung)

      result = 0




  for (value : values)




      offset > 0         offset < value




                                result += offset   Erwartet values   offset

   result += value                                    3       [2]      1
                                                      2       [2]      0
    return result
                                                      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
Äquivalenzklassenbildung
   Parameter                     Äquivalenzklasse                     Repräsentant
 Basar Nummer    gÄK1_01: [0,...,MAX_LONG]                      100

                 uÄK1_02: [-MAX_LONG,..., 0[                    -1
                 uÄK1_03: NaN                                   „abc“

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

                 uÄK2_05: [-MAX_LONG,...,0]                     -1
                 uÄK2_06: X,Y | X = [-MAX_LONG,..., 0[          -1,100
                                Y = [-MAX_LONG,..., MAX_LONG]
                 uÄK2_07: X,Y | X = [0,..., MAX_LONG]           100,2
                                Y = ]0,..., 5[
                 uÄK2_08: X,Y | X = [0,..., MAX_LONG]           100,40
                                Y = ]5,..., 50[
                 uÄK2_09: X,Y | X = [0,..., MAX_LONG]           100,510
                                Y = ]50,..., MAX_LONG[
                 uÄK2_10: X,Y | X = [0,..., MAX_LONG]           100,“abc„
                                Y = NaN
                 uÄK2_11: NaN                                   “abc„
                 uÄK2_12: X,Y | X = NaN
                                Y = [0,..., MAX_LONG]           “abc„,50

  Beschreibung
                 gÄK3_01: [NULL...TEXT]                         “abc„
Äquivalenzklassenbildung
abgeleitete Testfälle
Testfall   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 Testverfahren
Code 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
                 geringster      höchsten          mittel         gering
Formalisierung
                                 Autor
                   Autor                         Gutachter       einzelne
  Anwesend                      Gutachter
                   Prüfer                        Moderator      Gutachter
                                Moderator
                   Code
                                                                  Code
Anwendbarkeit    Dokumente     Dokumente        Dokumente
                                                                Dokumente
                  Lernen

Vorbereitung       kaum       Formale Prüfung Formale Prüfung     kaum

             Walkthrough Inspektion Technisches Informelles
                                    Review      Review
Statische Testverfahren
Namens 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
                 Big-bang


               Test A        Test B

      Test G        Test              Test C
                    A- G
        Test F                 Test D
                    Test E
Integrationsstrategien
                     Bottom-up

                      Test
                      A- G


                      Test              Test
                     B, E, F            D, G


   Test C   Test E             Test F   Test G
Integrationsstrategien


                 Setup
  Test Treiber   execute   Seller DAO         Database

                 verify
                                        SUT
Integrationsstrategien
Integrationsstrategien
             Top-down

                 Test
                  A


                  Test
               A, B, C, D


                 Test
                 A- G
Top-Down Integrationstest Pattern
Test Doubles
gesamtes SUT
dieses soll ohne die
DB geprüft werden
Top-Down Integrationstest Pattern
Test Doubles           TOP Down Integration



Test Doubles:
- Dummy
- Mock Object
Integrationsstrategien
 Backbone Integration
Integrationsstrategien
   Continuous Integration




       betrachten wir noch in einer der folgenden
       Vorlesung
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 und Akzeptanztests
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 Tabellen
 Fit Tests für einen Beispiel Zinsrechner
Testen mit Fit Tabellen
            Fit Tests als Column Test Tabelle


   Betrag
    10
Testen mit Fit Tabellen
             Fit Tests als Column Test Tabelle


    Betrag          Zinssatz
     10               2,5
Testen mit Fit Tabellen
            Fit Tests als Column Test Tabelle


   Betrag       Zinssatz    Laufzeit
    10            2,5          2
Testen mit Fit Tabellen
           Fit Tests als Column Test Tabelle


  Betrag    Zinssatz   Laufzeit   Summe
   10         2,5         2       10,51
Testen mit Fit Tabellen
                    Fit Tests als Column Test Tabelle
                                       Prüfung eines Ergebnis
      Eingehende - Werte


           Betrag    Zinssatz   Laufzeit   Summe()
Testfall    10         2,5         2         10,51
Testen mit Fit Tabellen
           Fit 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 Tabellen
         Fit Tests als Column Test Tabelle


                                 Rot = Fehler in der Anwendung




    Gelb =Ausnahme - Fehler im Test
                                       Grün = erfolgreicher Test
Testen mit Fit Tabellen
                Fit Test als Action Tabelle

     Befehle / Kommandos
               fit.Ac?onFixture Anbindung an die Applikation (Java)
               start       ZinsenAc(onFixture
               enter       Betrag               10        Argumente
               enter       Zinssatz             2,5
    Testfall
               enter       Laufzeit             2
               press       Submit
               check       Summe                10,51
                                      Objekt / Auswahl / Target
Testen mit Fit Tabellen
         Fit Test als Action Tabelle


                          Anwendung Starten

                          Eingaben


                          Aktion - Zinsen Berechnen

                          Prüfung
Fit Design
     drei Klassen Framework
Fit Tabellen und Applikation
verknüpfen
Fit Tabellen und Applikation
verknüpfen
    onlinerechner.ZinsenFixture
    Betrag     Zinssatz Laufzeit   Summe()
    10         2,5        2        10,51
    10         10         3        25,94
    20         10         10       100000
    ...        ...        ...      ...
Fit Tabellen und Applikation
verknüpfen

             Anbindung an SUT   SUT
Fit Tabellen und Applikation
verknüpfen
    public class ZinsenFixture extends ColumnFixture {   Basis Klasse
                                                         für
           private Zinsen zinsen = new Zinsen();         Fit Extension

           public double betrag;              SUT
           public double zinsatz;
           public double laufzeit;            Eingehende - Werte

           public double summe() {                 Prüfung - Ausgabe
                   zinsen.setBetrag(betrag);
                   zinsen.setLaufzeit(laufzeit);
                   zinsen.setZinssatz(zinsatz);        Anbindung
                   return zinsen.berechneZinsen();     an SUT
           }
    }
Fit Tabellen und Applikation
verknüpfen
    fit.Ac?onFixture        GOF - Dekorierer-Muster

    start       onlinerechner.ZinsenAc(onFixture
    enter       Betrag                          10
    enter       Zinssatz                        2,5
    enter       Laufzeit                        2
    press       berechneZinsen
    check       Summe                           10,51
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);         Eingaben / Enter
           }
    …
           public void berechneZinsen() {          Aktion / Press
                   summe = zinsen.berechneZinsen();
           }
           public double summe() {
                   return summe;          Ausgabe Prüfung / Check
           }
    }
Oberflächentests
Einführung in Selenium
                Selenium Core




     Selenium                   Selenium RC
        IDE
Selenium Core
am Beispiel eines Zinsrechner

                                Action - Tabelle
 Selenium Befehl
 open                /JugsBase/zinsrechner.jsp     Argumente
 type                betrag                            20.0

 type                zinsatz                           22.0

 type                laufzeit                          100.0

 clickAndWait        submit

 assertTextPresent   8649939365.27	
  Euro

                                         Target
Selenium IDE
Capture & Replay Tests mit Selenium




            Action Tabelle
Selenium Remote Control
Anbindung Selenium in Java Code als Test Treiber


                   Selenium Server
                                        Browser
                                       Firefox, IE
                   Selenium Core
        JAVA,
        PHP...
                                         SUT
                     HTTP Proxy
                                     Webapplikation
Übung 1I

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

Weitere ähnliche Inhalte

Mehr von Christian Baranowski

Einführung in die Software-Qualitätssicherung
Einführung in die Software-QualitätssicherungEinführung in die Software-Qualitätssicherung
Einführung in die Software-Qualitätssicherung
Christian Baranowski
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
Christian Baranowski
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
Christian Baranowski
 
HTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungHTTP und Java Servlets Programmierung
HTTP und Java Servlets Programmierung
Christian Baranowski
 
Build Prozesse und Configuration Management
Build Prozesse und Configuration ManagementBuild Prozesse und Configuration Management
Build Prozesse und Configuration Management
Christian Baranowski
 

Mehr von Christian Baranowski (20)

BDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
BDD - Behavior Driven Development Webapps mit Groovy Spock und GebBDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
BDD - Behavior Driven Development Webapps mit Groovy Spock und Geb
 
Einführung in die Software-Qualitätssicherung
Einführung in die Software-QualitätssicherungEinführung in die Software-Qualitätssicherung
Einführung in die Software-Qualitätssicherung
 
OSGi Web Development in Action
OSGi Web Development in ActionOSGi Web Development in Action
OSGi Web Development in Action
 
Spock and Geb in Action
Spock and Geb in ActionSpock and Geb in Action
Spock and Geb in Action
 
Gradle and Continuous Delivery
Gradle and Continuous DeliveryGradle and Continuous Delivery
Gradle and Continuous Delivery
 
Spock and Geb
Spock and GebSpock and Geb
Spock and Geb
 
Semantic Versioning
Semantic VersioningSemantic Versioning
Semantic Versioning
 
OSGi Community Updates 2012
OSGi Community Updates 2012OSGi Community Updates 2012
OSGi Community Updates 2012
 
OSGi Mars World in Action
OSGi Mars World in ActionOSGi Mars World in Action
OSGi Mars World in Action
 
Warum OSGi?
Warum OSGi?Warum OSGi?
Warum OSGi?
 
Top10- Software Engineering Books
Top10- Software Engineering BooksTop10- Software Engineering Books
Top10- Software Engineering Books
 
Domain Driven Design - 10min
Domain Driven Design - 10minDomain Driven Design - 10min
Domain Driven Design - 10min
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Java Servlets und AJAX
Java Servlets und AJAX Java Servlets und AJAX
Java Servlets und AJAX
 
HTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungHTTP und Java Servlets Programmierung
HTTP und Java Servlets Programmierung
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Build Prozesse und Java Servlets
Build Prozesse und Java ServletsBuild Prozesse und Java Servlets
Build Prozesse und Java Servlets
 
Build Prozesse und Configuration Management
Build Prozesse und Configuration ManagementBuild Prozesse und Configuration Management
Build Prozesse und Configuration Management
 

Software Testing und Qualitätssicherung

  • 1. Software Technik HTWG Konstanz Software Testing Christian Baranowski
  • 2. Requirement Analysis Wasserfallmodell System Design Coding Testing Delivery
  • 4. Was ist Software Qualität ? Funktionalität Effizienz Wartbarkeit Zuverlässigkeit Portabilität Benutzbarkeit
  • 5. 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. Fehlermaskierung Wirkung eines Fehlers (Fehlerzustand) ist nach außen nicht sichtbar, weil er durch einen weiteren Fehler verborgen (überlagert / maskiert) wird.
  • 6. Wege zu guter Software analytische 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 konstruktive Fehlermaskierung bestimmt. Qualitätssicherung 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.
  • 8. Fragestellung beim Testen Validation Test Verifikation Ist es die richtige Software? Ist die Software richtig? Die Software ist richtig! Debugging Warum ist die Software nicht richtig?
  • 10. Testmethoden • Black-Box Testen • Gray-Box Testen • White-Box Testen
  • 11. Testmethoden SUT (System Under Test) Client tier Presentation tier Business logic tier Database tier De-Serialization De-Marshalling Business logic O/R mapping Presentation Serialization Marshalling Client logic GUI Modul / Komponententest Integrationstest Systemtest
  • 12. Testmethoden Komponententest Integrationstest Systemtest
  • 13. Kosten zur Fehlerbehebung Kosten (€) Fehler frühzeitig in einem Projekt (Entwicklungsprozess) zu finden spart Geld !!! Anforderungsanalyse Systementwurf Umsetzung Integrationstest Systemtest Betrieb
  • 15. 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
  • 16. Test Design Pattern vier Phasen Test Setup SUT in einen definierten Zustand bringen. Exercise SUT aufrufen mit Test Parametern (Daten). Verify Prüfen ob das SUT im erwarteten Zustand ist. Teardown SUT und Testumgebung aufräumen.
  • 17. JUnit public class QuicksortTest { ! Quicksort<Integer> quicksortSUT; Phase 1: Setup ! @Before ! public void setUp() { ! ! quicksortSUT = new Quicksort<Integer>(new IntComperator()); ! } ! @Test Phase 2: Exercise ! public void testSort() throws Exception { ! ! quicksortSUT.sort(new Integer[] { 5, 8, 2, 4, 7 }); ! ! assertArrayEquals(new Integer[] { 2, 4, 5, 7, 8 }, values); ! } Phase 3: Verify ! @After ! public void tearDown() { ! ! quicksortSUT = null; ! } Phase 4: tearDown }
  • 19. 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
  • 20. Testabdeckung (100 %) public boolean aAndbOrC(boolean A, boolean B, boolean C) { ! return (A && B) || C; } Erwartet A B C false false false false true false false true false false true false true false true true false true false false true true false true true true true false true true true true
  • 21. 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
  • 23. 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; } }
  • 25. Statement Coverage (Anweisungsüberdeckung) 1. A && B true Erwartet A B C 1. true true true false C true false
  • 26. Statement Coverage (Anweisungsüberdeckung) 1. A && B true Erwartet A B C 2. 1. true true true false C true 2. true false false true false
  • 27. Statement Coverage (Anweisungsüberdeckung) 100 % 1. A && B true Erwartet A B C 2. 1. true true true false 3. C true 2. true false false true 3. false false false false false
  • 28. Statement Coverage (Anweisungsüberdeckung) public static boolean aAndBOrC(boolean A, boolean B, boolean C) { if(A && B || C){ return true; } else { return false; } }
  • 29. Statement Coverage (Anweisungsüberdeckung) 100% 1. A && B || C true Erwartet A B C 2. false 1. true false false true 2. false false false false
  • 30. 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; }
  • 31. Statement Coverage (Anweisungsüberdeckung) 100% result = 0 for (value : values) Erwartet values offset offset > 0 offset < value 3 [2] 1 result += offset result += value return result
  • 32. Statement Coverage (Anweisungsüberdeckung) 100 % result = 0 for (value : values) Erwartet values offset offset > 0 offset < value 3 [2] 1 result += offset result += value return result
  • 33. Branch Coverage 100 % (Zweigabdeckung) result = 0 for (value : values) offset > 0 offset < value result += offset Erwartet values offset result += value 3 [2] 1 2 [2] 0 return result 2 [2] 2
  • 34. 100% Pfadabdeckung 100 % Pfadabdeckung wird in der Regel nicht erreicht (halting problem)
  • 36. Übung 1I • Erstellen Sie einen Unit Test für die Demo Quicksort Implementierung • Messen Sie die Code Abdeckung in Eclipse
  • 38. Ä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
  • 40. Äquivalenzklassenbildung Parameter Äquivalenzklasse Repräsentant Basar Nummer gÄK1_01: [0,...,MAX_LONG] 100 uÄK1_02: [-MAX_LONG,..., 0[ -1 uÄK1_03: NaN „abc“ Preis gÄK2_01: [0,...,MAX_LONG] 10 gÄK2_02: X,50 | X = [0,..., MAX_LONG] 0,50 gÄK2_03: X,5 | X = [0,..., MAX_LONG] 0,5 gÄK2_04: X,00 | X = [0,..., MAX_LONG] 11,00 uÄK2_05: [-MAX_LONG,...,0] -1 uÄK2_06: X,Y | X = [-MAX_LONG,..., 0[ -1,100 Y = [-MAX_LONG,..., MAX_LONG] uÄK2_07: X,Y | X = [0,..., MAX_LONG] 100,2 Y = ]0,..., 5[ uÄK2_08: X,Y | X = [0,..., MAX_LONG] 100,40 Y = ]5,..., 50[ uÄK2_09: X,Y | X = [0,..., MAX_LONG] 100,510 Y = ]50,..., MAX_LONG[ uÄK2_10: X,Y | X = [0,..., MAX_LONG] 100,“abc„ Y = NaN uÄK2_11: NaN “abc„ uÄK2_12: X,Y | X = NaN Y = [0,..., MAX_LONG] “abc„,50 Beschreibung gÄK3_01: [NULL...TEXT] “abc„
  • 41. Äquivalenzklassenbildung abgeleitete Testfälle Testfall 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!!!
  • 43. Walkthrough • Autor stellt seinen Code Dokument vor. • Autor ist der Moderator • Vorteile: • Wenig Vorbereitungsaufwand • Prüfung findet durch spontane Fragen statt.
  • 44. 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
  • 45. Technisches Review • Autor nimmt am Review nicht teil • Gutachter stimmen ab • Prüfen gegen Spezifikation • Gutachter prüfen einzeln vorab
  • 46. Informelles Review • Gutachter bekommt Dokument zum lesen und gibt schriftliche Rückmeldung
  • 47. Zusammenfassung Reviews Grad der geringster höchsten mittel gering Formalisierung Autor Autor Gutachter einzelne Anwesend Gutachter Prüfer Moderator Gutachter Moderator Code Code Anwendbarkeit Dokumente Dokumente Dokumente Dokumente Lernen Vorbereitung kaum Formale Prüfung Formale Prüfung kaum Walkthrough Inspektion Technisches Informelles Review Review
  • 49. 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
  • 50. 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()...
  • 51. Namens Konventionen • Konstantennamen • komplett in Großbuchstaben • Beispiele • LEFT, PI, BLOD
  • 52. Integrationsstrategien Big-bang Test A Test B Test G Test Test C A- G Test F Test D Test E
  • 53. Integrationsstrategien Bottom-up Test A- G Test Test B, E, F D, G Test C Test E Test F Test G
  • 54. Integrationsstrategien Setup Test Treiber execute Seller DAO Database verify SUT
  • 56. Integrationsstrategien Top-down Test A Test A, B, C, D Test A- G
  • 57. Top-Down Integrationstest Pattern Test Doubles gesamtes SUT dieses soll ohne die DB geprüft werden
  • 58. Top-Down Integrationstest Pattern Test Doubles TOP Down Integration Test Doubles: - Dummy - Mock Object
  • 60. Integrationsstrategien Continuous Integration betrachten wir noch in einer der folgenden Vorlesung
  • 62. Test Charakterisierung •Was wird getestet ? (Testobjekt) •Wer testet? (Tester) •Welche Qualitätseigenschaft (ISO9126) wird geprüft? •Mit welchen Werkzeugen wird getestet?
  • 63. 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
  • 65. 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 ...
  • 67. Überblick Fit Framework for Integrated Tests FIT wurde entwickelt von Ward Cunningham WIKI-Erfinder...
  • 68. Motivation von Fit Tests • Automatisierung von Akzeptanztests mittels Tabellen. • Framework für Datengetriebene Tests – Data-Driven-Test (xUnit Test Patterns - Gerard Meszaros)
  • 69. Testen mit Fit Tabellen Fit Tests für einen Beispiel Zinsrechner
  • 70. Testen mit Fit Tabellen Fit Tests als Column Test Tabelle Betrag 10
  • 71. Testen mit Fit Tabellen Fit Tests als Column Test Tabelle Betrag Zinssatz 10 2,5
  • 72. Testen mit Fit Tabellen Fit Tests als Column Test Tabelle Betrag Zinssatz Laufzeit 10 2,5 2
  • 73. Testen mit Fit Tabellen Fit Tests als Column Test Tabelle Betrag Zinssatz Laufzeit Summe 10 2,5 2 10,51
  • 74. Testen mit Fit Tabellen Fit Tests als Column Test Tabelle Prüfung eines Ergebnis Eingehende - Werte Betrag Zinssatz Laufzeit Summe() Testfall 10 2,5 2 10,51
  • 75. Testen mit Fit Tabellen Fit 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
  • 76. Testen mit Fit Tabellen Fit Tests als Column Test Tabelle Rot = Fehler in der Anwendung Gelb =Ausnahme - Fehler im Test Grün = erfolgreicher Test
  • 77. Testen mit Fit Tabellen Fit Test als Action Tabelle Befehle / Kommandos fit.Ac?onFixture Anbindung an die Applikation (Java) start ZinsenAc(onFixture enter Betrag 10 Argumente enter Zinssatz 2,5 Testfall enter Laufzeit 2 press Submit check Summe 10,51 Objekt / Auswahl / Target
  • 78. Testen mit Fit Tabellen Fit Test als Action Tabelle Anwendung Starten Eingaben Aktion - Zinsen Berechnen Prüfung
  • 79. Fit Design drei Klassen Framework
  • 80. Fit Tabellen und Applikation verknüpfen
  • 81. Fit Tabellen und Applikation verknüpfen onlinerechner.ZinsenFixture Betrag Zinssatz Laufzeit Summe() 10 2,5 2 10,51 10 10 3 25,94 20 10 10 100000 ... ... ... ...
  • 82. Fit Tabellen und Applikation verknüpfen Anbindung an SUT SUT
  • 83. Fit Tabellen und Applikation verknüpfen public class ZinsenFixture extends ColumnFixture { Basis Klasse für private Zinsen zinsen = new Zinsen(); Fit Extension public double betrag; SUT public double zinsatz; public double laufzeit; Eingehende - Werte public double summe() { Prüfung - Ausgabe zinsen.setBetrag(betrag); zinsen.setLaufzeit(laufzeit); zinsen.setZinssatz(zinsatz); Anbindung return zinsen.berechneZinsen(); an SUT } }
  • 84. Fit Tabellen und Applikation verknüpfen fit.Ac?onFixture GOF - Dekorierer-Muster start onlinerechner.ZinsenAc(onFixture enter Betrag 10 enter Zinssatz 2,5 enter Laufzeit 2 press berechneZinsen check Summe 10,51
  • 85. Fit Tabellen und Applikation verknüpfen
  • 86. 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); Eingaben / Enter } … public void berechneZinsen() { Aktion / Press summe = zinsen.berechneZinsen(); } public double summe() { return summe; Ausgabe Prüfung / Check } }
  • 87. Oberflächentests Einführung in Selenium Selenium Core Selenium Selenium RC IDE
  • 88. Selenium Core am Beispiel eines Zinsrechner Action - Tabelle Selenium Befehl open /JugsBase/zinsrechner.jsp Argumente type betrag 20.0 type zinsatz 22.0 type laufzeit 100.0 clickAndWait submit assertTextPresent 8649939365.27  Euro Target
  • 89. Selenium IDE Capture & Replay Tests mit Selenium Action Tabelle
  • 90. Selenium Remote Control Anbindung Selenium in Java Code als Test Treiber Selenium Server Browser Firefox, IE Selenium Core JAVA, PHP... SUT HTTP Proxy Webapplikation
  • 91. Übung 1I • ErweiternSie den Basar FIT Test so dass auch für den zweiten Kunden mehre Buchung durchgeführt werden.