Sie sind auf Seite 1von 13

Aufgabe 1: Quer durchs Skript (20 Punkte)

a) Kreuzen Sie in der Tabelle an, ob die Aussagen korrekt sind (richtig) oder nicht (falsch)
(20 Punkte).
Hinweis: Jedes falsche Kreuz ergibt je 1 Punkt (bzw. 2 Punkte) Abzug. Die
Gesamtpunktzahl für Aufg. 1 kann dadurch aber nicht negativ werden.

Aussage richtig falsch


1. Round Trip Engineering bezeichnet einen chaotischen
Softwareentwicklungsprozess, bei dem die Entwickler das eigentliche Ziel aus
den Augen verlieren.
2. Das Rational Unified Process ist ein risikobewusstes Vorgehensmodell, weil
erkannte Risiken in frühen Iterationen eliminiert werden.
3. Ein Antipattern verhindert, dass in einem Softwaresystem Architekturmuster
auftreten.
4. Der Systementwurf beschreibt eine Entwicklungsphase, in welcher die
Architektur der zu entwickelnden Software definiert wird.
5. Konfigurationsmanagement ist die Entwicklung und Anwendung von
Standards und Verfahren zur Verwaltung eines sich weiterentwickelnden
Softwaresystems.
6. Revisionen sind zeitlich aufeinander folgende Zustände von Dokumenten.
7. Die Halstead-Metrik für eine Komponente mit k Zusammenhangskompo-
nenten berechnet sich nach der Formel HS(Komponente) = |E| - |N| + 2k
8. Klassen einer Vererbungshierarchie sollten high cohesion besitzen.
9. Der Akzeptanztest ist ein white-box-Testverfahren.
10. Das Ziel der N-Versionen-Programmierung ist die Steigerung der
Ausführungsgeschwindigkeit von Softwaresystemen.
11. Rational Purify ist ein Werkzeug, mit dem man bei Testläufen Speicherlöcher
in einem C++ Programm finden kann.
12. Rational Quantify ist ein Werkzeug, mit dem man die Einhaltung von
stilistischen Regeln in einem C++ Programm überprüfen kann.
13. Die Unified Modelling Language eignet sich zur Visualisierung von statischen
Programmstrukturen.
14. Stagecast ist ein Beispiel für ein grafisches Ersetzungssystem.
15. Eine Chomsky-Grammatik ist durch ein Startzeichen S, die Menge der
Terminalsymbole T und die Menge der Nichtterminalsymbole N vollständig
bestimmt.
16. Ein Parser überprüft die semantische Korrektheit eines Programms.
17. Der reguläre Ausdruck (2 Punkte)
/^\s*(final\s+)?(static\s+)?[a-z]+\s+[a-z]+.*/
findet die folgende Zeile:
final int i; // Variable i
18. Der reguläre Ausdruck (2 Punkte)
/package\s+[a-z]+(\.[A-Za-z0-9]+)*;/
findet die folgende Zeile:
package de.tu-darmstadt.se2;

1
Aufgabe 2: Versionsverwaltung (18 Punkte)
Ein bekannter Dichter, nennen wir ihn Johann, möchte eine Cover-Version eines seiner
beliebtesten Gedichte erstellen. Plötzlich stellt er entsetzt fest, dass er die ursprüngliche
Version vergessen hat.

a) Betrachten Sie die verschiedenen Versionen der unten stehenden Strophe. Version
1.4 ist ausschließlich durch Drei-Wege-Verschmelzung (wie zum Beispiel beim
automatischen Mischen von CVS) aus den Versionen 1.1, 1.2 und 1.3 entstanden.
Rekonstruieren Sie die verloren gegangene Version 1.1, welche sich möglichst wenig
von Version 1.4 unterscheidet (5 Punkte).

v1.1

v1.2 v1.3
Edel sei der Mensch, Der edle Mensch

Hilfreich und gut! sei hilfreich und gut!

Von allen Wesen, Denn das allein unterscheidet ihn

Die wir kennen. Von allen Wesen,

Sei uns ein Vorbild. Die wir kennen.

v1.4
Der edle Mensch

sei hilfreich und gut!

Von allen Wesen,

Die wir kennen.

Sei uns ein Vorbild.

2
b) Was würde sich ändern, wenn in Version 1.2 die letzte Zeile fehlen würde, aber
Version 1.1 wie von Ihnen angegeben aussieht (1 Punkt)?

