Sicherheitskritische Systeme Schnellere Software-Verifizierung und -Validierung durch Testautomatisierung

Autor / Redakteur: Ricardo Camacho * / Sebastian Gerstl

Die Sicherstellung des korrekten Betriebs, der Qualität und der Sicherheit in Embedded Software ist ein wichtiger Teil der Software-Aktivitäten. Größtenteils erreichen die Teams dies durch Software-Tests und während der gesamten Entwicklung durch Analyse, Rückverfolgbarkeit, Dokumentation usw. Für sicherheitskritische Software gibt es strenge Ansätze zur Verifizierung und Validierung, die oft in Industriestandards festgeschrieben sind. Es stellt sich die Frage: Was ist der Unterschied?

Firmen zum Thema

Bild 1: Das V-Modell der Software-Entwicklung zeigt die Beziehung zwischen jeder Phase und der in jeder Testphase abgeleiteten Validierung.
Bild 1: Das V-Modell der Software-Entwicklung zeigt die Beziehung zwischen jeder Phase und der in jeder Testphase abgeleiteten Validierung.
(Bild: Parasoft)

Die offiziellen Definitionen von Validierung und Verifizierung stehen im IEEE Standard Glossary of Software Engineering Terminology.

  • Verifizierung: Der Prozess, bei dem festgestellt wird, ob die Produkte einer bestimmten Phase des Software-Entwicklungszyklus die in der vorangegangenen Phase festgelegten Anforderungen erfüllen oder nicht.
  • Validierung: Der Prozess der Evaluierung von Software am Ende des Software-Entwicklungsprozesses, um die Übereinstimmung mit den Software-Anforderungen sicherzustellen.

Prägnantere Definitionen, die den Unterschied zwischen den zwei zentralen Aspekten des Testens auf den Punkt bringen, stehen in Barry Boehms Verifying and Validating Software Requirements and Design Specifications. Verifizierung heißt demnach: „Baue ich das Produkt richtig?“. Validierung dagegen: „Baue ich das richtige Produkt?“.

Das Ziel von Verifizierung und Validierung

Das ultimative Ziel lautet, das richtige Produkt zu bauen. Mehr noch, es geht darum, sicherzustellen, dass das Produkt die Qualität, die Sicherheit und den Schutz bietet, um zu gewährleisten, dass es das richtige Produkt bleibt.

Die Verifizierung stellt als Teil des Software-Entwicklungsprozesses sicher, dass die Arbeit korrekt ist. Dazu umfasst sie in der Regel:

  • Konformität mit Industriestandards als Garantie, dass Prozess und Artefakte den Richtlinien entsprechen.
  • Reviews, Durchläufe, Inspektionen.
  • Statische Analyse und andere Aktivitäten an Artefakten, die während der Entwicklung entstehen.
  • Durchsetzung von Architektur-, Design- und Programmierstandards.

Die Validierung ist der Nachweis, dass das Endprodukt die Anforderungen – sie umfassen Funktionalität, Zuverlässigkeit, Leistung und Sicherheit - erfüllt. Bei physischen Produkten beinhaltet die Validierung, dass die Kunden das Produkt selbst sehen, ausprobieren und testen. Bei Software hingegen besteht sie in der Ausführung der Software und der Demonstration, dass sie funktioniert. Dies beinhaltet typischerweise:

  • Codeausführung zum Nachweis der korrekten Funktionalität.
  • Ausführung in Zielumgebungen.
  • Stress-, Performance-, Penetrations- und andere nicht-funktionale Tests.
  • Direkte und oft ausgeführte Abnahmetests bei Kunden.
  • Nutzung von Artefakten aus Verifikationsprozessen, um die Traceability von Anforderungen auf die Endfunktionalität zu veranschaulichen, insbesondere für bestimmte Sicherheitsfunktionen.

Es ist wichtig, nicht nur die Unterschiede zwischen Verifizierungs- und Validierungszielen zu verstehen sondern auch, dass die Softwareentwicklung beides braucht. Weil diese Aktivitäten einen Großteil des Aufwands bei der Softwareentwicklung ausmachen, sind Unternehmen stets bestrebt, sie zu rationalisieren, ohne die Sicherheit oder die Qualität zu beeinträchtigen.

