Holen Sie sich die UMFANGREICHSTE Abdeckung für die Einhaltung von MISRA C! Erfahren Sie mehr >>

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

Von Miroslaw Zielinski

17. Mai 2018

8  min lesen

Ein einheitliches Testtool mit umfassender Integration in die IDE des Entwicklers bietet die produktivste Umgebung für Entwicklungstests. Ein einheitliches Tool wie der Parasoft C / C ++ - Test ermöglicht es Teams, ihre Tests auf risikoreichen und zuletzt geänderten Code zu konzentrieren.

Die Überprüfung und Validierung von Software ist ein wesentlicher Bestandteil der Softwareentwicklung. Der Aufwand und das Budget für bestimmte V & V-Projekte hängen von vielen Faktoren ab, wie z. B. den Zielen der funktionalen Sicherheit eines Projekts, dem Grad des Geschäftsrisikos oder der Qualitätskultur einer Organisation. Unabhängig davon, was ein Unternehmen zur Umsetzung von Qualitätsinitiativen und -prozessen antreibt, ist es mehr als entschlossen, 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 Komponententests und Flussanalyse kombiniert werden können, um Qualitätssicherungsprozesse zu verbessern, und die Vorteile der Implementierung eines einheitlichen Testtools ermittelt. Die hier diskutierten Konzepte sind allgemein gehalten und können auf jede Programmiersprache angewendet werden. In den Beispielen werden jedoch C- und C ++ - Programmiersprachen berücksichtigt, 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 können viele Dinge sein. Nehmen Sie zum Beispiel eine falsch implementierte Anforderung - Komponententests zur Überprüfung des korrekten Implementierungsfehlers und Testautomatisierungstools erkennen und melden den Fehler. In einem anderen Beispiel kann ein Laufzeitanalysetool während eines Komponententests einen kritischen Speicherzugriffsfehler erkennen, der allein anhand der Komponententestergebnisse nicht erkennbar ist. Verschiedene Tools sind besser geeignet, um bestimmte Fehlerklassen zu 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 eines einheitlichen Testwerkzeugs

Es ist wichtig anzugeben, was von einem einheitlichen Testwerkzeug erwartet wird, bevor dessen Wert erörtert wird. Idealerweise sollte ein Werkzeug:

  • 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

Ein einheitliches und integriertes Testtool 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, sodass nicht erwartet werden kann, dass alle durch eine Testtechnik identifiziert werden. Zum Beispiel manuelle Tests auf Systemebene. Beachten Sie das folgende Beispielcode-Snippet, um ein konkreteres Beispiel bereitzustellen:

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 es innerhalb des zulässigen Bereichs liegt. Selbst wenn Dutzende manueller Testsitzungen ausgeführt werden, wird dieses Problem möglicherweise nicht angezeigt, da das Schreiben eines ganzzahligen Werts in einen zufälligen Speicherort selten sofort einen spektakulären Effekt erzeugt.

Aber eines Tages, höchstwahrscheinlich nach der Veröffentlichung, kann sich das Speicherlayout ändern, und der Vorgang ab Zeile 16 stürzt die Anwendung ab. Interessanterweise kann die statische Analyse dieses Problem aufgrund der zur Berechnung des Index verwendeten Schleife auch nicht kennzeichnen. Aus Leistungsgründen müssen Daten- und Kontrollflussanalysen, die in statischen Analysewerkzeugen verwendet werden, Heuristiken und Vereinfachungen anwenden, um die Codeanalyse innerhalb einer angemessenen Zeit abzuschließen. 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 - eine 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 die 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. Eine solche Bedingung ist während Systemtestsitzungen unwahrscheinlich, da die Datenbankverbindung höchstwahrscheinlich wie erwartet funktioniert und die Tools zur Überwachung des Laufzeitspeichers daher stumm bleiben. Die Flussanalyse innerhalb des statischen Analysetools erkennt jedoch leicht den Nullzeiger, der von dieser Funktion zurückgegeben werden soll, und meldet ein potenzielles Nullzeiger-Dereferenzierungsproblem.

Abbildung 4. Beispiel für statische Analyseergebnisse.

Erkennen von Funktionsproblemen und Regressionen

Was ist mit Code, der immer fehlerfrei ausgeführt wird, aber nicht den Anforderungen entspricht? Statische und dynamische Analysen sind nicht hilfreich, um diese Art von Problemen zu identifizieren. Das Erkennen von Abweichungen zwischen dem erwarteten Ergebnis und dem tatsächlichen Ergebnis erfordert den Vergleich der Berechnungsergebnisse mit vordefinierten Werten. Es gibt viele beliebte Möglichkeiten, solche Überprüfungen durchzuführen, einschließlich manueller Tests auf Systemebene, Integrationstests und Komponententests.

Es gibt viele Bereiche, in denen ein einheitliches Testwerkzeug den Unit-Testprozess erleichtern kann. Die Liste der Vorteile umfasst:

  • Steigern Sie die Entwicklerproduktivität beim Erstellen von Testfällen, indem Sie beispielsweise grafische Assistenten zum Erstellen, Bearbeiten und Konfigurieren von Testfällen bereitstellen
  • Integration mit Testdoppel Frameworks, die ein einfaches Verspotten und Stubben ermöglichen, um komplexe Testszenarien zu simulieren, ohne große Codebasen zu benötigen
  • Korrelieren von Testfällen mit Berichten zur Codeabdeckung, um die Vollständigkeit der Tests zu bewerten
  • Optimieren von Testsitzungen durch automatisches Berechnen der minimalen Anzahl von Testfällen, die zum Überprüfen des Codedeltas erforderlich sind
  • Zusammenführen von Berichten zur Codeabdeckung aus anderen Testtechniken, z. B. manuellen Tests / Tests auf Systemebene oder Integrationstests, um nicht getesteten Code zu identifizieren
  • Rückverfolgung der Ergebnisse auf Anforderungen zum besseren Verständnis der Auswirkungen fehlgeschlagener Tests

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 eines einheitlichen Testtools ist das Feedback zur Vollständigkeit der Tests und zum Gesundheitszustand kritischer Geschäftsanforderungen. Niedrige 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

