6. Tutorium zu Softwaretechnik I



Ähnliche Dokumente
Softwaretechnik 1 Tutorium

Probeklausur Softwareengineering SS 15

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Monitore. Klicken bearbeiten

Whitebox-Tests: Allgemeines

Kapitel 4. Monitore und wechselseitiger Ausschluss

Domänenmodell: Fadenkommunikation und -synchronisation

Softwarelösungen: Versuch 4

Programmierkurs Java

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Java Kurs für Anfänger Einheit 5 Methoden

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen

Übungen Programmieren 1 Felix Rohrer. Übungen

5. Tutorium zu Programmieren

Einführung in die Programmierung

Übung: Verwendung von Java-Threads

Programmieren in Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

13. Tutorium zu Programmieren

Synchronisation in Java. Invisible Web

Verteilte Systeme CS5001

VBA-Programmierung: Zusammenfassung

3 Objektorientierte Konzepte in Java

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Objektorientierte Programmierung

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Übersicht Programmablaufsteuerung

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Vorkurs C++ Programmierung

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Autorisierung. Sicherheit und Zugriffskontrolle & Erstellen einer Berechtigungskomponente

Objektorientierte Programmierung

Prinzipien Objektorientierter Programmierung

Tagesprogramm

Software Engineering Interaktionsdiagramme

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Java: Vererbung. Teil 3: super()

Vgl. Oestereich Kap 2.7 Seiten

Grundlagen von Python

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Client-Server-Beziehungen

Einstieg in die Informatik mit Java

Computeranwendung und Programmierung (CuP)

Windows Server 2008 (R2): Anwendungsplattform

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

DIE SCHRITTE ZUR KORREKTEN LIZENZIERUNG

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Tutorium Rechnerorganisation

Tutorial Moodle 2 globale Gruppen bzw. Kohorten

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Überblick. Lineares Suchen

Musterlösungen zur Klausur Informatik 3

Propädeutikum. Dipl.-Inf. Frank Güttler

SEP 114. Design by Contract

Anleitung zur Nutzung des SharePort Utility

Einführung in die Programmierung Blockkurs Java

SEQUENZDIAGRAMM. Christoph Süsens

Algorithmen & Datenstrukturen 1. Klausur

Tevalo Handbuch v 1.1 vom

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Dialognetze. Ziel : Beschreibung von Methoden und Beschreibungstechniken für den Entwurf und die Dokumentation von Dialogabläufen

Graphic Coding. Klausur. 9. Februar Kurs A

Lehrer: Einschreibemethoden

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Softwaretechnologie -Wintersemester 2013/ Dr. Günter Kniesel

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

OpenMP am Beispiel der Matrizenmultiplikation

5. Abstrakte Klassen

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Benutzerverwaltung Business- & Company-Paket

SS Björn Berezowski B.Sc. Marco Münch B.Sc. Michael Roth B.Sc. Repetitorium PG 1. Übungsblatt. 1 Übung - Probeklausur SS 2010 Typ Prof.

Grundlagen verteilter Systeme

Übung 9 - Lösungsvorschlag

Upgrade auf die Standalone Editionen von Acronis Backup & Recovery 10. Technische Informationen (White Paper)

Datenstrukturen & Algorithmen

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

Grundbegriffe der Informatik

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Applet Firewall und Freigabe der Objekte

Anleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Seite Wo finde ich die Landingpage Auswahl? Seite Wie aktiviere ich eine Landingpage? Seite

Aufgabenblatt Nr. 5 Generizität und TicTacToe

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Transkript:

6. Tutorium zu Softwaretechnik I Parallelität und Testen Michael Hoff 01.07.2014 INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

Übersicht 1 Parallelität Erzeugen von Parallelität Synchronisation und Koordination Verklemmung 2 Testen Kontrollflussgraph Überdeckungstests

Letztes Übungsblatt

Parallelität

Einführung Definition von "parallel" Allgemein: nebeneinander verlaufend, in gleichem Abstand Informatik: gleichzeitig ablaufend Programmieransätze Parallelrechner mit gemeinsamem Speicher Prozessoren haben einen gemeinsamen Speicherbereich Jeder Prozessor kann jede Speicherzelle ansprechen Parallelrechner mit verteiltem Speicher Jeder Prozessor hat seinen eigenen Speicher Kommunikation zwischen Prozessoren über Nachrichten Michael Hoff 6. Tutorium 01.07.2014 5/34

