Was passiert, wenn Funktionen von der Software Under Test (SUT) aufgerufen werden? Diese Frage ist wesentlich und stellt sich auf allen Ebenen dynamischer Tests. Cantata Call Interface Control erstellt automatisch das notwendige Test Framework für diese Schnittstellen. Dies vereinfacht:

  • die Schnittstelle zwischen der SUT und aufgerufenen Objekten (ob Bestandteil des Builds oder nicht) zu simulieren
  • die Schnittstelle zwischen der SUT und den aufgerufenen, im Build enthaltenen Objekten abzufangen
  • für die SUT zugängliche Daten zu setzen und zu prüfen, wenn Funktionsaufrufe erfolgen
  • Rückgabewerte zur SUT zu setzen und zu prüfen oder Ausnahmezustände zu verursachen
  • Fehler in die SUT zu injizieren
  • die korrekte Abfolge der Aufrufe zu prüfen
  • jede einzelne Instanz eines Funktionsaufrufs zu prüfen – so kann bei jedem Aufruf ein unterschiedliches Verhalten vorgegeben und geprüft werden

Einzigartig in Cantata ist das automatische Wrapping, um Aufrufe nicht nur zu simulieren sondern diese abzufangen. Damit haben Sie ein unvergleichliches Instrument zur Hand, um Aufrufe sowohl in Unit-, als auch in Integrationstests zu kontrollieren.

What is Cantata Call Control?

Aufrufkontrollen in Cantata werden automatisch erstellt – für alle Funktionsaufrufe der Software Under Test (SUT). Dazu gehören zum Beispiel Funktionen in derselben oder in anderen Dateien, third-party Code, Bibliotheken des Betriebssystems oder von Compilern. In welcher Machart sollen die Aufrufe von jeder Funktion aufgebaut sein? Mit Cantata Call Control kann das jeder Benutzer individuell definieren:

  • Stubs, um Aufrufe an Objekte zu simulieren, die nicht im Build enthalten sind.
  • Isolates, um spezifische Aufrufe zu simulieren, die Teil des Builds sind.
  • Wrapper, um spezifische Aufrufe zu simulieren oder abzufangen, die Teil des Builds sind.
  • Dependency Resolver, um undefinierte Referenzen automatisch aufzulösen.

Jede Art von Aufrufkontrolle in Cantata ist – soweit erforderlich – in C/C++ geschrieben. So ergibt sich ein Test Control Point in der Ablaufverfolgung, um so für die SUT verfügbare Daten und Parameter bzw. Rückgabewerte zu setzen und zu prüfen.

Da jeder Kontrolltypus mehrere Fälle abdecken kann, kann unterschiedliches Verhalten genauso wie ein Aufrufauftrag eingestellt oder geprüft werden – und zwar jedes Mal, wenn ein Aufruf in einem Testfallszenario gemacht wird.

Der Cantata Dependency Resolver stellt fehlende Bezüge fest und fügt automatisch den Code hinzu, der benötigt wird, um undefinierte Referenzen (seien es Methoden oder Variablen) zu lösen.
Cantata verfügt über unterschiedliche Aufrufsteuerungen. Tester können deshalb wählen, ob Simulation oder das Abfangen von Aufrufen geeigneter sind, um den Code ablaufen zu lassen und ihn zu prüfen.

Cantata Wrapping, was ist das?

Wrapping dient dazu, Funktionsaufrufe abzufangen oder zu simulieren. Dabei geht Wrapping weit über traditionelle Simulationen (Stubs, Mocks, Fakes etc.) hinaus. Besonders dann, wenn mehrere Objekte integriert sind, bietet es mehr Flexibilität um Schnittstellen zu testen.

Automatisch generierte Wrapper fangen Aufrufe vor (BEFORE Wrapper) oder nach dem Aufruf (AFTER Wrapper) ab. Oder sie ersetzen den Originalaufruf durch eine Simulation (REPLACE Wrapper).