Berichte über Unit-Tests und Systemtests sind eine hervorragende Informationsquelle über den Testprozess, insbesondere wenn sie kombiniert werden. Wenn die Testergebnisse jedoch nicht mit den Anforderungen korrelieren, fehlen den Teams mehrere wichtige Informationen. Durch Anzeigen eines Berichts zur Rückverfolgbarkeit von Tests zu Anforderungen können Sie schnell den Status der Anforderungsabdeckung ermitteln. Ein Beispiel für einen solchen Bericht ist unten dargestellt:

Die Möglichkeit, Anforderungen mit Ergebnissen aus verschiedenen Testarten zu korrelieren, ist ein großer Vorteil der Verwendung eines einheitlichen Testwerkzeugs. Unit-Tests, Systemtests, Ergebnisse von Integrationstests sowie Codierungsstandards und Ergebnisse von Codemetriken können korreliert werden, um Feedback zum Zustand kritischer und nicht kritischer Anforderungen zu geben.

Kombinieren von Ergebnissen aus verschiedenen Techniken für erweiterte Analysen

Wenn Sie Daten aus den verschiedenen in einem Projekt verwendeten Testtechniken kombinieren, erhalten Sie Metriken der zweiten Ebene und komplexere Analysen. Die Verwendung eines einheitlichen Testtools ermöglicht es Teams, Code aus einer völlig neuen Perspektive zu betrachten. Ein fehlgeschlagener Komponententestfall kann für einen Entwickler eine andere Bedeutung haben, je nachdem, ob er in Code auftritt, der durch die Analyse von Codemetriken als risikoreich oder als risikoarm eingestuft wurde. Wenn diese Informationen weiter mit Statistiken aus der Quellcodeverwaltung kombiniert und mit den Anforderungen korreliert werden, können Teams bessere Entscheidungen darüber treffen, wann und wie der Code korrigiert werden soll.

Mit der Parasoft-Tool-Suite können Sie Change-Based Testing nutzen, um die Teamproduktivität zu verbessern. Die Change-Based Testing-Technologie erfasst die Beziehung zwischen Quellcode, Testfällen und Ergebnissen der Codeabdeckung, um den optimalen Satz von Testfällen für die Überprüfung und Validierung eines bestimmten Codedeltas zu berechnen. Tatsächlich können Teams ihre Testsitzungen einschränken, indem sie nur eine kleine Teilmenge von Tests anstelle vollständiger Regressionssuiten 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 ein einheitliches Testwerkzeug für C- und C ++ - Projekte. Der C / C ++ - Test ist als Plugin für gängige IDEs wie Eclipse und Visual Studio verfügbar. Eine enge Integration in die IDE verhindert die oben diskutierten Probleme. Entwickler können zum Zeitpunkt des Codeschreibens sofort Konformitätsprüfungen für Codierungsstandards durchführen oder Komponententests durchführen. QA-Teammitglieder können manuelle Testszenarien durchführen, während die Anwendung auf Codeabdeckung und Laufzeitfehler überwacht wird. Offline-Analysen, wie z. B. Durchflussanalysen durch statische Analysen, können in der kontinuierlichen Integrationsphase durchgeführt werden. Serversitzungen, die mit einer praktischen Befehlszeilenschnittstelle unterstützt werden, melden Analyseergebnisse an Parasoft DTP, das Informationen aus der Entwicklungsumgebung zusammenfasst. Parasoft DTP bietet umfangreiche Berichtsfunktionen, einschließlich der Möglichkeit, Daten von Tools von Drittanbietern zu integrieren, Testergebnisse an die IDEs der Entwickler zu senden und erweiterte Analysen zu berechnen. Kontinuierliches Feedback in jeder Phase des Workflows beschleunigt die agile Entwicklung und senkt die Kosten für die Einhaltung der 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 Java und  C # /. NET.

Fazit

Die Verbesserung der Softwarequalität ist kein homogenes Unterfangen und erfordert unterschiedliche Technologien, um verschiedene Arten von Softwarefehlern zu beseitigen. Die zentrale Herausforderung besteht darin, dies auf effektive und effiziente Weise zu tun, um ein verheerendes Projektbudget zu vermeiden und die Moral der Entwickler zu untergraben. Ein einheitliches Testtool mit umfassender Integration in die IDE des Entwicklers bietet die produktivste Umgebung für Entwicklungstests. Ein einheitliches Tool wie der Parasoft C / C ++ - Test mit seiner Fähigkeit, Metriken und Ergebnisse aus allen Aspekten des Testens zu vereinheitlichen, bietet zusätzliche Vorteile, da Teams ihre Tests auf risikoreichen und zuletzt geänderten Code konzentrieren können.

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

Von Miroslaw Zielinski

Zu den Spezialitäten von Miroslaw, dem Produktmanager für die eingebetteten Testlösungen von Parasoft, gehören C / C ++, RTOS, statische Code-Analyse, Komponententests, Verwaltung der Softwarequalität für sicherheitskritische Anwendungen und Einhaltung der Sicherheitsstandards durch die Software.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.