Seien Sie am 30. April dabei: Vorstellung von Parasoft C/C++test CT für kontinuierliche Tests und Compliance-Exzellenz | Registrierung

Verwenden des Parasoft C / C ++ - Tests mit CMake für Unit-Tests

Headshot von Miroslaw Zielinski, Direktor Produktmanagement bei Parasoft
5. Mai 2020
6 min lesen

Haben Sie sich jemals gefragt, wie Sie Parasoft C/C++test mit CMake für Komponententests verwenden können? In diesem Beitrag erfahren Sie, wie.

Die Veröffentlichung von C/C++test 2020.1 bietet die Möglichkeit dazu Integrieren Sie den C / C ++ - Test in CMake für die statische Analyse und Unit-Tests. Dieser Beitrag konzentriert sich auf die Verwendung des Parasoft C / C ++ - Tests mit CMake-basierten Projekten zum Testen von Einheiten.

Unit-Tests lassen sich komplizierter in den Entwicklungsprozess integrieren als statische Analysen. Am Ende muss die ausführbare Binärdatei erstellt werden. Dies ist besonders problematisch bei großen und komplexen Projekten, die aus mehreren Bibliotheken und ausführbaren Dateien bestehen.

Die JSON-Datei mit den Kompilierungsinformationen, die wir für die statische Analyse verwenden, reicht nicht aus. Es enthält keine wichtigen Informationen zur Struktur des Projekts - welche Dateien in welchen Binärdateien enthalten sind und welche gemeinsam getestet werden sollten.

Integration von Unit-Tests in CMake-basierte Projekte

Um die einfache Integration von Parasoft C / C ++ - Testeinheitentests in CMake-basierte Projekte zu ermöglichen, wird in der Version 2020.1 eine CMake-Erweiterung eingeführt, mit der Unit-Testziele für C / C ++ - Tests definiert werden können. Diese Ziele generieren automatisch die C / C ++ - Testprojektdateien, die zum Erstellen, Ausführen und Verwalten von Komponententests verwendet werden können.

Mit dieser Erweiterung sollen Benutzer in die Lage versetzt werden, die gesamte Infrastruktur, die für das Testen von Parasoft C / C ++ - Testeinheiten erforderlich ist, zusammen mit ihren regulären Zielen in den CMake-Konfigurationsdateien zu definieren.

Ein Beispiel für Unit-Tests an CMake-basierten Projekten

Mal sehen, wie es mit einem funktioniert Unit-Test-Beispiel mit dem C/C++test Professional – Eclipse-basierten Tool, das über eine reichhaltige Benutzeroberfläche verfügt. Laden Sie die Version 2020.1 herunter und installieren Sie sie, falls Sie dies noch nicht getan haben.

Folge diesen Schritten

Im Hauptinstallationsverzeichnis von C / C ++ test Professional finden Sie die CMake-Erweiterung mit dem zugehörigen Beispiel. Siehe folgendes Verzeichnis: Integration / cmake.

Für unsere Experimente empfehle ich, den Integrations- / cmake-Ordner aus der Installation an Ihren bevorzugten Speicherort zu kopieren. Die Struktur des Beispiels ist unten dargestellt:

Der App-Ordner enthält das ausführbare Ziel. Der Modulordner mit seinen drei Unterordnern (mod1, mod2 und mod3) repräsentiert statische Bibliotheken, die zur Verknüpfung mit der ausführbaren Datei verwendet werden. Darüber hinaus enthält der Ordner cmake die C / C ++ - Testerweiterung für CMake. Möglicherweise möchten Sie diesen Ordner in Ihr reales Projekt kopieren, um diese Erweiterung zu verwenden.

Diese vereinfachte Struktur zeichnet ein Bild von typischen Herausforderungsteams, die versuchen, Unit-Test-Gesicht zu implementieren: So teilen Sie das gesamte Projekt in testbare Blöcke auf, die Gruppen von Dateien darstellen, die logisch zusammengehören.

In den meisten Fällen möchten Entwickler keine Komponententests für eine Blob-Binärdatei ausführen, die durch Kompilieren aller Dateien aus einem gesamten Projekt erstellt wurde. Benutzer werden höchstwahrscheinlich daran interessiert sein, die Testfälle für dieselben binären Ziele (ausführbare Dateien und Bibliotheken) hinzuzufügen, die sie im Projekt definiert haben.

Hinzufügen von Testfällen für dieselben im Projekt definierten binären Ziele