Prozesse und Kontrollfäden Prozess (engl. Process) Ein Programm in Ausführung Wird durch Betriebssystem erzeugt Enthält Informationen über Programmressourcen und Ausführungszustand CPU-Kontextwechsel zwischen Prozessen langsam Michael Hoff 6. Tutorium 01.07.2014 6/34

Prozesse und Kontrollfäden Prozess (engl. Process) Ein Programm in Ausführung Wird durch Betriebssystem erzeugt Enthält Informationen über Programmressourcen und Ausführungszustand CPU-Kontextwechsel zwischen Prozessen langsam Kontrollfaden (engl. Thread) Unabhängiger Instruktionsstrom, der ausgeführt werden kann Existiert in einem Prozess CPU-Kontextwechsel zwischen Fäden des gleichen Prozesses schnell Michael Hoff 6. Tutorium 01.07.2014 6/34

Prozesse und Threads Prozess Code Halde Faden 1 Faden 1 Programmzähler Kellerspeicher für Aufrufe und Auswertung Aktivierungszeiger Aktivierung Faden 2 Kellerzeiger Übrige Register Aktivierung Zwischenergebnisse Anweisungen Objekte Letztes Element Faden n Freier Kellerspeicher 24 Kapitel 4.2 - Grundlagen zur Parallelverarbeitung Mehr Details zu Parallelität in VL Betriebsysteme und Rechnerstrukturen Michael Hoff 6. Tutorium 01.07.2014 7/34

Konstrukte Erzeugen zum von Erzeugen Threads in von Java Parallelität (2) Methode 1 Implementieren der Schnittstelle Runnable Faden erzeugen Methode 2 Anlegen einer Subklasse von Thread Implementieren der Methode run() Überschreiben der Methode run() Übergabe einer Instanz an einen Konstruktor eines Thread-Objekts thread Anlegen einer Instanz thread der Subklasse Aufruf der Methode thread.start() 5 Kapitel 4.2.1 - Parallelität in Java Michael Hoff 6. Tutorium 01.07.2014 8/34

