================================ Verbesserung der Testüberdeckung [TOC] ================================ Wenn wir eine Klasse testen, wäre es gut, wenn wir ein Testprogramm haben, das zumindest eine C0-Überdeckung erreicht, d.h. der gesamte Programmtext einer Klasse kommt zur Ausführung im Rahmen von Tests. Wenn wir die C0-Überdeckung überprüfen möchten, dann können wir das beim _g++_ mit den Optionen `--coverage` und dem Werkzeug _gcov_ tun: ---- SHELL (path=session07/step01,hostname=theon) -------- g++ --coverage -Wall -o test1 test1.cpp ./test1 gcov test1 cat array.hpp.gcov rm -f *.gcov ---------------------------------------------------------- Das in _array.hpp.gcov_ abgelegte Listing zeigt * die Zahl der Aufrufe, * die Zeilennummer und * den Programmtext einer Zeile. Zu suchen sind hier Zeilen, die mit `#####` beginnen, d.h. die nie ausgeführt worden sind und bei denen eine Ausführung zu erwarten wäre. Ignorieren Sie dabei die Zeilen am Ende einer Methode. Teilweise wird aber auch nur `-` angegeben, wenn der entsprechende Code nie erzeugt worden ist. Aufgabe ======= Entwickeln Sie ein Testprogramm für die Klasse _Array_, die * eine C0-Überdeckung erreicht und die * ein besonderes Augenmerk auf die korrekte Behandlung von Ausnahmen legt, d.h. sie sollte sicherstellen, dass keine Funktion oder Methode als `noexcept` deklariert ist, die das nicht sein sollte. Dazu empfiehlt sich die Entwicklung einer Testfunktion mit drei Parametern: * eine fortlaufende Testnummer, * eine kurze Beschreibung des Tests und * ein Funktionsobjekt, das den Test ausführt. Die Ausführung des Funktionsobjekt sollte dabei in einen `try`-Block eingeschlossen werden, der alle Ausnahmen behandelt. Für jeden Test sollte es eine Ausgabe geben mit der Testnummer, der kurzen Beschreibung und dem Ausgang des Tests. Um die `noexcept`-Zusicherung zu testen, sollten Sie eine kleine Testklasse als Elementtyp für die Arrays hinzufügen, die bei Bedarf Ausnahmen erzeugt. Wenn es zu einer Ausnahme kommt in einer Funktion oder Methode, die mit `noexcept` deklariert ist, wird `std::terminate` aufgerufen und Ihr Testprogramm würde nicht regulär bis zum Ende laufen. Überprüfen Sie Ihren Testumfang auch dahingehend, dass Sie testweise bei einer der Methoden, bei denen `noexcept` nicht zulässig ist dieses Schlüsselwort hinzufügen, ob es dann zum Aufruf von `std::terminate` kommt, weil Sie einen entsprechenden geeigneten Test haben. Vorlage ======= :import: session07/step01/array.hpp [fold] :navigate: up -> doc:index back -> doc:session07/page02 next -> doc:session07/page04