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

Der Wert der Verwendung eines Unified C / C ++ - Testtools

Headshot von Miroslaw Zielinski, Direktor Produktmanagement bei Parasoft
17. April 2023
8 min lesen

Die effektivste Umgebung für Entwicklungstests ist eine Umgebung mit einer einheitlichen Testlösung, die tief in die IDE des Entwicklers integriert ist. Dank eines zentralisierten Tools wie Parasoft C/C++test können sich Teams beispielsweise beim Testen auf den Code konzentrieren, der zuletzt aktualisiert wurde und einem hohen Risiko ausgesetzt ist.

Eine einheitliche Testlösung mit tiefer Integration in die IDE des Entwicklers bietet die produktivste Umgebung für Entwicklungstests. Ein einheitliches Tool wie Parasoft C/C++test ermöglicht es Teams, ihre Tests auf risikoreichen und zuletzt geänderten Code zu konzentrieren.

Softwareverifizierung und -validierung ist ein fester Bestandteil der Softwareentwicklung. Der Aufwand und das Budget, die in bestimmte V&V-Projekte gesteckt werden, hängen von vielen Faktoren ab, beispielsweise den Zielen der funktionalen Sicherheit eines Projekts, dem Grad des Geschäftsrisikos oder der Qualitätskultur einer Organisation. Unabhängig davon, was ein Unternehmen dazu antreibt, Qualitätsinitiativen und -prozesse umzusetzen, bedarf es mehr als Entschlossenheit, um sichere und qualitativ hochwertige Softwareprodukte zu produzieren.

Die Auswahl geeigneter Testmethoden ist aus vielen Gründen eine herausfordernde Aufgabe. Die Technologie entwickelt sich rasant weiter und Unternehmen müssen sich entscheiden, welche Softwaretest-Tools sie einsetzen möchten. In vielen Fällen ist auch die Wahl zwischen Open Source- und kommerziellen Produkten schwierig.

In diesem Beitrag wird erläutert, wie automatisierte Testtechniken wie erweiterte statische Analyse, Laufzeitspeicherüberwachung, automatisierte Unit-Tests und Flussanalysen kombiniert werden können, um Qualitätssicherungsprozesse zu verbessern, und die Vorteile der Implementierung einer einheitlichen Testlösung aufgezeigt. Die hier besprochenen Konzepte sind generisch und können auf jede Programmiersprache angewendet werden, aber die Beispiele hier beziehen sich auf die Programmiersprachen C und C++, die mit erstellt wurden Parasoft C / C ++ test.

Fehlerklassen und Werkzeugautomatisierung

Wenn Sie über mögliche Softwarefehlfunktionen auf hoher Ebene nachdenken, können verschiedene Klassen von Softwarefehlern unterschieden werden: Fehler aufgrund fehlender Anforderungen, Fehler aufgrund falsch spezifizierter Anforderungen und Fehler, die auftreten, weil Anforderungen falsch codiert wurden. Die ersten beiden Klassen von Softwarefehlern fallen in die Kategorie des Requirements Engineering und werden hier nicht behandelt. Ich konzentriere mich hier auf Fehler, die durch eine falsche Implementierung verursacht werden, einschließlich einer Vielzahl potenzieller Softwareprobleme, mit denen viele Teams zu kämpfen haben.

Was bedeutet es also, dass eine Anforderung falsch codiert wurde? Es kann vieles sein. Nehmen Sie zum Beispiel eine falsch implementierte Anforderung: Unit-Tests zur Überprüfung der korrekten Implementierung schlagen fehl und Testautomatisierungstools erkennen und melden den Fehler. In einem anderen Beispiel kann ein Laufzeitanalysetool während eines Komponententests einen kritischen Speicherzugriffsfehler erkennen, der anhand der Ergebnisse des Komponententests allein nicht erkennbar ist. Verschiedene Tools können bestimmte Fehlerklassen besser erkennen, wie unten dargestellt.

