\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}