Beispiel: Konstrukte Erzeugen zum Erzeugen von Threads von Parallelität in Java Beispiel (1) Klasse, die Runnable implementiert: class ComputeRun implements Runnable { long min, max; ComputeRun (long min, long max) { this.min = min; this.max = max; } public void run () { // Parallele Aufgabe } } Erzeuge und starte Kontrollfaden: ComputeRun c = new ComputeRun(1, 20); new Thread(c).start(); Klasse, die von Thread erbt: class ComputeRun extends Thread { long min, max; ComputeRun (long min, long max) { this.min = min; this.max = max; } public void run () { // Parallele Aufgabe } } Erzeuge und starte Kontrollfaden: ComputeRun t = new ComputeRun(1, 20); t.start(); Michael Hoff 6. Tutorium 01.07.2014 9/34

Koordination: Wofür? Zwei Aktivitäten führen den folgenden Code parallel aus. Beide habe Zugriff auf dieselbe globale Variable globalvar. int globalvar = 1; if (globalvar > 0) { globalvar--; } Kann globalvar negativ werden? 12 Kapitel 4.2.1 - Parallelität in Java Michael Hoff 6. Tutorium 01.07.2014 10/34

Antwort: Ja, eine Wettlaufsituation (engl. race condition) kann eintreten. Speicherzugriffe der Aktivitäten werden in irgendeiner Reihenfolge ausgeführt. Die folgende denkbare Ausführungsreihenfolge ist kritisch: Thread 1 Thread 2 // globalvar == 1 if (globalvar > 0) { } globalvar--; if (globalvar > 0) { globalvar--; } 13 Kapitel 4.2.1 - Parallelität in Java Michael Hoff 6. Tutorium 01.07.2014 11/34

Warum Koordination von Threads? Kritischer Abschnitt (engl. critical section) Bereich in dem ein Zugriff auf einen gemeinsam genutzten Zustand stattfindet Wettlaufsituationen (engl. race condition) Gleichzeitiger Zugriff von mindestens zwei Fäden auf eine Speicherstelle. Dabei mindestens 1 Schreibzugriff. Nur eine bestimmte Anzahl Aktivitäten darf einen kritischen Abschnitt zugleich bearbeiten Vor dem Betreten eines kritischen Abschnitts muss sichergestellt sein, dass ihn keine andere Aktivität ausführt Michael Hoff 6. Tutorium 01.07.2014 12/34

Warum Koordination von Threads? Wettlaufsituationen (engl. race condition) Gleichzeitiger Zugriff von mindestens zwei Fäden auf eine Speicherstelle. Dabei mindestens 1 Schreibzugriff. Nur eine bestimmte Anzahl Aktivitäten darf einen kritischen Abschnitt zugleich bearbeiten Vor dem Betreten eines kritischen Abschnitts muss sichergestellt sein, dass ihn keine andere Aktivität ausführt Koordinationsmechanismen Wechselseitiger Ausschluss (engl. mutual exclusion) mittels Monitoren/Locks Warten auf Ereignisse und Benachrichtigung Unterbrechungen Michael Hoff 6. Tutorium 01.07.2014 12/34

Synchronisation in Java (unvollständig!) Schlüsselwort synchronized Anwendbar auf Objekte und komplette Methoden ( implizites Lock von this) Erlaubt nur Änderungen eines Threads an synchronisiertem Objekt Andere Threads müssen ununterbrechbar warten bis der ausführende Thread die synchronisierte Umgebung verlässt Signalisierung x.wait() - Lässt aufrufenden Thread auf Signal von x warten x.notify() - Weckt einen der Threads, die auf x warten x.notifyall() - Weckt alle Threads, die auf x warten Unterbrechung t.interrupt() - Unterbricht das Warten des Threads t Michael Hoff 6. Tutorium 01.07.2014 13/34

Verklemmungen (2) Ich will schreiben Geben Sie mir den Stift! Geben Sie mir das Papier! 44 Kapitel 4.2.1 - Parallelität in Java

Verklemmung Verklemmung, Blockade (engl. deadlock, deadly embrace) Blockade, die durch eine zyklische Abhängigkeit hervorgerufen wird Führt dazu, dass alle beteiligten Threads im Wartezustand verharren Mantra: Monitore in gleicher Reihenfolge anfordern und abgeben! Michael Hoff 6. Tutorium 01.07.2014 15/34

java.util.concurrent Weitere Möglichkeiten zur Thread-Erzeugung, z.b. Callable<E>, ThreadPoolExecutor Atomare Datentypen, z.b. AtomicInteger, AtomicReference<E> Thread-sichere Datenstrukturen, z.b. CopyOnWriteArrayList Weitere Konstrukte enthalten für Koordination, z.b. Semaphore Michael Hoff 6. Tutorium 01.07.2014 16/34

Kontrollflussorientierte (KFO) Testverfahren

Hilfsmittel Grundblock (engl. basic block) Ein Grundblock bezeichnet eine maximal lange Folge fortlaufender Anweisungen, in die der Kontrollfluss nur am Anfang eintritt und die außer am Ende keine Sprungbefehle enthält. Grundblock wird also stets komplett oder gar nicht ausgeführt Michael Hoff 6. Tutorium 01.07.2014 18/34

Hilfsmittel Grundblock (engl. basic block) Ein Grundblock bezeichnet eine maximal lange Folge fortlaufender Anweisungen, in die der Kontrollfluss nur am Anfang eintritt und die außer am Ende keine Sprungbefehle enthält. Grundblock wird also stets komplett oder gar nicht ausgeführt Strukturerhaltende Zwischensprache Eine strukturerhaltende Zwischensprache ersetzt alle Befehle, die die Ausführungsreihenfolge beeinflussen durch (bedingte) Sprünge, übernimmt alle anderen Befehle unverändert und führt keine Optimierungen durch. Michael Hoff 6. Tutorium 01.07.2014 18/34

Kontrollflussgraph Kontrollflussgraph erstellen 1 Quelltext in strukturerhaltende Zwischensprache transformieren (optional) 2 Grundblöcke identifizieren (= Knoten) 3 Grundblöcke durch passende Übergänge verbinden (= gerichtete Kanten) 4 Wenn nötig, speziellen Block n start und n end hinzufügen Michael Hoff 6. Tutorium 01.07.2014 19/34

Aufgabe: Kontrollflussgraph erstellen private char[] kompaktifizieren(char[] werte) { boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; for (int i = 0; i < werte.length; i++) { if (!Character.isWhitespace(werte[i])) { istzeichen[i] = true; praesum[i] = 1; } if (i > 0) { praesum[i] += praesum[i - 1]; } } char[] ergebnis = new char[praesum[praesum.length - 1]]; for (int i = 0; i < werte.length; i++) { if (istzeichen[i]) { ergebnis[praesum[i] - 1] = werte[i]; } } return ergebnis; } Michael Hoff 6. Tutorium 01.07.2014 20/34

Lösung: Zwischensprache private char[] kompaktifizieren(char[] werte) { boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; for (int i = 0; i < werte.length; i++) { if (!Character.isWhitespace(werte[i])) { istzeichen[i] = true; praesum[i] = 1; } if (i > 0) { praesum[i] += praesum[i - 1]; } } char[] ergebnis = new char[praesum[praesum.length - 1]]; for (int i = 0; i < werte.length; i++) { if (istzeichen[i]) { ergebnis[praesum[i] - 1] = werte[i]; } } return ergebnis; } 000: private char[] kompaktifizieren(char[] werte) 010: boolean[] istzeichen = new boolean[werte.length]; 020: int[] praesum = new int[werte.length]; 030: int i = 0; 040: if not (i < werte.length) goto 120; 050: if not (!Character.isWhitespace(werte[i])) goto 080; 060: istzeichen[i] = true; 070: praesum[i] = 1; 080: if not (i > 0) goto 100; 090: praesum[i] += praesum[i - 1]; 100: i++; 110: goto 040; 120: char[] ergebnis = new char[praesum[praesum.length - 1]]; 130: i = 0; 140: if not (i < werte.length) goto 190; 150: if not (istzeichen[i]) goto 170; 160: ergebnis[praesum[i] - 1] = werte[i]; 170: i++; 180: goto 140; 190: return ergebnis; Michael Hoff 6. Tutorium 01.07.2014 21/34

Lösung: Grundblöcke 000: private char[] kompaktifizieren(char[] werte) 010: boolean[] istzeichen = new boolean[werte.length]; 020: int[] praesum = new int[werte.length]; 030: int i = 0; 040: if not (i < werte.length) goto 120; 050: if not (!Character.isWhitespace(werte[i])) goto 080; 060: istzeichen[i] = true; 070: praesum[i] = 1; 080: if not (i > 0) goto 100; 090: praesum[i] += praesum[i - 1]; 100: i++; 110: goto 040; 120: char[] ergebnis = new char[praesum[praesum.length - 1]]; 130: i = 0; 140: if not (i < werte.length) goto 190; 150: if not (istzeichen[i]) goto 170; 160: ergebnis[praesum[i] - 1] = werte[i]; 170: i++; 180: goto 140; 190: return ergebnis;

Lösung: Kontrollflussgraph 000: private char[] kompaktifizieren(char[] werte) 010: boolean[] istzeichen = new boolean[werte.length]; 020: int[] praesum = new int[werte.length]; 030: int i = 0; 040: if not (i < werte.length) goto 120; 050: if not (!Character.isWhitespace(werte[i])) goto 080; 060: istzeichen[i] = true; 070: praesum[i] = 1; 080: if not (i > 0) goto 100; 090: praesum[i] += praesum[i - 1]; 100: i++; 110: goto 040; 120: char[] ergebnis = new char[/*...*/]; 130: i = 0; 140: if not (i < werte.length) goto 190; 150: if not (istzeichen[i]) goto 170; 160: ergebnis[praesum[i] - 1] = werte[i]; 170: i++; 180: goto 140; 190: return ergebnis; n start n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; n stopp Eingabe: char[] werte n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T i++; n 12 praesum[i] += praesum[i - 1]; ergebnis[praesum[i] - 1] = werte[i]; n 11 return ergebnis Klausur Softwaretechnik 1 Sommersemester 2011 Seite 7 von 11

Überdeckungstests (1) Anweisungsüberdeckung (engl. statement coverage) Die Anweisungsüberdeckung verlangt die Ausführung aller Grundblöcke eines Programms. Alle Knoten im Kontrollflussgraphen min. einmal durchlaufen Michael Hoff 6. Tutorium 01.07.2014 24/34

Überdeckungstests (1) Anweisungsüberdeckung (engl. statement coverage) Die Anweisungsüberdeckung verlangt die Ausführung aller Grundblöcke eines Programms. Alle Knoten im Kontrollflussgraphen min. einmal durchlaufen Zweigüberdeckung (engl. branch covergage) Die Zweigüberdeckung verlangt das Traversieren aller Zweige im Programm. Alle Kanten im Kontrollflussgraphen min. einmal durchlaufen Michael Hoff 6. Tutorium 01.07.2014 24/34

Überdeckungstests (1) Anweisungsüberdeckung (engl. statement coverage) Die Anweisungsüberdeckung verlangt die Ausführung aller Grundblöcke eines Programms. Alle Knoten im Kontrollflussgraphen min. einmal durchlaufen Zweigüberdeckung (engl. branch covergage) Die Zweigüberdeckung verlangt das Traversieren aller Zweige im Programm. Alle Kanten im Kontrollflussgraphen min. einmal durchlaufen Pfadüberdeckung (engl. path coverage) Die Pfadüberdeckung fordert die Ausführung aller möglichen unterschiedlichen Pfade im Programm. Alle vollständigen Pfade im Kontrollflussgraphen durchlaufen (kritisch!) Michael Hoff 6. Tutorium 01.07.2014 24/34

Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = {?} Zweigüberdeckung: Eingabe = {?} n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis

Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = {?} n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis

Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = { b, } (Beispiel) n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis

Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = { b, } (Beispiel) Durchlaufener Pfad:? n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis

Überdeckungstests: Aufgabe n start Eingabe: char[] werte Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = { b, } (Beispiel) Durchlaufener Pfad: n start, n 1, n 2, n 3, n 4, n 5, n 7, n 2, n 3, n 5, n 6, n 7, n 2, n 8, n 9, n 10, n 11, n 12, n 9, n 10, n 12, n stopp n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis

Überdeckungstests (3) Einfache Bedingungsüberdeckung Die einfache Bedingsüberdeckung fordert, dass jede atomare Bedingung einmal zu true und einmal zu false ausgewertet wird. Michael Hoff 6. Tutorium 01.07.2014 26/34

Überdeckungstests (3) Einfache Bedingungsüberdeckung Die einfache Bedingsüberdeckung fordert, dass jede atomare Bedingung einmal zu true und einmal zu false ausgewertet wird. Mehrfache Bedingungsüberdeckung Die mehrfache Bedingungsüberdeckung fordert, dass die atomaren Bedingungen mit allen möglichen Kombinationen der beiden Wahrheitswerte belegt werden. Bei n atomaren Bedingungen: 2 n Tests erforderlich Michael Hoff 6. Tutorium 01.07.2014 26/34

Überdeckungstests (4) Minimal-mehrfache Bedingungsüberdeckung Die minimal-mehrfache Bedingungsüberdeckung fordert, dass jede Bedingung jeweils mit beiden Wahrheitswerten belegt werden muss. Enthält die Zweigüberdeckung Michael Hoff 6. Tutorium 01.07.2014 27/34

Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } Michael Hoff 6. Tutorium 01.07.2014 27/34

Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } E e = {101, 010} Michael Hoff 6. Tutorium 01.07.2014 27/34

Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } E e = {101, 010}, E m = {000, 001, 010,..., 111}, Michael Hoff 6. Tutorium 01.07.2014 27/34

Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } E e = {101, 010}, E m = {000, 001, 010,..., 111}, E mm = {111, 000} Michael Hoff 6. Tutorium 01.07.2014 27/34