Abbildung 1. Softwarefehler und eine Erkennungsstrategie.

Offensichtlich müssen nicht alle Softwareprojekte alle verfügbaren Technologien zum Testen und Verbessern der Softwarequalität verwenden, und Unternehmen stehen vor dem Dilemma, wie Budget und Qualität in Einklang gebracht werden können. Projekte, die sich auf die funktionale Sicherheit beziehen, werden wahrscheinlich alle verfügbaren Technologien auswählen, um eine kompromisslose Qualität sowie die Einhaltung von Software-Sicherheitsstandards wie ISO 26262 sicherzustellen. Andere Teams entscheiden sich möglicherweise nur für statische Analysen und Komponententests, wie es scheint decken einen erheblichen Teil der Softwarefehler ab, während einige Teams möglicherweise ein Open-Source-Framework für Unit-Tests als ausreichend erachten.

Die mangelnde Bereitschaft, eine breite Palette von Testtechnologien zu implementieren, beruht häufig auf der Sorge, dass die Verwendung mehrerer Techniken das Entwicklungstempo erheblich beeinträchtigt, ganz zu schweigen vom Budget. Dies ist eher ein echtes Problem, wenn Teams sich für die Auswahl nicht integrierter Tools entscheiden. Die Kosten für mehrere separate Tools, die Lernkurve und die Notwendigkeit, zwischen verschiedenen Nutzungsmodellen und Schnittstellen zu wechseln, können problematisch sein. Infolgedessen können Entwickler die Verwendung von Tools und Automatisierung vermeiden, da sie ihre Aufmerksamkeit vom Schreiben von Code auf die Verwendung von Tools lenken und so ihre Produktivität verringern.

Der Wert einer einheitlichen Testlösung

Es ist wichtig zu spezifizieren, was von einer einheitlichen Testlösung erwartet wird, bevor deren Wert besprochen wird. Im Idealfall sollte eine Lösung:

  • Unterstützt mehrere Testtechnologien
  • Seien Sie einfach zu bedienen
  • Erkennen Sie Funktionsprobleme und Regressionen
  • Stellen Sie die Rückverfolgbarkeit von den Anforderungen bis zu den Tests sicher
  • Messen Sie die Komplexität, Portabilität und Wartbarkeit von Code
  • Informieren Sie Entwickler, indem Sie beim Schreiben des Codes sofortiges Feedback geben
  • Geben Sie Informationen zum Entwicklungsfortschritt an
  • Kombinieren Sie Ergebnisse aus verschiedenen Techniken für erweiterte Analysen

Eine einheitliche und integrierte Testlösung hilft, eine Reihe von Problemen zu vermeiden:

  • Mehrere Lernkurven und Usability-Probleme bei der Verwendung von getrennten Tools mit unterschiedlichen Schnittstellen
  • Entwickler vom Schreiben von Code ablenken
  • Verhindern des Informationsaustauschs zwischen verschiedenen Elementen einer Toolchain
Whitepaper: Der Wert der Verwendung eines einheitlichen C / C ++ - Testtools

Erkennen Sie so viele Fehler wie möglich

Softwarefehler fallen in verschiedene Kategorien, daher kann nicht erwartet werden, dass alle von ihnen durch eine Testtechnik identifiziert werden. Zum Beispiel manuelle Tests auf Systemebene. Um ein konkreteres Beispiel zu liefern, sehen Sie sich den folgenden Beispielcodeausschnitt an:

Die wenigen obigen Codezeilen enthalten mehrere Probleme. Insbesondere versucht der Entwickler in Zeile 16, den globalen Puffer unter Verwendung des in der berechneten Indexwerts zu initialisieren berechneIdx () Funktion, aber sie können nicht überprüfen, ob sie innerhalb des zulässigen Bereichs liegt. Selbst wenn Dutzende manueller Testsitzungen durchgeführt werden, wird dieses Problem möglicherweise nicht aufgedeckt, da das Schreiben eines ganzzahligen Werts an einen zufälligen Speicherort selten sofort einen spektakulären Effekt hervorruft.