Herangehensweise an Verifizierung an Validierung

Das V-Modell zeigt den Ansatz für eine formalere Verifizierung und Validierung, der bei der Entwicklung von sicherheitskritischer Software zur Verwendung kommt (Bild 1). Es veranschaulicht die Aktivitäten in jeder Entwicklungsphase und die Beziehungen zwischen ihnen. In jeder Testphase werden vollständigere Teile der Software validiert und mit der Phase verglichen, die sie definiert. Das V-Modell könnte auch eine Wasserfall-Entwicklungsmethode implizieren. Es gibt Möglichkeiten, um Agile, DevOps und CI/CD in diese Art der Produktentwicklung einzubinden.

Bild 2: Darstellung des V-Modells, welche die Verifikationsbeziehung zwischen den einzelnen Entwicklungsstufen zeigt.
Bild 2: Darstellung des V-Modells, welche die Verifikationsbeziehung zwischen den einzelnen Entwicklungsstufen zeigt.
(Bild: Parasoft)

Die Verifizierung hingegen stellt sicher, dass jeder Schritt vollständig und korrekt ausgeführt wird (vgl. Bild 2). Die Verifizierung umfasst Reviews, Durchläufe, Analysen, Nachvollziehbarkeit, Test- und Codeabdeckung und andere Aktivitäten, um sicherzustellen, dass der Prozess und das Produkt korrekt erstellt werden. So ist beispielsweise die Ausführung von Unit-Tests eine Validierungsaktivität und die Sicherstellung der Nachvollziehbarkeit, der Codeabdeckung und des Testfortschritts der Unit-Tests eine Verifizierung. Als Hauptaufgabe stellt letztere sicher, dass die gelieferten Artefakte aus der vorherigen Phase der Spezifikation entsprechen und mit den Unternehmens- und Branchenrichtlinien übereinstimmen.

Namensverwirrung zwischen Verifizierung und Validierung

Unternehmen verwenden Verifizierung und Validierung wahrscheinlich auf leicht unterschiedliche Weise. Es ist üblich, die Validierung als eine Aktivität zu betrachten, die gegen Ende der Software-Entwicklung stattfindet, bei der die Teams das Produkt dem Kunden (oder Testern, die als dessen Vertreter fungieren) präsentieren und die Erfüllung aller Anforderungen nachweisen. In der Embedded-Entwicklung kommt immer noch das Konzept des Factory Acceptance Test (FAT) zum Einsatz.

Ein weiterer bemerkenswerter Unterschied in der Auffassung ist DO-178B/C und verwandte Standards für die Entwicklung von sicherheitskritischer Avionik-Software, die die Validierung als solche nicht kennen. Tatsächlich wird die Validierung als überflüssig angesehen, wenn die Verifizierung vollständig ist.

„Validierung ist der Prozess der Feststellung, dass die Software-Anforderungen korrekt und vollständig sind. DO-178C bietet keine Anleitung für Software-Validierungstests, da man davon ausgeht, dass Software, deren Korrektheit verifiziert wurde, theoretisch keine Validierungsprobleme während der Software-Integrationstests haben sollte, es sei denn, die Software-Anforderungen sind unvollständig oder falsch." - Zertifizierung von sicherheitskritischer Software unter DO-178C und DO-278A, Stephen A. Jacklin, NASA Ames Research Center.

Obwohl ich denke, dass Boehms Definition der gängigeren Verwendung der Begriffe entspricht, gibt es wahrscheinlich Leute, die Unit- und Integrationstests eher als Verifizierungsschritte denn als Validierung betrachten.

Hybride DevOps-Pipelines für sicherheitskritische Software

In vielen Embedded-Software-Unternehmen ist die Implementierung eines vollständig agilen Prozesses nicht mit den Auflagen der Sicherheitsstandards der Branche kompatibel. Artefakte, Code, Testergebnisse und Dokumentation haben oft vorgeschriebene und festgelegte Liefertermine. Der Fortschritt basiert auf diesen Lieferungen (Meilensteinen).

