\documentclass{bschlangaul-aufgabe} \bLadePakete{java,kontrollflussgraph} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 4}, Thematik = {White-Box-Testverfahren}, Referenz = 66116-2020-H.T1-TA1-A4, RelativerPfad = Examen/66116/2020/09/Thema-1/Teilaufgabe-1/Aufgabe-4.tex, ZitatSchluessel = examen:66116:2020:09, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {White-Box-Testing, Kontrollflussgraph}, EinzelpruefungsNr = 66116, Jahr = 2020, Monat = 09, ThemaNr = 1, TeilaufgabeNr = 1, AufgabeNr = 4, } \let\c=\bKontrollCode \let\b=\bBedingung \let\p=\bKontrollKnotenPfad \let\k=\bKontrollTextzeileKnoten Diese Aufgabe behandelt \emph{Wortpalindrome}, also Wörter, die vorwärts und rückwärts gelesen jeweils dieselbe Zeichenkette bilden, \zB \texttt{Otto} oder \texttt{Rentner}. Leere Wortpalindrome (also Wortpalindrome der Wortlänge $0$) sind dabei nicht zulässig. \index{White-Box-Testing} \footcite{examen:66116:2020:09} Folgende \emph{Java-Methode} prüft, ob das übergebene Zeichen-Array ein Wortpalindrom darstellt: \bJavaExamen[firstline=6,lastline=28]{66116}{2020}{09}{Palindrom} \begin{enumerate} %% % %% \item Geben Sie für die Methode einen \emph{Kontrollflussgraphen} an, wobei Sie die Knoten mit den jeweiligen Zeilennummern im Quelltext beschriften. \index{Kontrollflussgraph} \begin{bAntwort} \begin{bKontrollflussgraph}[xscale=1,yscale=-1.6] \node[knoten] at (0,0) (S) {S}; \node[pin=\c{boolean resultat = false;}] at (0,1) (2) {2}; \node[pin=\c{if (wort != null)}] at (0,2) (3) {3}; \node[pin=\c{int laenge = wort.length;}] at (1,3) (4) {4}; \node[pin=\c{if (laenge >= 2)}] at (1,4) (5) {5}; \node[pin=\c{resultat = true; int i = 0;}] at (2,5) (6) {6}; \node[pin=\c{for (i < laenge / 2;)}] at (2,6) (7) {7}; \node[pin=\c{char c1; char c2 …}] at (3,7) (8) {8}; \node[pin=\c{if (Char…) }] at (2,8) (10) {10}; \node[pin=\c{resultat = false; break;}] at (2,9) (12) {12}; \node[pin=\c{if (laenge == 1)}] at (1,10) (17) {17}; \node[pin=\c{resultat = true;}] at (1,11) (18) {18}; \node[pin=180:\c{return resultat;}] at (-1,9) (22) {22}; \node[knoten] at (-1,10) (E) {E}; \path (S) -- (2); \path (2) -- (3); \path[wahr] (3) -- (4) \b{right}{wort != null}; \path[falsch] (3) -- (22) \b{left}{wort == null}; \path (4) -- (5); \path[wahr] (5) -- (6) \b{right}{laenge >= 2}; \path[falsch] (5) -- (17) \b{left,rotate=70,pos=0.2}{laenge < 2}; \path (6) -- (7); \path[wahr] (7) -- (8) \b{right}{i < laenge / 2}; \path[falsch] (7) -- (22) \b{left}{i >= laenge / 2}; \path (8) -- (10); \path[wahr] (10) -- (12) \b{right}{c != c}; \path[falsch] (10) -- (7) \b{left,rotate=70,pos=0.8}{c == c}; \path (12) -- (22); \path[wahr] (17) -- (18) \b{right}{laenge == 1}; \path[falsch] (17) -- (22) \b{right,rotate=-20,pos=0.99}{laenge != 1}; \path (18) -- (22); \path (22) -- (E); \end{bKontrollflussgraph} \end{bAntwort} %% % %% \item Geben Sie eine \emph{minimale Testmenge} an, die das Kriterium der Anweisungsüberdeckung erfüllt. Hinweis: Eine \emph{Testmenge} ist \emph{minimal}, wenn es keine Testmenge mit einer kleineren Zahl von Testfällen gibt. Die Minimalität muss \emph{nicht} bewiesen werden. \begin{bAntwort} \bJavaCode{isWortpalindrom(new char[] { 'a' })}:\\ \p{S-2-3-4-5 -17-18-22-E} % {S-2-3-4-5-6-7-8-10-12-17-18-22-E} \bJavaCode{isWortpalindrom(new char[] { 'a', 'b' })}:\\ \p{S-2-3-4-5-6-7-8-10-12- 22-E} % {S-2-3-4-5-6-7-8-10-12-17-18-22-E} % \bJavaCode{isWortpalindrom(new char[] { 'a', 'a' })}\\ % \p{S-2-3-4-5-6-7-8-10- 22-E} % {S-2-3-4-5-6-7-8-10-12-17-18-22-E} \end{bAntwort} %% % %% \item Geben Sie eine \emph{minimale Testmenge} an, die das Kriterium der \emph{Boundary-Interior-Pfadüberdeckung} erfüllt. Hinweis: Das Kriterium \emph{Boundary-Interior-Pfadüberdeckung} beschreibt einen Spezialfall der Pfadüberdeckung, wobei nur Pfade berücksichtigt werden, bei denen jede Schleife nicht mehr als zweimal durchlaufen wird. \begin{bAntwort} Es gibt noch ganz viele infeasible Pfade, die hier nicht aufgeführt werden. \begin{description} %% % %% \item[Äußere Pfade] \strut \begin{itemize} \item \bJavaCode{isWortpalindrom(null)}:\\ \p{S-2-3 -22-E} % {S-2-3-4-5-6-7-8-10-12-17-18-22-E} \item \bJavaCode{isWortpalindrom(new char[] { })}:\\ \p{S-2-3-4-5 -17 -22-E} % {S-2-3-4-5-6-7-8-10-12-17-18-22-E} \item \bJavaCode{isWortpalindrom(new char[] { 'a' })}:\\ \p{S-2-3-4-5 -17-18-22-E} % {S-2-3-4-5-6-7-8-10-12-17-18-22-E} \end{itemize} %% % %% \item[Grenzpfade (boundary paths, boundary test)] Für Schleifen fester Lauflänge ist diese Testfallgruppe leer. \item \bJavaCode{isWortpalindrom(new char[] { 'a', 'a' })}:\\ \p{S-2-3-4-5-6-7-8-10-7-22-E} \item \bJavaCode{isWortpalindrom(new char[] { 'a', 'b' })}:\\ \p{S-2-3-4-5-6-7-8-10-12-22-E} %% % %% \item[Innere Pfade (interior test)] \strut \begin{itemize} \item \bJavaCode{isWortpalindrom(new char[] { 'a', 'a', 'a', 'a' })}:\\ \p{S-2-3-4-5-6- 7-8-10- 7-8-10- 7-22-E} \item \bJavaCode{isWortpalindrom(new char[] { 'a', 'b', 'a', 'a' })}:\\ \p{S-2-3-4-5-6- 7-8-10- 7-8-10- 12-22-E} \end{itemize} \end{description} \end{bAntwort} %% % %% \item Im Falle des Kriteriums Pfadüberdeckung können minimale Testmengen sehr groß werden, da die Anzahl der Pfade sehr schnell zunimmt. Wie viele \emph{mögliche Pfade} ergeben sich maximal für eine Schleife, die drei einseitig bedingte Anweisungen hintereinander enthält und bis zu zweimal durchlaufen wird? Geben Sie Ihren Rechenweg an (das Ergebnis alleine gibt keine Punkte). \begin{bAntwort} Pro Schleifendurchlauf: $2 \cdot 2 \cdot 2 = 2^3 = 8$ Maximal 2 Schleifendurchläufe: $8 \cdot 8 + 8 + 1 = 73$ wenn man die Fälle $0$, $1$ oder $2$ Durchläufe getrennt betrachtet. Natürlich entstehen aus der Sicht des reinen Graphen keine neuen Pfade, so dass man auch zur Antwort $9$ neigen könnte. Aber es geht darum, dass bei späteren Durchläufen andere Dinge passieren können (Fehler), so dass man eine Art Kopie des Schleifenteils pro Durchlauf betrachtet. \end{bAntwort} \item Könnte für das hier abgebildete Quelltext-Beispiel auch das Verfahren der \emph{unbegrenzten Pfadüberdeckung} (also Abdeckung aller möglicher Pfade ohne Beschränkung) als Test-Kriterium gewählt werden? Begründen Sie. \begin{bAntwort} Nein. Der Pfad von Konten \k{17} zu Knoten \k{22} wird nie beschritten, d. h. wird Zeile 17 betreten, wird auch immer die bedingte Anweisung in Zeile 18 ausgeführt. Statt \begin{minted}{java} if (laenge == 1) { resultat = true; } \end{minted} könnte auch nur so geschrieben werden: \begin{minted}{java} resultat = true; \end{minted} \end{bAntwort} \end{enumerate} \end{document}