Bevor wir die Details der Konfigurationssyntax diskutieren, wollen wir anhand des bereitgestellten Beispiels sehen, wie sie funktioniert.

1. Erstellen Sie im Verzeichnis der obersten Ebene, in dem sich der App-Ordner befindet, ein Build-Verzeichnis, legen Sie eine CD hinein und rufen Sie eine Generierung von Build-Skripten auf, wie folgt:

2. Nachdem CMake mit der Generierung der Build-Skripte (Makefiles) fertig ist, rufen Sie make auf, um das Beispielprojekt zu erstellen:

3. Starten Sie C / C ++ test professional (die ausführbare Datei cpptest im Installationsordner). Wählen Sie einen leeren Arbeitsbereich aus, verwenden Sie "Dateimenü -> Importieren ... -> Vorhandene Projekte in den Arbeitsbereich" und wählen Sie "Stammverzeichnis" als Hauptordner, in den Sie das Beispiel kopiert haben. Der Assistent durchsucht den ausgewählten Ordner rekursiv und findet alle Projekte, die automatisch generiert wurden. Wenn Sie so etwas wie unten sehen, können Sie auf "Fertig stellen" klicken.

Eclipse importiert alle Projekte und Sie haben einen neuen Arbeitsbereich für Ihre Unit-Tests bereit. Sie müssen nichts weiter tun, um die Testfälle hinzuzufügen und auszuführen und um die Codeabdeckung zu verbessern.

4. Wählen Sie im Projektnavigator alle drei Projekte aus, klicken Sie mit der rechten Maustaste und verwenden Sie die Testkonfiguration „Parasoft -> Testen mit -> Eingebaut -> Komponententest -> Komponententests generieren“, um die Testfälle automatisch zu generieren. Führen Sie nach dem Generieren der Tests die Konfiguration "Unit Unit Tests ausführen" am selben Speicherort aus.

Mit diesen einfachen vier Schritten haben Sie die Projektinfrastruktur für Unit-Tests vorbereitet. Das Team ist nun bereit, die Testfälle zu knirschen.

Wie funktioniert es?

Zusätzlich zu den regulären Build-Zielen enthalten die Dateien CMakeLists.txt Unit-Test-Ziele. Beim Generieren der Build-Skripte mit cmake werden auch automatisch C / C ++ - Testprojektdateien generiert. Später während des Erstellungsprozesses werden automatisch zusätzliche Erstellungsdatendateien generiert, die für C / C ++ - Testprojekte erforderlich sind.

Alles, was zum Definieren der Struktur der Unit-Test-Projekte erforderlich ist, befindet sich in den Dateien CMakeLists.txt. Das Team muss keine zusätzlichen Konfigurationsdateien verwalten. Alles ist schön und sauber. Das Projekt kann ausgecheckt werden, Build-Skripte und C / C ++ - Testprojekte können generiert werden, Tests können zusammen mit dem Quellcode hinzugefügt und eingecheckt werden, und vollständige Tests können im CI durchgeführt werden.

Eine genauere Betrachtung

Schauen wir uns die C / C ++ - Test-CMake-Erweiterung genauer an und wie sie bei der Definition der Infrastruktur für Testprojekte hilft. Öffnen Sie die Datei modules / mod1 / CMakeLists.txt. Sie sollten so etwas wie unten sehen:

In den ersten sechs Zeilen sehen Sie die reguläre Zieldefinition. Hier definieren wir ein einfaches Bibliotheksziel mit einer Quelldatei mod1.cpp und einem Include-Dateiverzeichnis. Dies sehen Sie normalerweise in Ihren CMake-Projekten.

In Zeile 11 haben wir jedoch eine neue CMake-Funktion, die mit der C / C ++ - Testerweiterung bereitgestellt wird. Mit dieser Funktion können Sie das Unit-Test-Ziel definieren, das alle erforderlichen C / C ++ - Testprojektdateien generiert. Die vollständige Beschreibung dieser Funktion finden Sie in den Integrationen / cmake / README.md. In diesem speziellen Beispiel wird Folgendes ausgeführt:

  • Linie 11: Zielname ist definiert. Standardmäßig wird es als Eclipse-Projektname verwendet
  • Linie 12: Die Compilerkonfiguration ist für den C / C ++ - Test angegeben, damit der Code analysiert und instrumentiert werden kann.
  • Linie 13: Quelldateien, die im Unit-Test-Ziel enthalten sein sollten, werden hinzugefügt
  • Linie 14: Der zielspezifische Speicherort für Include-Dateien wird dem Unit-Test-Ziel hinzugefügt. Dies ist das gleiche wie bei Ihren regulären Zielen.

Diese einfache Zieldefinition reicht aus, um ein Unit-Test-Projekt für den Parasoft C / C ++ - Test zu generieren. Projektdateien werden am Speicherort der Datei CMakeLists.txt generiert, was wahrscheinlich am bequemsten ist. Wenn Sie möchten, können Sie die Projektdateien außerhalb des Quellbaums generieren und Probleme beim Zusammenführen vermeiden. Dies wird in app / CMakeLists.txt angezeigt:

  • Linie 11: Zielname ist definiert. Standardmäßig wird es als Eclipse-Projektname verwendet.
  • Zeilen 12, 13: Der Speicherort des C / C ++ - Testprojekts wird angegeben. Hier erstellen wir das Projekt außerhalb des Quellbaums.
  • Zeilen 14, 15: Ein mit Eclipse verknüpfter Ordner wird erstellt. Sie müssen den Namen des Ordners und den Speicherort angeben, der verknüpft werden soll.
  • Zeile 16, 17: Quelldateien, die im Unit-Test-Ziel enthalten sein sollten, werden hinzugefügt
  • Linie 19: Für das Unit-Test-Ziel werden drei Bibliotheken hinzugefügt. Der C / C ++ - Test verwendet diese Bibliotheken beim Erstellen der ausführbaren Testdatei.

Weitere Informationen finden Sie in den folgenden Dateien unter Verzeichnis / integrations / cmake:

  • README.mc
  • app / CMakeLists.txt
  • modules / mod1 / CMakeLists.txt
  • tests / cpptest_modules / CMakeLists.txt

Zusammenfassung

Hier sind die wichtigen Punkte zur Erweiterung.

  • Die CMake-Erweiterung finden Sie in der Installation von C / C ++ test Professional im folgenden Verzeichnis: / integrations / cmake / cmake. Möglicherweise müssen Sie es in Ihre Projektstruktur kopieren.
  • Um CMake mit der testbezogenen Erweiterungsfunktion C / C ++ zu aktivieren, müssen Sie die Erweiterung mit einem Befehl wie dem folgenden in Ihre CMakeLists.txt-Dateistruktur aufnehmen:
    • Include (cmake / cpptest.cmake)
    • Siehe das Beispiel in integration / cmake / CMakeLists.txt.
  • Sie können Ihre Unit-Test-Ziele (welche Auswirkungen dies in den C / C ++ - Testprojekten hat) beliebig definieren. Sie können ein Unit-Test-Projekt für Ihre ausführbaren Dateien, Bibliotheken, Bibliothekskombinationen oder eine beliebige Sammlung von Dateien hinzufügen.
  • Sie müssen sicherstellen, dass alle erforderlichen Header-Dateien und Bibliotheken in Ihrer Zieldefinition enthalten sind. Hier gelten die regulären Regeln von CMake. Falls enthalten, wurde die Bibliothek oder Option auf globaler Ebene festgelegt. Es wird dann in Ihr Unit-Test-Ziel aufgenommen. Wenn Sie zielspezifische Einstellungen haben, müssen Sie diese hinzufügen.
  • Wenn Sie das Einheitentestziel für das vorhandene binäre Ziel (wie Bibliothek oder ausführbare Datei) hinzufügen, besteht die empfohlene Vorgehensweise darin, alle Einstellungen zu replizieren, die für das ursprüngliche Ziel vorgenommen wurden. Hinweis: Sie können der Funktion cpptest_add_executable ganze Ziele hinzufügen, die alle Quelldateien in das neue Ziel kopieren.
  • Wenn es Ihnen nichts ausmacht, dass C / C ++ - Testprojektdateien in Ihren Quelldateiverzeichnissen erstellt werden, ist dies die einfachste und empfohlene Einrichtung. Wenn Sie möchten, dass die Projektdateien irgendwo außerhalb Ihres Quellbaums abgelegt werden, können Sie dies problemlos tun.
  • Sie müssen keine generierten C / C ++ - Testprojektdateien (.project und .parasoft) einchecken. Sie werden für jeden Neubau neu erstellt. Sie sollten jedoch alle Testfälle und Stubs einchecken.
Erfahren Sie, wie Sie Parasoft C/C++test mit CMake-basierten Projekten für Komponententests verwenden.