Subsumieren von Überdeckungen Subsumieren Ein Testverfahren für Kriterium x subsumiert ein Testverfahren für Kriterium y, wenn jede Menge von Pfaden, die Kriterium x erfüllt, auch Kriterium y erfüllt. Michael Hoff 6. Tutorium 01.07.2014 28/34

Subsumieren von Überdeckungen Subsumieren Ein Testverfahren für Kriterium x subsumiert ein Testverfahren für Kriterium y, wenn jede Menge von Pfaden, die Kriterium x erfüllt, auch Kriterium y erfüllt. Aufgabe: Was ist die Subsumierungsreihenfolge der Überdeckungstestverfahren? Michael Hoff 6. Tutorium 01.07.2014 28/34

Subsumieren von Überdeckungen Michael Hoff 6. Tutorium 01.07.2014 29/34

Prüfungsfragen

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Ein Algorithmus der in 4 Teile aufgeteilt ist, welche parallel abgearbeitet werden können, benötigt 1/4 der Ausführungszeit, die der Algorithmus sequentiell implementiert benötigen würde. Michael Hoff 6. Tutorium 01.07.2014 31/34

Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Ein Algorithmus der in 4 Teile aufgeteilt ist, welche parallel abgearbeitet werden können, benötigt 1/4 der Ausführungszeit, die der Algorithmus sequentiell implementiert benötigen würde. Michael Hoff 6. Tutorium 01.07.2014 31/34

Aktuelles Übungsblatt

Fragen?

Ende Michael Hoff 6. Tutorium 01.07.2014 34/34