Bild 3: 
Das Agile V-Model von Parasoft.
Bild 3: 
Das Agile V-Model von Parasoft.
(Bild: Parasoft)

In einigen Fällen, z. B. bei großen Militär- und Verteidigungsprojekten, sind Meilenstein-Lieferungen in den Vertrag und die Zahlungsvereinbarungen eingebaut. Obwohl dies einen Wasserfallansatz impliziert, gibt es keinen Grund, die Softwareentwicklung darauf zu beschränken. Teams können hybride Modelle nutzen, um mit iterativen und agilen Methoden intern Meilensteine für Deliverables zu erreichen (siehe Bild 3).

Der Grund, dies in einer Diskussion über Verifizierung und Validierung anzusprechen, ist, dass Teams viele der Vorteile der kontinuierlichen Integration und des Testens auf komplexe sicherheitskritische Anwendungen anwenden können. Ein Teil davon ist, die Verifizierung und Validierung so früh wie möglich in den Entwicklungsprozess vorzuverlegen (‚Shift-Left‘). Zum Beispiel gibt es keinen Grund, Unit-Tests zu verzögern, bis alle Units kodiert sind, oder mit der Überprüfung des Codes mit statischer Analyse zu warten, bis er für die Integration bereit ist.

In ähnlicher Weise sollten Entwickler mit Integrationstests beginnen, sobald die Unit-getesteten Komponenten fertig sind. Die Kombination von Automatisierung mit einem kontinuierlichen, iterativen Ansatz bietet enorme Vorteile für die Software-Validierung und -Verifizierung. Moderne Anbieter wie Parasoft verfügen über Tools, die das Testen, die Qualität und die Sicherheit in allen Phasen des SDLC ansprechen, wie unten dargestellt.

Bild 4: Moderne Tools lassen sich in jede Phase des V-Modells im SDLC einfügen.
Bild 4: Moderne Tools lassen sich in jede Phase des V-Modells im SDLC einfügen.
(Bild: Parasoft)

Das in Bild 4 gezeigte V-Modell stellt den Ansatz für eine formalere Verifizierung und Validierung dar, den die Entwicklung sicherheitskritischer Software verwendet.

Beschleunigen der Verifizierung mittels Automatisierungstools

Die Verifizierung umfasst die Arbeit, die sicherstellt, dass jede Phase der Entwicklung die Spezifikation des vorherigen Schritts erfüllt. Bezogen auf die Software-Codierung und -Tests bedeutet Verifizierung die Sicherstellung, dass der Code das Moduldesign und letztendlich das High-Level-Design und die darüber liegenden Anforderungen erfüllt.

Darüber hinaus gewährleistet die Verifizierung die Erfüllung der Anforderungen auf Projektebene. Zu diesen Anforderungen gehört das Einhalten von Industriestandards, Risikomanagement, Rückverfolgbarkeit und Metriken (Codeabdeckung und Konformität). Mit den Software-Test-Automatisierungstools von Parasoft können Entwickler die Verifizierung beschleunigen, indem sie die vielen mühsamen Aspekte der Aufzeichnung, Dokumentation, Berichterstattung, Analyse und des Reportings automatisieren:

  • Frühestmöglicher Einsatz der statischen Analyse, um Qualität und Sicherheit schon beim Programmieren zu gewährleisten. Zudem schützt die statische Analyse vor zukünftigen Fehlern und Schwachstellen und verringert so die nachgelagerten Auswirkungen von Bugs, die bei Inspektionen und Tests übersehen werden.
  • Das Automatisieren der Konformität mit Programmierstandards, um den manuellen Aufwand zu reduzieren und Code-Inspektionen zu beschleunigen.
  • Rückverfolgbarkeit in beide Richtungen für alle Artefakte, um sicherzustellen, dass der Code und die Tests die Anforderungen erfüllen. Metriken, Testergebnisse und Ergebnisse der statischen Analyse werden zu den Komponenten zurückverfolgt und umgekehrt.
  • Code- und Testabdeckung, um sicherzustellen, dass alle Anforderungen implementiert sind, und die Implementierung wie erforderlich getestet wird.
  • Berichte und Analysen, um die Entscheidungsfindung zu unterstützen und den Fortschritt zu verfolgen. Die Entscheidungsfindung muss auf den von den automatisierten Prozessen gesammelten Daten basieren.
  • Automatisierte Dokumentationserstellung aus Analysen und Testergebnissen, um das Einhalten von Prozessen und Standards zu unterstützen.
  • Automatisierte Konformität mit Standards, um den Aufwand und die Komplexität zu senken, indem die sich am meisten wiederholenden und langwierigen Prozesse automatisiert werden. Außerdem können die Werkzeuge die Projekthistorie verfolgen und die Ergebnisse mit den Anforderungen, Softwarekomponenten, Tests und aufgezeichneten Abweichungen in Beziehung setzen.

