Slide 1

AutoTest

Cantata AutoTest erstellt automatisch Unit-Tests, um den ganzen C und C++ Quellcode auszuführen. Das gilt sowohl für neue, als auch für bestehende Projekte. Das vereinfacht:

  • die Konfiguration der automatischen Testerstellung
  • die Identifizierung von Problemen mit der Testbarkeit des Codes
  • die Erstellung von Tests um volle Codeabdeckung zu erreichen
  • die Erkennung und Beseitigung von Randwertlücken in der Codeabdeckung
  • die Erstellung eines Sicherheitsnetzes von Baseline-Regressionstests
  • das Upgrade von Legacy Testwerkzeugen zu Cantata

Was ist Cantata AutoTest?

Cantata AutoTest erstellt komplette Unit-Testskripte oder fügt bestehenden Cantata Skripten Testfälle zu. Es analysiert den C oder C++ Code, um alle möglichen Pfade durch den Code zu ermitteln, wie es von den Zielvorgaben einer strukturellen Codeabdeckung erwartet wird:

  • 100% function Entry-points
  • 100% Statements
  • 100% Decisions
  • 100% Unique Cause MC/DC

An algorithm creates test case vectors which exercise all required code paths, using the Cantata powerful white-box capabilities to set data, parameters and control function call interfaces.

The test vectors drive the code, and check the parameters passed between functions, values of accessible global data, order of calls and return values.

AutoTest generated cases, are editable in the same ways as user generated cases, and each test case has a description of what path through the code it was created to exercise, making them easy to maintain.

Wobei hilft mir AutoTest?

KONFIGURIEREN VON AUTOMATISCHER TESTERSTELLUNG

Die Erstelloptionen von AutoTest können ganz einfach konfiguriert werden. Das geht sowohl über die GUI, wie auch über die Kommandozeile:

  • Erforderliche Codeabdeckung (Regel-Set)

  • Wie werden Funktionsaufrufe simuliert oder abgefangen?

  • Werden globale statische Variablen empfangen?

  • Statische Funktionen für Isolation-Unit-Tests oder Gruppen-Integrationstests

  • Welche Daten werden geprüft (zum Beispiel globale Daten, Argumente von Funktionsaufrufen, Rückgabewerte)

  • Optionale Einstellung von globalen Variablen in Funktionsaufrufen, um bestimmte Ausführungspfade zu erreichen

  • Generierung von Grenzwerten für Laufzeiten, Pfade, Listen, etc.

Die Auswahl eines Regelsatzes für die Codeabdeckung legt automatisch die Testtiefe fest (d.h. die Zahl notwendiger Testfälle, um die vorgegebene Codeabdeckung zu erreichen). Der Style wird durch die AutoTest spezifischen und allgemeinen Cantata Optionen für die Codegenerierung festgelegt.

Isolation-Unit-Tests oder Cluster-Integrationstests sowie die Verwendung von Black-Box oder White-Box Testansätzen ermöglichen die Flexibilität, um initiale Vorgaben an die Testtiefe und die Testwartbarkeit für zukünftige Codeänderungen einzuhalten.

ASPEKTE DER CODETESTBARKEIT IDENTIFIZIEREN

Nicht immer kann AutoTest Tests generieren. Auch sind manche Tests unvollständig. In solchen Fällen bietet der AutoTest Generation Report einen detaillierten Einblick in den Quellcode für alle Aspekte der Tests.

Warnhinweise zeigen, wo und weshalb es nicht möglich war, Testfälle zu generieren. Die Warnungen weisen auf mögliche Probleme im Quellcode hin. Oder darauf, dass es nicht möglich war, ihn dynamisch zu testen. Aus diesem Grund kann der AutoTest Generation Report auch dann eine wertvolle Ergänzung sein, wenn AutoTests nicht dynamisch ausgeführt werden.

TESTS ERSTELLEN MIT VOLLER CODEABDECKUNG

Im Cantata Autotest Report finden Sie detaillierte Informationen über die, mit den automatisch generierten Testfällen, erreichte Coverage. Da Testfälle des AutoTests so erstellt werden, dass Sie initial erfolgreich durchlaufen, zeigen Ihnen die Fehlermeldungen genau wo Ihr Coverage Ziel derzeit nicht erreicht werden kann.