Aber eines Tages, höchstwahrscheinlich nach der Veröffentlichung, könnte sich das Speicherlayout ändern und der Vorgang ab Zeile 16 führt zum Absturz der Anwendung. Interessanterweise kann die statische Analyse dieses Problem aufgrund der Schleife, die zur Berechnung des Index verwendet wird, möglicherweise auch nicht erkennen. Aus Leistungsgründen müssen bei der Daten- und Kontrollflussanalyse, die in statischen Analysetools verwendet wird, Heuristiken und Vereinfachungen angewendet werden, um die Codeanalyse innerhalb einer angemessenen Zeit abzuschließen, und es ist üblich, sie in Schleifen anzuwenden, was bedeutet, dass einige Fehler möglicherweise übersehen werden.

Ein Speicherüberwachungstool, das den Quellcode durch Einfügen spezieller Überprüfungen instrumentiert und fehlerhafte Speicheroperationen meldet, erkennt diesen Fehler mit Sicherheit. Laufzeitanalysetools erkennen Softwareprobleme nur auf Pfaden, die tatsächlich ausgeführt werden, ohne dass Vermutungen angestellt werden müssen - ein großer Vorteil gegenüber statischen Analysen, da die Genauigkeit der gemeldeten Probleme sehr hoch ist.

In diesem Beispiel konnte das Problem durch die Speicherfehlererkennung von Parasoft leicht erkannt werden:

Eine umgekehrte Situation ist ebenfalls möglich – die statische Analyse kann Probleme erkennen, die die Laufzeitspeicherüberwachung nicht identifizieren kann. Beispielsweise besteht die Möglichkeit einer Nullzeiger-Dereferenzierung in Zeile 27/28 im folgenden Codeausschnitt. Rufen Sie an speichernPersonToFile funktion mit dem person Wenn das Zeigerargument null ist, wird ein Fehler verursacht. Dies tritt jedoch nur auf, wenn das PersonAusDB abrufen Funktion gibt null zurück. Ein solcher Zustand ist während Systemtestsitzungen unwahrscheinlich, da die Datenbankverbindung höchstwahrscheinlich wie erwartet funktioniert und die Tools zur Laufzeitspeicherüberwachung daher stumm bleiben. Die Flussanalyse innerhalb des statischen Analysetools erkennt jedoch problemlos den von dieser Funktion zurückzugebenden Nullzeiger und meldet ein potenzielles Problem bei der Dereferenzierung des Nullzeigers.

Abbildung 4. Beispiel für statische Analyseergebnisse.

Erkennen Sie funktionale Probleme und Regressionen

Was ist mit Code, der immer einwandfrei ausgeführt wird, aber nicht den Anforderungen entspricht? Statische und dynamische Analyse sind bei der Identifizierung solcher Probleme nicht hilfreich. Um Abweichungen zwischen dem erwarteten Ergebnis und dem tatsächlichen Ergebnis zu erkennen, ist ein Vergleich der Berechnungsergebnisse mit vordefinierten Werten erforderlich. Es gibt viele gängige Methoden zur Implementierung solcher Prüfungen, darunter manuelle Tests auf Systemebene, Integrationstests und Unit-Tests.

Es gibt viele Bereiche, in denen eine einheitliche Testlösung den Unit-Testprozess erleichtern kann. Die Liste der Vorteile umfasst:

  • Erhöht die Entwicklerproduktivität beim Erstellen von Testfällen, beispielsweise durch die Bereitstellung grafischer Assistenten zum Erstellen, Bearbeiten und Konfigurieren von Testfällen.
  • Integriert mit Testdoppel Frameworks, die ein einfaches Mocking und Stubbing ermöglichen, um komplexe Testszenarien zu simulieren, ohne dass große Codebasen erforderlich sind.
  • Korreliert Testfälle mit Codeabdeckungsberichten, um die Vollständigkeit der Tests zu beurteilen.
  • Optimiert Testsitzungen durch automatische Berechnung der minimalen Menge an Testfällen, die zur Überprüfung des Code-Deltas erforderlich sind.
  • Führt Codeabdeckungsberichte aus anderen Testtechniken zusammen, z. B. Tests auf manueller/Systemebene oder Integrationstests, um nicht getesteten Code zu identifizieren.
  • Verfolgt Ergebnisse auf Anforderungen zurück, um die Auswirkungen fehlgeschlagener Tests besser zu verstehen.