Wenn ein Cantata Testskript verwendet wird, werden BEFORE-, AFTER- und REPLACE-Sektionen des Wrappers in das Testskript eingefügt. Wrapping ist auch außerhalb des Cantata-Test-Skripts möglich – so behält man auch mit anderen Testtreibern die Kontrolle über das Aufruf-Interface.

“Very useful, especially for checking the messages sent from one process to another, and also for simulating responses from external processes to the process under test.”

Dave Parker, Software Engineer, Marconi Communications

“Without this [Cantata wrapping], difficult external conditions not directly influenced by our code, such as memory allocation errors, may have been difficult to simulate.”

Simon Prior, Primary Reactor Protection System project, OSyS.

Wobei hilft mir Wrapping?

AUFRUFE IN UNITTESTS ABFANGEN UND SIMULIEREN

Unit-Tests prüfen eine oder mehrere Funktionen ohne den Rest des Systems zu betrachten. Herkömmliche Aufrufkontrollen (zum Beispiel Stubs, Mocks, Fakes, Dummies) simulieren nur die aufgerufenen Objekte außerhalb der kompilierten Software-Unit, die gerade getestet wird.

Cantata Wrapping ermöglicht die Kontrolle über spezifische Funktionsaufrufe sowohl innerhalb, als auch außerhalb des Kompilierungsrahmens. Spezifische Aufrufe von Funktionen können wie folgt kontrolliert werden:

  • Simulation Wrapper, um den Aufruf zu ersetzen
  • Intercept Wrapper, um die Schnittstellenparameter vor und nach dem Aufruf festzulegen und zu prüfen

Jeder Wrapper erlaubt außerdem, alle verfügbaren Daten festzulegen und zu prüfen, wenn die Aufrufe getätigt werden.

Wenn es um die automatisierte Kontrolle innerhalb des Kompilierungsrahmens geht, ist Wrapping einmalig – zum Beispiel, wenn Funktionen andere Funktionen in der selben Datei oder Klasse aufrufen. Auch haben Tester eine größere Auswahl, wenn sie definieren wollen, was im Rahmen für isolierte oder Cluster Unittests enthalten sein soll.

AUFRUFE BEI INTEGRATIONS- UND SYSTEMTESTS ABFANGEN UND SIMULIEREN

Bei Integrations- und Systemtests wird die tatsächliche Interaktion zwischen mehreren Units geprüft. Je mehr Units integriert werden, desto weniger sinnvoll wird es, diese Units durch Simulationen zu ersetzen. Bei Integrations- und Systemtests behält Cantata Wrapping alle Vorteile, die es auch bei Unittests bietet. Aber noch vorteilhafter ist es, spezifische Aufrufe zu simulieren oder abzufangen, während man die tatsächlichen Interaktionen testet.

Cantata Wrapping Interceptions sind für sämtliche C/C++ Funktionsaufrufe verfügbar, die von irgendeiner anderen Stelle der Software Under Test an folgende Komponente gemacht werden:

  • andere Softwarekomponenten im gleichen Build
  • externe Software, unter anderem Software von Drittanbietern oder Objektcode
  • Aufrufe von Funktionen des Betriebssystems oder von Standardbibliotheken
  • Firmware oder Hardware

Cantata Wrapping erlaubt es dem Tester, das tatsächliche Verhalten der Schnittstelle zu prüfen anstatt Testszenarien zu verwenden, die auf Annahmen in einer Simulationsumgebung basieren. Das Abfangen der tatsächlichen Aufrufe ermöglicht einzigartige Möglichkeiten wie die Erzeugung von Fehlerzuständen. Mit diesen kann man das Laufzeitverhalten der realen Interaktionen überprüfen (wie z. B. Fehlerzustände in Betriebssystemen, im Code von Drittanbietern, in Firmware und Hardware), welche sonst nicht getestet würden, weil es unmöglich oder zu teuer wäre.