Selbstverständlich ist das Erreichen der vollen Codeabdeckung nur Teil der Testziele. Die von AutoTest generierten Testfälle können überprüft und den Anforderungen zugeordnet werden (weitere Details finden Sie in der Funktionalität „Cantata Requirements Traceability“). In diesem Fall verringert AutoTest den Aufwand der Entwickler drastisch, wenn es darum geht, Testfallvektoren auszuwählen, um die Anforderungen zu prüfen.

LÜCKEN IN DER CODEABDECKUNG: WIE GEHT CANTATA MIT GRENZFÄLLEN UM?

Bei sehr komplexem Code kann es passieren, dass nicht alle Ausführungspfade getestet werden können. Da helfen auch detaillierte Anforderungen und eingehende Robustheitstests nicht weiter. Das liegt daran, dass verschiedene Kombinationen von Eingabevektoren, die für die volle Abdeckung notwendig sind, nur schwer bestimmt werden können. Auch für solche Grenzfälle hat AutoTest eine Lösung: das Tool generiert Testfälle, die die Lücken in der Codeabdeckung schließen, sofern der Code nicht redundant ist.

Damit die vollständige Codeabdeckung erreichbar wird, ist es möglich, AutoTest an ausgewählten Funktionen auszuführen. Das geschieht mit einem zielgerichteten Set an Testfälle. Die Codeabdeckung in Cantata kann automatisch optimiert werden. Mit einem einzigen Klick ist es möglich, jeden Testfall zu löschen bzw. zu deaktivieren, wenn er für die erreichte Codeabdeckung nichts bringt.

SICHERHEITSNETZ FÜR REGRESSIONSTESTS – SO GEHT ES

Wenn bestehender Code Systemtests unterzogen werden muss, ist das einerseits teuer. Andererseits verursacht jede Änderung im Code einen hohen Aufwand. Auch der Versuch, ein umfassendes Set an Unit-Tests von Grund auf neu zu erstellen, ist selten wirtschaftlich. Cantata AutoTest erstellt eine solche automatische Suite an Unit-Tests für den gesamten ausgewählten Code. Diese Tests dienen als Baseline-Sicherheitsnetz für zukünftige Regressionsfehler, wenn der Code sich ändert. Unit-Tests gehen mehr in die Tiefe und lokalisieren Fehler präziser. Das bedeutet viel weniger Abhängigkeit von teuren und zeitaufwendigen Systemtests.

Cantata AutoTest erstellt ein Set an Cantata-Makefiles. Diese Makefiles können ganz einfach in jede Art von CI-Files integriert werden – ob kommerziell oder Open Source. So wird vollautomatisches Testen während der Entwicklung möglich, und zwar bei jeder Integration.

BESTEHENDE TEST-TOOLS GANZ EINFACH UPGRADEN

Auch wenn Sie bereits mit anderen Tools für Ihre Unit-Tests arbeiten, hat ein Upgrade auf Cantata viele Vorteile. Zum Beispiel, weil es viele moderne und leistungsfähige Möglichkeiten für Tests bietet. Oder wenn die bestehenden Tools nicht gut gepflegt werden. Oder wenn sie nicht oder nur eingeschränkt die Bedingungen für die Zertifizierung für die Sicherheitsstandards erfüllen.

Wie upgraden? Cantata AutoTest bietet da zwei Wege – und zwar hochgradig automatisiert:

Zum einen können bestehende Tests ganz einfach durch ein von Cantata AutoTest generiertes Set an Cantata Unittests ersetzt werden.

Zum anderen können bestehende Unittests in C oder C++ (zum Beispiel xUnit-Tools) in Cantata Testskripte eingebunden werden. Das sichert Ihre Investition in die bereits bestehenden Testfälle – und ergänzt sie um die Leistung, die in Cantata steckt!

Wie arbeitet AutoTest?