Die Testerstellung mit grafischen Assistenten oder Editoren kann die Produktivität eines gesamten Unternehmens steigern, indem die QS-Teams in den Prozess des Schreibens von Komponententests einbezogen werden, sodass sie aktiv zum Entwicklungsprozess beitragen. Für QA-Teammitglieder ist es einfacher, Grafikassistenten zu verwenden, als geeigneten Code in Code-Editoren zu schreiben, da das Konfigurieren von Werten mithilfe von Eingabeformularen (wie unten gezeigt) keine fortgeschrittenen Codierungsfähigkeiten erfordert und weniger zeitaufwändig ist, insbesondere wenn Teammitglieder keine Erfahrung haben . Der folgende Screenshot zeigt beispielsweise ein Beispiel für die Unit-Test-Funktion des Parasoft C / C ++ - Tests für C / C ++, einen Assistenten, der bei der Erstellung von Unit-Tests hilft.

Ein weiterer Vorteil der Verwendung einer einheitlichen Testlösung ist das Feedback, das sie über die Vollständigkeit der Tests und den Gesundheitszustand kritischer Geschäftsanforderungen liefert. Geringe Zahlen in der MC / DC Der Abdeckungsbericht kann auf eine unzureichende Zweigstellenabdeckung hinweisen, selbst wenn der Abdeckungsbericht für Anweisungen hohe Werte aufweist. Diese Art der Analyse erfordert eine Toolkette, die mehrere Abdeckungsmetriken unterstützt, sodass Teams mit etwas Einfachem beginnen können, z. B. Zeilen- oder Anweisungsabdeckung, und zu einer gründlicheren Codeabdeckung übergehen können, während sie ihre Testfälle verbessern.

Anforderungen zum Testen der Rückverfolgbarkeit

Unit-Test und Systemtestabdeckungsberichte sind hervorragende Informationsquellen über den Testprozess, insbesondere wenn sie kombiniert werden. Wenn die Testergebnisse jedoch nicht mit den Anforderungen korrelieren, fehlen den Teams mehrere wichtige Informationen. Durch das Betrachten von a Test-zu-Anforderungs-Rückverfolgbarkeitsberichtkönnen Sie schnell den Status der Bedarfsdeckung ermitteln. Ein Beispiel für einen solchen Bericht ist unten dargestellt:

Die Möglichkeit, Anforderungen mit Ergebnissen verschiedener Testarten zu korrelieren, ist ein großer Vorteil der Verwendung einer einheitlichen Testlösung. Unit-Tests, Systemtests, Integrationstestergebnisse sowie Codierungsstandards und Codemetrikergebnisse können korreliert werden, um Feedback über den Zustand kritischer und nicht kritischer Anforderungen zu geben.

Kombinieren Sie Ergebnisse verschiedener Techniken für erweiterte Analysen

Wenn Sie Daten aus den verschiedenen in einem Projekt verwendeten Testtechniken kombinieren, können Sie Metriken der zweiten Ebene und komplexere Analysen erhalten. Der Einsatz einer einheitlichen Testlösung ermöglicht es Teams, Code aus einer völlig neuen Perspektive zu betrachten. Ein fehlgeschlagener Unit-Testfall kann für einen Entwickler eine unterschiedliche Bedeutung haben, je nachdem, ob er in Code auftritt, der laut Code-Metrikanalyse als hohes oder niedriges Risiko eingestuft wird. Wenn diese Informationen weiter mit Statistiken aus der Quellcodeverwaltung kombiniert und mit Anforderungen korreliert werden, können Teams bessere Entscheidungen darüber treffen, wann und wie der Code korrigiert werden sollte.

