\documentclass{bschlangaul-aufgabe} \bLadePakete{mathe,java,kontrollflussgraph} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 2: Kontrollflussorientiertes Testen}, Thematik = {Methode „specialSums()“}, Referenz = 66116-2014-H.T2-TA2-A3, RelativerPfad = Examen/66116/2014/09/Thema-2/Teilaufgabe-2/Aufgabe-3.tex, ZitatSchluessel = examen:66116:2014:09, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Kontrollflussorientieres Testen, Kontrollflussgraph, C0-Test Anweisungsüberdeckung (Statement Coverage), C1-Test Zweigüberdeckung (Branch Coverage)}, EinzelpruefungsNr = 66116, Jahr = 2014, Monat = 09, ThemaNr = 2, TeilaufgabeNr = 2, AufgabeNr = 3, } \let\c=\bKontrollCode \let\b=\bBedingung Im\index{Kontrollflussorientieres Testen} \footcite{examen:66116:2014:09} Folgenden ist ein Algorithmus angegeben, der für eine positive Zahl \bJavaCode{until} die Summe aller Zahlen bildet, die kleiner als \bJavaCode{until} und Vielfache von $4$ oder $6$ sind. Für nicht positive Zahlen soll $0$ zurückgegeben werden. Der Algorithmus soll also folgender Spezifikation genügen: \footcite[Kontrollflussorientiertes Testen, Aufgabe 2]{sosy:ab:7} \bigskip {\footnotesize \noindent $\texttt{until} > 0 \Rightarrow \texttt{specialSums(until)} = \sum \{y \, | \, 0 < y < \texttt{until} \land (y\%4 = 0 \lor y\%6 = 0)\}$ \noindent $\texttt{until} \leq 0 \Rightarrow \texttt{specialSums(until)} = 0$ } \bigskip\noindent wobei $\%$ den Modulo-Operator bezeichnet. \bJavaExamen[firstline=4,lastline=14]{66116}{2014}{09}{SpecialSum} \noindent Beachten Sie, dass der Algorithmus nicht der Spezifikation genügt. Der Fehler liegt in der Bedingung der for-Schleife. Der Fehler kann jedoch einfach korrigiert werden indem die Bedingung \begin{center} $i \leq \texttt{until}$ in $i < \texttt{until}$ \end{center} geändert würde. \begin{enumerate} %% % (a) %% % public static long specialSums(int until) { % long sum = 0; // 0 % if (until > 0) { // 1 % for (int i = 1; i <= until; i++) { // 2 // 5 % if (i % 4 == 0 || i % 6 == 0) { // 3 % sum += i; // 4 % } % } % } % return sum; // 6 % } \item Zeichnen Sie das zum Programm gehörige Ablaufdiagramm. \index{Kontrollflussgraph} \begin{bAntwort} \begin{bKontrollflussgraph}[xscale=1,yscale=-1.5] \node[pin=\c{long sum = 0;}] at (0,0.5) (0) {0}; \node[pin=\c{if (until > 0)}] at (0,1) (1) {1}; \node[pin=\c{for (int i = 1; i <= until; i++)}] at (1,2) (2) {2}; \node[pin=\c{if (i \% 4 == 0 || i \% 6 == 0)}] at (2,3) (3) {3}; \node[pin=\c{sum += i;}] at (3,4) (4) {4}; \node[pin=\c{i++}] at (2,5) (5) {5}; \node[pin=\c{return sum;}] at (0,5.5) (6) {6}; \path (0) -- (1); \path[wahr] (1) -- (2) \b{right}{until > 0}; \path[falsch] (1) -- (6) \b{left}{until <= 0}; \path[wahr] (2) -- (3) \b{right}{i <= until}; \path[falsch] (2) -- (6); \path[wahr] (3) -- (4) \b{right}{i \% 4 == 0 || i \% 6 == 0}; \path[falsch] (3) -- (5); \path (4) -- (5); \path (5) -- (2); \end{bKontrollflussgraph} \end{bAntwort} %% % (b) %% \item Schreiben Sie einen Testfall, der das Kriterium „100\% Anweisungsüberdeckung“ erfüllt, aber den Fehler trotzdem nicht aufdeckt. \index{C0-Test Anweisungsüberdeckung (Statement Coverage)} \begin{bAntwort} Der Fehler fällt nur dann auf, wenn \texttt{until} durch $4$ oder $6$ ohne Rest teilbar ist. \texttt{until = 0\%4} oder \texttt{until = 0\%6}. Wähle daher den Testfall $\{(1, 0)\}$. Alternativ kann für die Eingabe auch 2, 3, 5, 7, 9, 10, 11, 13, ... gewählt werden. \end{bAntwort} %% % (c) %% \item Schreiben Sie einen Testfall, der das Kriterium „100\% Zweigüberdeckung“ erfüllt, aber den Fehler trotzdem nicht aufdeckt. \index{C1-Test Zweigüberdeckung (Branch Coverage)} \begin{bAntwort} Betrachte den Testfall $\{(0, 0), (5, 4)\}$. \begin{description} \item[erste if-Bedingung] Das erste Tupel mit $\text{until} = 0$ stellt sicher, dass die erste \bJavaCode{if}-Bedingung \bJavaCode{false} wird. \item[Bedingung der for-Schleife] Für die zweite Eingabe $\text{until} = 5$ werden für $i$ die Werte $1, 2, 3, 4, 5, 6$ angenommen. Wobei für $i = 6$ die Bedingung der for-Schleife \bJavaCode{false} ist. \item[Innere if-Bedingung] Für $i = 1, 2, 3, 5$ wird die innere if-Bedingung jeweils \bJavaCode{false}, für $i = 4$ wird sie \bJavaCode{true}. \end{description} \end{bAntwort} %% % (d) %% \item Schreiben Sie einen Testfall, der den Fehler aufdeckt. Berechnen Sie Anweisungsüberdeckung und Zweigüberdeckung ihres Testfalls. \begin{bAntwort} \begin{description} \item[Anweisungsüberdeckung] Wähle $\{(4, 0)\}$. Durch die fehlerhafte Bedingung in der for-Schleife wird der Wert $i = 4$ akzeptiert. Da alle Anweisungen ausgeführt werden, wird eine Anweisungsüberdeckung mit 100\% erreicht. \item[Verzweigungsüberdeckung] Da die erste Verzweigung nur zur Hälfte überdeckt wird und die anderen beiden vollständig, gilt für die Verzweigungsüberdeckung: $\frac{1+2+2}{2+2+2} = \frac{5}{6}$ \end{description} \end{bAntwort} %% % (e) %% \item Es ist nicht immer möglich vollständige Pfadüberdeckung zu erreichen. Geben Sie einen gültigen Pfad des Programmes an, der nicht erreichbar ist. Ein Testfall kann als Menge von Paaren dargestellt werden, wobei jedes Paar $(I, O)$ die Eingabe $I$ und die zu dieser erwartete Ausgabe $O$ darstellt. \begin{bAntwort} Ein gültiger Pfad im Kontrollflussgraphen wäre \bKontrollTextzeileKnoten{0} - \bKontrollTextzeileKnoten{1} - \bKontrollTextzeileKnoten{2} - \bKontrollTextzeileKnoten{3} - \bKontrollTextzeileKnoten{4} - \bKontrollTextzeileKnoten{5} - \bKontrollTextzeileKnoten{2} - \bKontrollTextzeileKnoten{6}. Der Übergang von \bKontrollTextzeileKnoten{3} auf \bKontrollTextzeileKnoten{4} ist hier aber nicht möglich, da beim ersten Durchlaufen der for-Schleife (\bKontrollTextzeileKnoten{2}) $i$ immer $1$ ist und $1$ weder durch $4$ noch durch $6$ teilbar ist. Somit kann die Bedingung des inneren ifs (\bKontrollTextzeileKnoten{3}) beim ersten Durchlauf nie \emph{wahr} sein, womit immer der Übergang \bKontrollTextzeileKnoten{3} - \bKontrollTextzeileKnoten{5} zu Beginn genommen werden muss. Alle Pfade, die zu Beginn \bKontrollTextzeileKnoten{3} - \bKontrollTextzeileKnoten{4} enthalten, sind somit nicht überdeckbar. \end{bAntwort} \end{enumerate} \end{document}