c) Berechnen sie das das Delta zwischen den Versionen 1.2 und 1.3 und erstellen Sie
eine entsprechende Diff-Datei gemäß der Notation aus der Vorlesung, so dass sie alle
bekannten Operationen verwenden, und Hunk 2 eine Kontextzeile enthält
(12 Punkte).

*** , *** Hunk 1 ****

--- , ---

*************************

*** , *** Hunk 2 ****

--- , ---

*************************

3
Aufgabe 3: Testplanung mit Statecharts (15 Punkte)

Um festzustellen, ob ein Eingabestring einem regulären Ausdruck genügt, benötigt man ein
Programm, dass Scanner genannt wird. Für dieses kann man einen deterministischen
Automaten (ein Statechart) konstruieren. Jeder Buchstabe des Eingabestrings wird als
Ereignis des Automaten ausgewertet. Wenn der Automat nach vollständiger Auswertung des
Eingabestrings (Signal EOS) einen Endzustand erreicht hat, erfüllt der Eingabestring den
regulären Ausdruck.

Der folgende Automat erkennt den Ausdruck

[ab]*abb:

b a
a
A B a
a

b b
C D

b EOS

E
a) Erzeugen Sie einen Transitionsbaum aus dem gegebenen Statechart (9 Punkte).

4
b) Welche Testsequenzen müssen Sie ausführen (das heißt welche Eingabestrings
müssen Sie testen) und welches Resultat erhalten sie jeweils (4 Punkte)?

Eingabestring Endzustand erreicht?

c) Für welche Ausgangszustände und durch welches Ereignis könnten irrelevante bzw.
verbotene Transitionen ausgelöst werden, sofern der Zeichenvorrat auf {a,b}
beschränkt ist (2 Punkte)?

Ausgangszustände

Ereignis

5
Aufgabe 4: Statische Programmanalyse (23 Punkte)

Diese Aufgabe bezieht sich auf das im Anhang diskutierte Heron-Verfahren. Sie können diese
Aufgabe unabhängig von anderen Aufgaben lösen.

a) Versehen sie den Kontrollflussgraphen auf dem gekennzeichneten Blatt mit


Datenflussattributen, so dass man die korrekte Auswertungsreihenfolge durch Lesen
von rechts nach links erhält. Verwenden Sie für Verwendungen von Variablen r(x)
ausschließlich die exakteren Datenflussattribute c(x) und p(x) (15 Punkte).

b) In dem Programm sind zwei Datenflussanomalien enthalten, die sich auf Definitionen
ab Zeile 4 beziehen. Welche Anomalien stellen Sie fest? Handelt es sich dabei auch
bei optimistischer Definition um Anomalien? Wie würden Sie die Probleme beheben?
Ignorieren Sie du-Anomalien (8 Punkte).

Zeile Anomalie Optimistisch Problembehebung

Aufgabe 5: Datenflussbasierte Testverfahren (6 Punkte)

Diese Aufgabe bezieht sich auf das im Anhang diskutierte Heron-Verfahren. Sie können diese
Aufgabe unabhängig von anderen Aufgaben lösen, es ist jedoch sinnvoll, die Ergebnisse aus
Aufgabe 4a) zu verwenden. Achtung: Abzug bei falsch gesetztem Kreuz !

a) Welche der folgenden Testfälle erfüllen das all-defs-Kriterium bezüglich der Variablen
deviation (2 Punkte)?

1) heron (1.0, 0.1) à ja à nein

2) heron (2.0, 0.1) à ja à nein

b) Welche der folgenden Testfälle erfüllen das all-p-uses-Kriterium bezüglich der


Variablen accuracy (2 Punkte)?

1) heron (1.0, 0.1) à ja à nein

2) heron (2.0, 0.1) à ja à nein

c) Welche der folgenden Testfälle erfüllen das all-c-uses-Kriterium bezüglich der


Variablen guess (2 Punkte)?

1) heron (1.0, 0.1) à ja à nein

2) heron (2.0, 0.1) à ja à nein

6
zu Aufgabe 4a (Kontrollflussgraph mit Datenflussattributen):

7
Aufgabe 6: Konfigurationsverwaltung (10 Punkte)

Gegeben ist das folgende Makefile:

rohstoffe = hefe hopfen malz wasser


produkte = bier maische wuerze

default : bier

bier : wuerze hefe


\t cat $? > $@

maische : malz wasser


\t cat $? > $@