Mit der Parasoft-Tool-Suite können Sie änderungsbasierte Tests nutzen, um die Teamproduktivität zu verbessern. Die änderungsbasierte Testtechnologie erfasst die Beziehung zwischen Quellcode, Testfällen und Codeabdeckungsergebnissen, um den optimalen Satz von Testfällen für die Verifizierung und Validierung eines bestimmten Codedeltas zu berechnen. Tatsächlich können Teams ihre Testsitzungen einschränken, indem sie anstelle vollständiger Regressionssuiten nur eine kleine Teilmenge von Tests ausführen. Dieser Fokus darauf, nur das zu testen, was unbedingt erforderlich ist, führt zu erheblichen Einsparungen, insbesondere bei mittelgroßen oder großen Projekten.

Alles zusammen: Parasoft C/C++-Test und DTP

Alle oben diskutierten Testtechnologien sind in verfügbar Parasoft C / C ++ test und Parasoft DTP. Parasoft C/C++test ist eine einheitliche Testlösung für C- und C++-Projekte. C/C++test ist als Plugin für gängige IDEs wie Eclipse und Visual Studio verfügbar. Eine enge Integration mit der IDE verhindert die oben diskutierten Probleme.

Entwickler können beim Schreiben von Code sofort Prüfungen zur Einhaltung von Codierungsstandards durchführen oder Komponententests durchführen. Mitglieder des QA-Teams können manuelle Testszenarien durchführen, während die Anwendung auf Codeabdeckung und Laufzeitfehler überwacht wird. In der kontinuierlichen Integrationsphase können Offline-Analysen durchgeführt werden, beispielsweise die durch statische Analyse bereitgestellte Flussanalyse.

Serversitzungen, unterstützt durch eine praktische Befehlszeilenschnittstelle, melden Analyseergebnisse an Parasoft DTP, das Informationen aus der Entwicklungsumgebung aggregiert. Parasoft DTP bietet umfangreiche Berichtsfunktionen, einschließlich der Möglichkeit, Daten aus Tools von Drittanbietern zu integrieren, Testergebnisse an die IDEs der Entwickler zu senden und erweiterte Analysen zu berechnen. Kontinuierliches Feedback in jeder Phase des Arbeitsablaufs beschleunigt die agile Entwicklung und senkt die Kosten für die Einhaltung von Sicherheitsstandards.

Es sollte auch beachtet werden, dass der hier diskutierte Ansatz für Qualitätssicherungsprozesse und -architektur nicht auf C / C ++ - Projekte beschränkt ist. Parasoft bietet ähnliche Lösungen für Javac und C # /. NET.

Zusammenfassung

Die Verbesserung der Softwarequalität ist kein homogenes Unterfangen und erfordert unterschiedliche Technologien, um verschiedene Arten von Softwarefehlern zu beseitigen. Die größte Herausforderung besteht darin, dies auf effektive und effiziente Weise zu tun, ohne verheerende Projektbudgets zu verursachen und die Moral der Entwickler zu untergraben.

Eine einheitliche Testlösung mit tiefer Integration in die IDE des Entwicklers bietet die produktivste Umgebung für Entwicklungstests. Ein einheitliches Tool wie Parasoft C/C++test mit seiner Fähigkeit, Metriken und Ergebnisse aus allen Aspekten des Testens zu vereinheitlichen, bietet einen zusätzlichen Vorteil, indem es Teams ermöglicht, ihre Tests auf risikoreichen und zuletzt geänderten Code zu konzentrieren.

Probieren Sie den Parasoft C / C ++ - Test aus: Eine einheitliche, vollständig integrierte Testlösung für die C / C ++ - Softwareentwicklung.