AutoTest kann man entweder über einen Testskript-Wizard aufrufen. Oder es erstellt zusätzliche Testfälle in einem bestehenden Testskript im Testskript-Manager. Ist die Codebasis sehr groß, ist es unter Umständen besser, AutoTest über Kommandozeilen laufen zu lassen.

AutoTest analysiert den Source Code und nutzt Cantata Optionen. Dabei entstehen:

  • AutoTest Generation Report. Er gibt sowohl einen Überblick, als auch Detailinformationen zu den erstellten Tests.
  • Cantata Testskripte (oder zusätzliche Testfälle zu bestehenden Skripts)
  • Cantata Makefiles zum Erstellen der Test-Executables

Die automatisch generierten Tests werden dann gebaut und ausgeführt, wobei die üblichen Cantata Testergebnisse und -reports erstellt werden.

DER GENERIERUNGSALGORITHMUS IN AUTOTEST

Cantata AutoTest erstellt komplette Unit-Testskripte für Cantata aufgrund des Source-Codes. Dazu nutzt das Tool einen Algorithmus, der automatisch Testfallvektoren generiert. Diese Vektoren führen Code-Pfade aus, prüfen Daten und Parameter und erfassen alle Aufrufaufträge. Die Code-Pfade, die zum Generieren der Testfälle erstellt werden, sind über die Auswahl der Metriktypen in einem Regelwerk zur Codeabdeckung festgelegt. Metriktypen können unter anderem sein: Entry-point, Statement, Decision oder Unique-Cause MC/DC.

Verschiedene verfügbare Voreinstellungen können den Algorithmus des AutoTests beeinflussen. Das betrifft auch den geforderten Grad der Codeabdeckung, die Methode der Kontrollabrufe und welche Datentypen geprüft werden. Und nicht zuletzt, wie Daten modifiziert werden können, um Ausführungspfade, Zeitlimits, Pfadlimits und vieles mehr zu erzwingen. Diese Voreinstellungen beeinflussen die Art der Cantata Tests. Und sie begrenzen den Umfang der Testgenerierung.

Wie gründlich getestet wird, kann vorab bestimmt werden. Ein White-Box- oder ein Black-Box-Konzept? Beides ist möglich. Die Entscheidung über die Art von Unit-Tests mit Cantata AutoTest hängt ab von den geplanten Zielen und wie sich der Code ändert. Zum Beispiel, um das Refakturieren statischer Funktionen zu erlauben, ohne vorhandene Black-Box-Tests zu zerstören.

AUTOTEST WARNUNGEN UND FEHLERMELDUNGEN

Sobald es zu unvollständigen Tests oder verdächtiger Codequalität kommt, gibt es Fehlermeldungen im AutoTest Generation Report. Diese Warnungen zeigen, wo es mögliche Probleme im Source Code gibt oder ob er dynamisch getestet werden kann. Sie können so einen erheblichen Wert darstellen.

Cantata AutoTest meldet:

  • unreachable Code (nicht erreichbarer Code), dort wo keine Testfälle generiert werden können
  • potential crash scenarios (mögliche Crash-Szenarien): Null-Pointer, Out-of-Bounds-Array-Indices, Decisions mit nicht-initialisierten Variablen und Divisionen durch Null
  • type truncation (Typ-Trunkierung), wo Datenumwandlung zu Datenverlusten führen könnten
  • uninitialised data use (nicht-initialisierte Datenverwendung), zum Beispiel als Feld innerhalb einer großen Struktur
  • non-constant static data within a function (nicht-konstante statische Daten innerhalb einer Funktion), so dass ihr Wert bei Start eines Testfalles unbekannt ist
  • non-returning functions (nicht-wiederkehrende Funktionen), wenn eine Funktion die Kontrolle zum Aufrufer nicht zurückgibt. Cantata verfügt allerdings über die Fähigkeit, das für Testzwecke zu umgehen.
  • implicit function declarations (implizite Funktionsdeklarationen), wenn eine Funktion aufgerufen wird, bevor sie deklariert wurde.
Weitere Informationen zu Cantata Autotest

Mehr Informationen zu Cantata AutoTestest finden Sie in unserem White Paper: