Entdecken Sie das TÜV-zertifizierte GoogleTest mit Agentic AI für C/C++-Tests!
Details ansehen »
Whitepaper
Bevor Sie loslegen, sehen Sie sich unten eine Vorschau an.
Die Verifizierung und Validierung von Software hängt von den Zielen der funktionalen Sicherheit, dem Geschäftsrisiko und der Qualitätskultur des Unternehmens ab. Die Entwicklung sicherer und qualitativ hochwertiger Software erfordert mehr als Entschlossenheit – sie setzt fundiertes Wissen und die richtige Kombination aus Testverfahren und -werkzeugen voraus.
Dieses Dokument erläutert, wie Entwicklungsteams die Qualitätssicherung durch die Kombination automatisierter Testverfahren verbessern können, darunter:
Die besprochenen Konzepte sind auf jede Programmiersprache anwendbar; Beispiele aus der C/C++-Entwicklung werden verwendet. Parasoft C / C ++ test.
Bei der Betrachtung möglicher Softwarefehlfunktionen auf höherer Ebene lassen sich verschiedene Klassen von Softwarefehlern unterscheiden:
Die ersten beiden Kategorien fallen unter das Anforderungsmanagement. Diese Arbeit konzentriert sich auf die dritte Kategorie, die ein breites Spektrum potenzieller Softwareprobleme umfasst.
Was bedeutet „eine Anforderung wurde falsch codiert“? Das kann Verschiedenes bedeuten.
Betrachten wir ein Softwaremodul, das zweitausend Messwerte pro Sekunde verarbeiten soll.
Keine einzelne Technologie beseitigt alle Fehlertypen vollständig. Nicht initialisierter Speicher lässt sich durch musterbasierte statische Analyse erkennen, während die Erkennung von Pufferüberläufen eine fortgeschrittene, flussbasierte statische Analyse oder eine Speicherüberwachung zur Laufzeit erfordert. Code, der nie ausgeführt wird, kann identifiziert werden durch Codeabdeckungsanalyse. Anforderungen auf niedriger Ebene müssen entsprechende Unit-Tests haben, einschließlich Leistungsprüfungen und Rückverfolgbarkeitsverbindungen zu den Anforderungen, die sie überprüfen und validieren.
Nicht alle Softwareprojekte benötigen alle verfügbaren Testtechnologien, und Unternehmen stehen vor dem Dilemma, Budget und Qualität in Einklang zu bringen. Projekte im Bereich der funktionalen Sicherheit werden höchstwahrscheinlich alle verfügbaren Technologien einsetzen, um kompromisslose Qualität und die Einhaltung von Software-Sicherheitsstandards zu gewährleisten. ISO 26262 , DO-178Cden IEC 62304.
Teams wählen häufig statische Analysen, Unit-Tests, Integrationstests, Systemtests und Codeabdeckung, da diese einen Großteil der Softwarefehler abzudecken scheinen. In jedem Fall müssen Teams, die Qualitätssicherungsprozesse entwickeln, die verschiedenen Testmethoden kennen und die Konsequenzen der Auswahl einer bestimmten Teilmenge der verfügbaren Testtechnologien verstehen.
Die Zurückhaltung bei der Implementierung einer breiten Palette von Testtechnologien rührt oft von der Befürchtung her, dass die Verwendung mehrerer Techniken einen erheblichen Mehraufwand für das Entwicklungstempo und Auswirkungen auf das Budget mit sich bringt.
Die Kosten für mehrere separate Tools, der Lernaufwand und die Notwendigkeit, zwischen verschiedenen Nutzungsmodellen und Schnittstellen zu wechseln, können problematisch sein. Daher versuchen Entwickler, den Einsatz von Tools und Automatisierung zu vermeiden, da dies ihre Aufmerksamkeit vom Programmieren auf die Tool-Nutzung lenkt und somit ihre Produktivität mindert.
Bevor man über den Nutzen eines einheitlichen Testwerkzeugs spricht, ist es wichtig, dessen Erwartungen zu definieren. Das Werkzeug sollte:
Einheitliche Tests helfen, eine Reihe von Problemen zu vermeiden, darunter:
Wie bereits in der Einleitung erwähnt, lassen sich Softwarefehler in verschiedene Kategorien einteilen, daher kann nicht erwartet werden, dass sie alle mit einer einzigen Testmethode identifiziert werden können. Ein konkretes Beispiel hierfür ist der folgende Codeausschnitt:
Beispielquellcode.
Diese wenigen Codezeilen enthalten mehrere Probleme. Insbesondere versucht der Entwickler in Zeile 13, einen globalen Puffer mit dem in der Funktion `calculateIdx()` berechneten Indexwert zu initialisieren, ohne jedoch zu prüfen, ob dieser im zulässigen Bereich liegt. Selbst bei Dutzenden manueller Tests wird dieses Problem möglicherweise nicht aufgedeckt, da das Schreiben eines Integer-Werts an eine beliebige Speicheradresse selten sofort sichtbare Auswirkungen hat.
Doch eines Tages, höchstwahrscheinlich nach der Veröffentlichung, könnte sich das Speicherlayout ändern, und die Operation aus Zeile 13 würde die Anwendung zum Absturz bringen. Interessanterweise kann es sein, dass die statische Analyse dieses Problem aufgrund der Schleife zur Indexberechnung nicht erkennt.
Im Gegensatz dazu erkennt ein Speicherüberwachungstool, das den Quellcode durch das Einfügen spezieller Prüfungen instrumentiert und fehlerhafte Speicheroperationen meldet, Softwareprobleme nur auf tatsächlich ausgeführten Pfaden. Dieser Ansatz trifft keine Annahmen – ein großer Vorteil gegenüber der statischen Analyse, da die Genauigkeit der gemeldeten Probleme sehr hoch ist. In diesem Beispiel identifizierte die Speicherfehlererkennung von Parasoft das Problem problemlos.
Um Abweichungen zwischen erwarteten und tatsächlichen Ergebnissen zu erkennen, müssen die Ergebnisse mit vordefinierten Spezifikationen verglichen werden. Während der Kern statische und dynamische Analyse Tools zielen auf Fehler wie Speicherfehler oder Sicherheitslücken ab, die Überprüfung der funktionalen Korrektheit erfolgt jedoch typischerweise mit anderen Methoden. Zu den gängigsten gehören manuelle Systemtests, Integrationstests und Komponententests.
Unit-TestUnit-Tests, die den Aufwand der Entwickler erfordern, Testfälle mit Verifizierungszusicherungen zu erstellen, sind eine primäre Methode, um funktionale Regressionen aufzudecken. (Die technischen Grundlagen von Unit-Tests werden hier nicht behandelt.) Dieser Artikel konzentriert sich stattdessen darauf, wie ein einheitliches Testwerkzeug den Unit-Test-Prozess verbessern und so Produktivität und Effizienz steigern kann, ohne die Entwickler zu behindern.
Es gibt viele Bereiche, in denen ein einheitliches Testtool den Unit-Testing-Prozess erleichtern kann. Zu den Vorteilen gehören:
Die Erstellung von Tests mithilfe grafischer Assistenten oder Editoren kann die Produktivität eines gesamten Unternehmens steigern, indem die QA-Teams aktiv in den Prozess des Schreibens von Unit-Tests eingebunden werden und so einen wesentlichen Beitrag zum Entwicklungsprozess leisten. Für QA-Teammitglieder ist die Nutzung grafischer Assistenten einfacher als das Schreiben von Testcode in Code-Editoren, da die Konfiguration von Werten über Eingabeformulare keine fortgeschrittenen Programmierkenntnisse erfordert und weniger Zeit in Anspruch nimmt, insbesondere wenn Teammitglieder wenig Erfahrung haben. Parasoft hat sich jedoch weiterentwickelt und integriert einen MCP-Server sowie KI-Agenten, um Tests autonom durchzuführen.
Testabdeckungsberichte aus Unit- und Systemtests liefern wertvolle Daten, insbesondere in Kombination. Ohne Rückverfolgbarkeit zu den Anforderungen fehlt den Teams jedoch der Kontext, um kritische Fragen zu beantworten, wie zum Beispiel:
Ein Blick auf Test-zu-Anforderungs-Rückverfolgbarkeitsbericht beantwortet all diese Fragen.
Die Möglichkeit, Anforderungen mit Ergebnissen verschiedener Testarten zu korrelieren, ist ein großer Vorteil eines einheitlichen Testwerkzeugs. Ergebnisse von Komponententests, Systemtests, Integrationstests sowie Codierungsstandards und Code-Metriken lassen sich korrelieren, um Feedback zum Status kritischer und nicht-kritischer Anforderungen zu erhalten.
Die vollständige Prüfung aller Anforderungen und die nahezu vollständige Codeabdeckung sind ein sicheres Zeichen für einen guten Projektfortschritt. Diese Daten geben jedoch keine Auskunft über die zukünftigen Kosten für Fertigstellung, Bereitstellung und Wartung des Endprodukts.
Ohne Code-Metriken wie zyklomatische Komplexität, durchschnittliche Vererbungstiefe, durchschnittliche Anzahl von Funktionsparametern und – besonders wichtig – der Anteil an dupliziertem Code lassen sich diese Fragen kaum beantworten. All diese Kennzahlen liefern wertvolle Informationen, die Projektmanagern helfen, den Zustand des Projektcodes und die zukünftigen Kosten für Wartung und Anpassungen abzuschätzen.
Die Einhaltung der gewünschten „grünen“ Code-Metriken und die Vermeidung riskanten Codes erfolgen nicht von selbst. Entwickler benötigen Feedback zu ihrem Code, und je früher sie dieses erhalten, desto näher liegt der Zeitpunkt der Entwicklung und desto schneller können sie Anpassungen vornehmen. So senkt sofortiges Feedback die Kosten für Codeverbesserungen, während verzögertes Feedback bis zu nächtlichen Builds oder gar Continuous-Integration-Sitzungen die Kosten für Codeverbesserungen erhöht.
Die ideale Lösung integriert die Einhaltung von Codierungsstandards direkt in die Entwicklungsumgebung (IDE) und bietet interaktives Feedback während des Programmiervorgangs. Ein einheitliches Testtool sollte dies unterstützen, indem es flexibel genug ist, damit Teams ihre bevorzugten Codierungsrichtlinien auswählen und die notwendigen IDE-Erweiterungen bereitstellen können. Letztendlich lässt sich das Wiederauftreten problematischer Codekonstrukte am effektivsten verhindern, indem Codierungsrichtlinien automatisch durchgesetzt werden, sodass Entwickler in Echtzeit lernen und sich anpassen können.
Die Daten verschiedener Testverfahren eines Projekts bergen in Kombination ein großes Potenzial für die Ableitung von Kennzahlen zweiter Ebene und für fortgeschrittene Analysen. Ein einheitliches Testtool ermöglicht es Teams, Code aus einer völlig neuen Perspektive zu betrachten. Ein fehlgeschlagener Unit-Test hat für Entwickler eine unterschiedliche Bedeutung, je nachdem, ob er in Code auftritt, der laut Code-Metriken-Analyse ein hohes oder niedriges Risiko aufweist. Werden diese Informationen mit Statistiken aus der Versionskontrolle kombiniert und mit den Anforderungen korreliert, können Teams fundiertere Entscheidungen darüber treffen, wann und wie der Code korrigiert werden sollte.
Eine weitere Art von Analysen, die von einem einheitlichen Testtool angeboten werden, ist die Testauswirkungsanalyse, und sie hat großes Potenzial zur Steigerung der Teamproduktivität. Fähigkeit zur Analyse der Testauswirkungen Ein einheitliches Testwerkzeug versucht, den Zusammenhang zwischen Quellcode, Testfällen und Codeabdeckung zu verstehen, um die optimale Menge an Testfällen für die Verifizierung und Validierung spezifischer Codeänderungen zu berechnen. Dadurch können Teams ihre Testsitzungen reduzieren, indem sie nur eine kleine Teilmenge der Tests anstelle vollständiger Regressionstests ausführen. Diese Konzentration auf das absolut Notwendige führt zu erheblichen Einsparungen bei mittelgroßen und großen Projekten.
Parasoft C/C++test ist eine einheitliche, vollständig integrierte Testlösung für C/C++-Softwareentwicklungsprojekte. Parasoft C/C++test ist als Plugin für gängige IDEs wie Eclipse, VS Code und Visual Studio verfügbar. Die enge Integration in die IDE verhindert die oben genannten Probleme.
Entwickler können während der Codeerstellung sofort Prüfungen auf Einhaltung von Codierungsstandards durchführen oder Unit-Tests ausführen. Mitglieder des QA-Teams können manuelle Testszenarien durchführen, während die Anwendung auf Codeabdeckung und Laufzeitfehler überwacht wird. Offline-Analysen, wie z. B. Ablaufanalysen, können in der Continuous-Integration-Phase durchgeführt werden. Server-Sitzungen, die über eine komfortable Befehlszeilenschnittstelle unterstützt werden, melden die Analyseergebnisse an das zentrale Berichts- und Analyse-Dashboard, das aggregierte Informationen aus der Entwicklungsumgebung anzeigt.
Die umfassenden Reporting-Funktionen von Parasoft, darunter die Integration von Daten aus Drittanbieter-Tools, das Senden von Testergebnissen an die IDEs der Entwickler und die Durchführung komplexer Analysen, ermöglichen es Anwendern, zum richtigen Zeitpunkt die richtigen Maßnahmen zu ergreifen. Kontinuierliches Feedback in jeder Phase des Workflows beschleunigt die agile Entwicklung und senkt die Kosten für die Einhaltung von Sicherheitsstandards.
Der in diesem Artikel beschriebene Ansatz für Qualitätssicherungsprozesse und -architektur beschränkt sich nicht auf C/C++-Projekte. Parasoft bietet ähnliche Lösungen für Java, C# und VB.NET an.
Bereit, tiefer einzutauchen?