Schnellere Validierung durch Testautomatisierung

Validierung ist der Nachweis, dass ein Produkt seine Anforderungen erfüllt, wobei die Ausführung von Code entweder isoliert für Unit-Tests oder in verschiedenen Phasen der Integration erforderlich ist. Für die Entwicklung von embedded Software bedeutet die Automatisierung dieser Testreihen eine enorme Zeitersparnis.

Die Validierung verlangt die Ausführung auf der Zielhardware. Die Optimierung von Regressionstests schöpft die verfügbaren Ressourcen, Mitarbeiter und Hardware bestmöglich aus. Hier profitieren Entwickler von Parasofts Testautomatisierungs-Tools, weil diese die Abhängigkeit von manuellen Tests reduzieren - unter Beibehaltung der Nachvollziehbarkeit und Code-Abdeckung aller Ergebnisse:

  • Die Automatisierung aller Testsuiten minimiert das manuelle Testen und reduziert den Testengpass durch begrenzte Hardwareverfügbarkeit.
  • Die Target- und Host-basierte Testausführung unterstützt je nach Bedarf verschiedene Validierungstechniken.
  • Shift-left- (Vorverlegte) Tests beginnen, sobald Teams Code entwickeln. Hierbei kommen Unit-Testing-Frameworks zum Einsatz und sobald der Code fertig ist, werden automatisch Softwaresätze zum Testen generiert. Unterstützung für testgetriebene Entwicklung und kontinuierliches Testen ist mit dem Reifegrad des Prozesses im Unternehmen verfügbar.
  • Verwalten von Änderungen mit der intelligenten Testausführung, um sich nur auf die Tests für den geänderten Code und die betroffenen Abhängigkeiten zu konzentrieren.
  • Rückverfolgbarkeit in beide Richtungen zwischen Code, Tests, Ergebnissen der statischen Analyse und Anforderungen sowie Unterstützung für unternehmensweite Application Lifecycle Management (ALM)-Tools.

Software-Validierung stellt sicher, dass Teams die richtige Software entwickeln, um die Anforderungen der Kunden und des Marktes zu erfüllen. Sie ist der Beweis, dass die Anforderungen erfüllt werden, und dass das Produkt zuverlässig, sicher und zum Schutz der Kunden ausgelegt ist.

Diesen Beitrag lesen Sie auch in der Fachzeitschrift ELEKTRONIKPRAXIS Ausgabe 4/2021 (Download PDF)

Die Software-Verifizierung gewährleistet, dass die Teams das Produkt in Übereinstimmung mit den eigenen Prozessen und Standards des Unternehmens und den Anforderungen des Marktes entwickeln. Mit anderen Worten: Die Validierung beweist, dass das Produkt funktioniert, während die Verifizierung sicherstellt, dass alle wichtigen Punkte erfüllt werden.

Weil Validierung und Verifizierung einen großen Teil der Ressourcen in der Embedded-Produktentwicklung verschlingen, haben sich moderne Toolanbieter Lösungen überlegt. So können Entwicklungsteams mit der Software-Testautomatisierungssuite von Parasoft ein das Testen in die frühen Phasen der Entwicklung vorverlegen. Zugleich stellt es es die Traceability, die Aufzeichnung der Testergebnisse, die Details zur Codeabdeckung, die Berichterstellung und die Compliance-Dokumentation sicher.

* Ricardo Camacho ist Senior Technical Marketing Manager bei Parasoft in Carlsbad, Kalifornien.

(ID:47087075)