wuerze : maische hopfen


\t cat $? > $@

${rohstoffe} :
\t echo “Etwas $@” > $@

a) Geben Sie den Inhalt der Datei „bier“ nach einem Aufruf von „make“ an (6 Punkte):

b) Erweitern Sie das Makefile um ein Ziel „party“ zum Verbrauch des hergestellten Bieres.
Sofern die Voraussetzungen erfüllt sind, soll eine geeignete Meldung produziert und
alle erzeugten Rohstoffe und Produkte verbraucht werden. Verwenden Sie bestehende
Makros, wenn möglich (4 Punkte).

8
Hinweise zu Aufgabe 6:

• \t steht für das Tabulatorzeichen (Tab).


• $@ steht für das aktuelle Ziel einer Regel.
• $? steht für alle erfüllten Voraussetzungen einer Regel.
• echo ”X” gibt den Text X auf dem Bildschirm aus.
• echo ”X” > Y schreibt den Text X in eine Datei Y (Produktion).
• cat X Y > Z hängt die Dateien X und Y aneinander und erzeugt eine neue Datei Z
(Verarbeitung).
• rm X Y Z löscht alle angegebenen Dateien (Verbrauch).
• Wenn eine Regel eine durch Leerzeichen getrennte Liste von Zielen enthält, so verhält
sich diese Regel, als wenn für jedes Ziel eine eigene Regel mit denselben
Abhängigkeiten und Befehlen angegeben worden wäre.

9
Aufgabe 7: Funktionsorientierte Testverfahren (24 Punkte)

Diese Aufgabe bezieht sich ebenfalls auf das im Anhang diskutierte Heron-Verfahren. Sie
können diese Aufgabe unabhängig von anderen Aufgaben lösen. Ein Testfall im Sinne diese
Aufgabe ist immer ein Funktionsaufruf von heron.

Beispiel:
heron (3.0,0.1);

a) Nennen Sie die Definition für unvollständige Pfadüberdeckung mit „boundary interior
test“
(2 Punkte):

b) Geben Sie eine minimale Menge von Testfällen an, um Pfadüberdeckung mit
„boundary interior test“ sicherzustellen (5 Punkte):

c) Bilden Sie Äquivalenzklassen für x und accuracy. Bilden Sie eigene Äquivalenzklassen
für Randwerte in einem Intervall. Stellen Sie alle Äquivalenzklassen als Klassifikations-
baum dar. Berücksichtigen Sie dabei auch die Interaktion der beiden Variablen in
Zeilen 26-28 (12 Punkte):

10
d) Geben Sie nach den Heuristiken der Vorlesung konkrete Testfälle an, um genau alle in
c) definierten Äquivalenzklassen für x und accuracy zu testen (5 Punkte):

11
12
Anhang: Heron-Verfahren

Das Heron-Verfahren, benannt nach dem griechischen Mathematiker Heron von Alexandria
(1 Jhd. n. Chr), dient dazu, in einem iterativen Verfahren die Quadratwurzel einer Zahl x mit
einer Genauigkeit accuracy zu berechnen. Es handelt sich dabei um einen Spezialfall des
später entwickelten Newtonschen Iterationsverfahrens. Die Funkion fabs(y) berechnet dabei
den Absolutwert einer Zahl y vom Type double.

Tipp: ((3/2 + 4/3) / 2) ≈ 1,417; 1,417² ≈ 2,008

01: #include <iostream>


02: #include <cmath>
03:
04: double heron (double x, double accuracy)
05: {
06: double result, deviation, guess;
07:
08: deviation = 0.0;
09:
10: if (accuracy <= 0.0) {
11: std::cerr << "Genauigkeit zu klein." << std::endl;
12: result = -1.0;
13: }
14: else {
15: if (accuracy > 1.0) {
16: std::cerr << "Genauigkeit zu groß." << std::endl;
17: result = -1.0;
18: }
19: else {
20: if (x < 0.0) {
21: std::cerr << "Negatives Argument" << std::endl;
22: result = -1.0;
23: }
24: else {
25: if (x > 0.0) {
26: guess = 1.0;
27: deviation = std::fabs (((guess * guess) – x) / x);
28: while (deviation > accuracy) {
29: guess = (guess + (x / guess)) / 2.0;
30: deviation = std::fabs (((guess * guess) – x) / x);
31: }
32: }
33: result = guess;
34: }
35: }
36: }
37: return result;
38: }

13