Wie funtkioniert Wrapping?

Cantata Wrapping arbeitet mit einer speziellen Zugangsinstrumentierung, um den Zugriff (über GUI oder CLI) möglich zu machen. Dabei nutzt es eine Kopie des Source Codes, um Funktionsaufrufe von der Software Under Test (SUT) abzufangen.

Alles, was bei einem C- oder C++-Funktionsaufruf aufgerufen werden kann (zum Beispiel eine andere Funktion, ein Objekt eines Drittanbieters, eine Datenbank usw.), kann auch mit einem Wrapper gesteuert werden. Ein Wrapper hat ein identisches Funktionsmuster wie das zu ersetzende aufgerufene Objekt. Die Testability Instrumentierung macht es aber möglich, das aufgerufene Objekt in den Test Build einzubauen, ohne Linkerfehler zu verursachen.

Die BEFORE-, REPLACE- und AFTER-Wrapper-Bereiche fügen programmierbare zusätzliche C- bzw. C++-Funktionen ein, die wiederum andere Wrapper-Bereiche oder das aufgerufene Objekt aufrufen können. Oder sie reichen es zurück an die SUT.

Jeder Wrapper-Bereich enthält Cantata Richtlinien, um die Aufrufreihenfolge aufzuzeichnen oder die Parameter und Fehlerzustände zu modifizieren und zu prüfen. Das gilt auch für sämtliche dem SUT zur Verfügung stehenden Daten, Objektabrufe und Returns.

SO EDITIEREN SIE CANTATA FUNKTIONSAUFRUFE

Cantata erstellt automatisch jeden Wrapper (mit BEFORE-, AFTER- und REPLACE-Bereichen) im Testskript mit einer standardmäßigen BEFORE-AFTER-Wertekombination. Das bedeutet, dass aufgerufene Objekte mit Wrappern abgefangen werden können, ohne dass der Tester den Rückgabewert vorgeben muss.

Zusätzliche Wrapper-Wertekombinationen – in Before-After- oder Before-Replace-Paaren – können hinzugefügt werden, um alle Parameterwerte, welche zum und vom aufgerufenen Objekt geliefert werden, prüfen zu können. Werden Fälle hinzugefügt, bietet Cantata automatisch Abgleiche von tatsächlichen und erwarteten Werten an – und zwar für alle Parameter, die das Interface durchlaufen.

Ein Funktionsaufruf an ein Objekt kann sowohl alle Aufrufe im Wrapper enthalten, als auch nur ausgewählte aufgerufene -Funktionen. Wrapper sind als C- bzw. C++-Code in die Cantata Testskripte eingebaut. Sie können über die Cantata GUI oder direkt über den C/C++-Editor geändert werden.

AUFRUFÜBERWACHUNG IN TESTFÄLLEN

Cantata Schnittstellenprüfungen können Stubs, Wrapper oder Isolates verwenden. Auf diese Weise erhält man unterschiedliches Verhalten, je nachdem, unter welchen Gegebenheiten der Aufruf gemacht wurde. Diese kontrollierten Funktionsaufrufe und Instanzen werden im Cantata Testskript dafür verwendet, die erwartete Reihenfolge von Aufrufen und das zu kontrollierende Verhalten für jeden Testfall festzulegen.

Die Kontrolle von erwarteten Aufrufreihenfolgen ist sehr flexibel (linear, fixed size loops, parallel. etc.) und kann für spezifische Reihenfolgen oder für jeden kontrollierten Aufruf festgelegt werden. Die Reihenfolge der erwarteten Aufrufe eines Testfalls kann im Cantata-GUI (Testskript-Manager) oder direkt im C-/C++-Editor geändert werden.

Weitere Informationen über Wrapping

Weitere Informationen über Wrapping finden Sie in unserem „Wrapping Feature Brief“: