Einsatz des Unit Test Framework Toolkits für die Softwareüberprüfung und -validierung

Überblick

Das Auffinden und Beseitigen von Bugs während der Softwareentwicklung ist oftmals nicht nur schwierig, sondern auch zeit- und kostenintensiv. Daher ist es nicht verwunderlich, dass sich die Softwarevalidierung noch viel anspruchsvoller und arbeitsintensiver gestaltet. Da Software in Endnutzeranwendungen immer komplexer und anspruchsvoller wird, besteht eine steigende Nachfrage nach einem festgelegten und automatisierten Verfahren für die Codeüberprüfung und -validierung. Insbesondere Software, die für die Überprüfung kritischer bzw. komplexer Produkte eingesetzt wird, erfordert eine präzise Untersuchung und somit effiziente Prüf- und Validierungswerkzeuge.

Inhalt

Prüf- und Validierungsverfahren, die auf Anforderungen (Requirements) basieren, sind ein anerkannter Teil der Softwareentwicklung und gehören zur Standardpraxis. Der Nachweis, dass die Software "funktioniert" beinhaltet mehr, als nur zu zeigen, dass das Programm ablauffähig ist. Es erfordert eine Validierung, die dokumentiert, dass die Software so abläuft wie vorgesehen. Dieser Nachweis ist nicht nur für Endkunden wichtig, sondern auch für Qualitätssicherungsteams oder Regulierungsbehörden.

Preis- und Bestellinformationen zum LabVIEW Unit Test Framework Toolkit

Softwareprüfwerkzeuge für LabVIEW

Entwicklern, die mit LabVIEW arbeiten, stehen nicht nur eine Reihe an Werkzeugen in LabVIEW zur Verfügung, sondern auch weitere Softwarewerkzeuge für anspruchsvolle Prüfanwendungen und Codeanalysen. In diesem Dokument wird das für LabVIEW konzipierte Werkzeug Unit Test Framework Toolkit näher vorgestellt, mit dem Teilfunktionsprüfungen, Validierungen und Regressionstests von VIs automatisiert werden können.

Weitere Informationen zu anderen Softwareentwicklungswerkzeugen für LabVIEW entnehmen Sie bitte der Seite ni.com/softwareengineering/d.

Einführung in die Komponentenprüfung

Die Komponentenprüfung ist ein einfacher Ansatz, der jedoch auch für anspruchsvolle Prüfreihen zum Zwecke der Codevalidierung und für Regressionstests eingesetzt werden kann. Bei der Komponentenprüfung wird ein Codefragment ausgeführt, welches das sichtbare Verhalten einer Komponente (z. B. einer Klasse) verifiziert und dem Programmierer eine unmittelbare Rückmeldung darüber gibt, ob die Komponente das geforderte Verhalten aufweist oder nicht. Ein Großteil der Entwickler führt regelmäßig eine manuelle Komponentenprüfung an Codesegmenten durch, um das Verhalten zu verifizieren. Verhält sich der Code nicht wie vorgesehen, nimmt der Entwickler Änderungen vor und wiederholt den Prüfprozess bis das erwünschte Verhalten eintritt.

Das Problem der manuellen Überprüfung liegt jedoch darin, dass eine große Anzahl an Werten bzw. verschiedene Eingangskombinationen einfach übersehen werden können. Des Weiteren bietet die manuelle Überprüfung keinerlei Einblick, Des Weiteren bietet die manuelle Überprüfung keinerlei Einblick, ob alle Codeteile einer Komponente während der Prüfphase tatsächlich ausgeführt wurden. Darüber hinaus bietet es keinerlei Dokumentation, die nachweist, dass die Software korrekt ausgeführt wird. Der anfallende Kosten- und Zeitaufwand wird noch dadurch erhöht, dass in der Praxis eine einzige Prüfrunde selten ausreichend ist. Jegliche Änderungen am Programmcode im weiteren Entwicklungsprozess erfordern häufig erneute Überprüfungen, um sicherzugehen, dass die Software korrekt abläuft.

Für umfangreiche Projekte werden deshalb anstelle von manuellen Verfahren Werkzeuge wie das Unit Test Framework Toolkit für die Automatisierung und Verbesserung der Komponentenprüfung eingesetzt. Durch die Automatisierung wird nicht nur das Risiko des Auftretens unentdeckter Fehler reduziert. Es werden zudem Kosten gespart, da Probleme frühzeitig erkannt werden können. Entwickler sparen wertvolle Zeit, da sie sich voll auf die Softwareentwicklung konzentrieren können, ohne zeitintensive manuelle Tests durchführen zu müssen.

Erstellung einer Prüfanwendung für ein LabVIEW-VI

Um mithilfe des Unit Test Framework Toolkit eine Prüfanwendung in LabVIEW zu erstellen, klicken Sie im LabVIEW-Projekt-Explorer mit der rechten Maustaste auf das zu prüfende VI und wählen den Menüpunkt "Unit Tests" aus. Wählen Sie anschließend "New Test", um eine neue Datei mit der Erweiterung .lvtest zu erstellen (Abb. 1).

Abbildung 1: Automatische Erstellung einer Prüfanwendung für ein VI im Projekt-Explorer

Die Datei wird standardmäßig an derselben Stelle gespeichert wie das zu prüfende VI. Sie können die .lvtest-Dateien jedoch auch automatisch an einem Ort speichern, den Sie in den Eigenschaften des Unit Test Framework Toolkits festlegen (das Dialogfeld "Properties" ist über einen Klick mit der rechten Maustaste auf die .lvproj-Datei im Projekt-Explorer abrufbar).

Festlegung der Prüfvektoren

Der nächste Schritt bei der Erstellung einer Prüfanwendung ist die Festlegung eines Prüfvektors bzw. eines Prüffalls. VIs verfügen genau wie Funktionsaufrufe in einer textbasierten Programmiersprache über Ein- und Ausgänge. Wird in LabVIEW eine Komponentenprüfung durchgeführt, wird das VI mit einer festgelegten Anzahl an Eingängen verbunden. Die Eingänge werden wiederum mit einer festgesetzten Anzahl an erwarteten Ausgängen verbunden, um einen Prüfvektor zu definieren. Nach Ablauf des VIs werden die Ausgänge mit dem erwarteten Verhalten verglichen und ein Bericht erstellt (Abb. 2). Das Toolkit ermöglicht hierbei die Erstellung dieser Prüffälle, ohne dass Codemodifizierungen notwendig sind.

Abbildung 2: Prüfvektoren (auch Prüffälle) bezeichnen die Verbindung von Eingängen einer Codeeinheit mit erwarteten Ausgängen. Bei der Komponentenprüfung werden die erwarteten Ergebnisse mit den tatsächlichen Resultaten verglichen und Berichte erstellt.

Prüffälle können mithilfe des Toolkits auf verschiedene Art und Weise festgelegt werden. Am gängigsten ist hierbei die Festlegung über das Dialogfeld in LabVIEW, welches sich über einen Doppelklick auf die .lvtest-Datei im Projekt-Explorer öffnet. Wählen Sie im Dialogfeld aus der Kategorienliste "Test Cases" aus, um die Eingänge und erwarteten Ausgänge zu spezifizieren. Sie können standardmäßig Eingangswerte für alle Bedienelemente am Anschlussfeld sowie die erwarteten Ausgangswerte für alle Anzeigeelemente am Anschlussfeld festlegen (Abb. 3).

Abbildung 3: Prüffälle lassen sich im Unit Test Framework über einen Doppelklick auf die Prüfanwendung im Projekt-Explorer erstellen.

Der am Ausgang durchgeführte Vergleich mit dem erwarteten Ergebnis gilt jeweils für den spezifischen Datentyp.

Sollte Ihr VI über weitere Eingänge verfügen, die nicht mit dem Anschlussfeld verbunden sind oder Sie möchten bestimmte Eingänge als Ausgänge evaluieren, können Sie dies in den Konfigurationsoptionen festlegen (Abb. 4). Es ist zudem möglich, Ausgänge von der Vergleichsprüfung auszuschließen, indem Sie die Markierung neben dem entsprechenden Ausgang deaktivieren.

Abbildung 4: Es werden standardmäßig nur Bedien- und Anzeigeelemente am Anschlussfeld berücksichtigt. Es ist jedoch möglich, über die erweiterten Konfigurationseinstellungen alle Bedien- und Anzeigeelemente einzuschließen.

Wie bei jeder Programmiersprache lassen unbegrenzte Eingabemöglichkeiten (Double-Datentyp) eine unendliche Anzahl an Eingangswerten zu. Aufgrund dessen werden in der Regel mehrere Eingangswerte ausgewählt, die einen bestimmten Eingangswertebereich repräsentieren, da in diesen Fällen eine 100%ige Prüfung nicht möglich ist.

Eine .lvtest-Datei kann mehrere Prüffälle enthalten. So möchten Sie z. B. eine Prüfanwendung erstellen, bei der die VI-Ausführung überprüft wird, nachdem eine inkorrekte Eingabe empfangen wurde. Allerdings ist es wahrscheinlich, dass auch andere inkorrekte Eingaben überprüft werden müssen. Dies kann mit derselben Prüfanwendung durchgeführt werden, allerdings sind hierfür mehrere Prüffälle notwendig. Um einer Prüfanwendung weitere Prüffälle hinzuzufügen, klicken Sie in der Kategorie "Test Cases" auf "New" (Abb. 5).

 

Abbildung 5: Eine Prüfanwendung kann mehrere Prüffälle enthalten.

 

Eine weitere Möglichkeit zur Festlegung von Prüffällen besteht in der Verwendung eines externen Editors, u. a. Microsoft Excel, welcher die programmatische Erstellung der Prüfanwendung vereinfacht. Somit können auch Anwender, die keinen Zugriff auf die Entwicklungsumgebung haben, Prüffälle festlegen.

Erweiterte Optionen für die Prüfkonfiguration

Für VIs mit Zustands- oder programmatischer Konfiguration ist möglicherweise der Einsatz von Setup- und Teardown-VIs notwendig, um die Prüfanwendung durchzuführen. Der Ausgang des Setup-VIs wird dabei an das zu prüfende VI angeschlossen. Dies ist besonders nützlich, wenn Sie einen komplexen Eingang, u. a. für große Signalverläufe, programmatisch erzeugen bzw. einen Filter oder eine Datenbank für die Überprüfung einrichten müssen (Abb. 6). Die VIs können zudem dafür eingesetzt werden, eine Objektreferenz oder -datei an das zu prüfende VI zu übertragen.

 

Abbildung 6: Setup- und Teardown-VIs lassen sich zur programmatischen Erzeugung von Eingängen oder zur Erstellung von Prüfbedingungen für anspruchsvollere Prüffälle einsetzen.

Zusätzlich können Filter definiert werden, damit nur Prüfungen durchgeführt werden, die einer bestimmten Priorität unterliegen oder die seit einem gewissen Datum nicht mehr ausgeführt wurden.

 

Festlegung der Prüfanforderungen

Vor der Durchführung einer Prüfanwendung ist es wichtig, zu verstehen und festzulegen, wie der Programmcode ablaufen soll.

Um zu verhindern, dass der Entwickler seine eigenen Maßstäbe und Kriterien festlegt, ist es notwendig, die Anforderungen an das Codeverhalten sorgfältig und präzise zu definieren. Bei der Softwareentwicklung liegt der erste Schritt in der Sammlung von Anforderungen und Festlegung von Spezifikationen für das Codeverhalten. Dieser Prozess stellt sicher, dass effiziente Prüfungen durchgeführt werden und der Programmcode das erwünschte Verhalten zeigt.


Abbildung 7: Beispiel für die komplexen Beziehungen zwischen Anforderungsdokumenten, Implementierungen, Prüfanwendungen und Berichten.

Die Festlegung von Anforderungen geschieht in der Regel nach wiederholten Prototypisierungsrunden und Machbarkeitsstudien, die dem Kunden vorgelegt werden, um zu zeigen, wie das Endprodukt aussehen soll. Es besteht ein wichtiger Unterschied zwischen der Festlegung des Anwendungsverhaltens anhand von Anforderungen und der eigentlichen Entwicklung einer professionellen, qualitativ hochwertigen sowie zuverlässigen Software.

Risikoreiche und ablaufkritische Projekte beginnen in der Regel mit der Festlegung von Anforderungen, die spezifizieren, wie einzelne Codesegmente implementiert werden und welches Verhalten ihr jeweiliger Ausgang unter normalen sowie fehlerhaften Umständen zeigen soll. Anhand dieser Definitionen werden dann die Kriterien für die Prüfanwendung festgelegt.

Einhaltung von Anforderungen

Ein wichtiger Teil der Softwarevalidierung ist der Nachweis, wo und wie Anforderungen in der Software eingehalten wurden. Oft ist hierfür die Erzeugung einer Nachverfolgungsmatrix erforderlich, welche das Codesegment anzeigt, in dem die Anforderung eingehalten wurde. Je nachdem, wie präzise die Dokumentation sein soll, muss auch nachgewiesen werden, an welcher Stelle Softwareüberprüfungen implementiert wurden. Hierfür ermöglicht das Unit Test Framework Toolkit die Eingabe mehrerer Anforderungs-IDs in die Kategorie "Configuration" (Abb. 7).

 

Abbildung 8: Das Unit Test Framework Toolkit kann zusammen mit der Software Requirements Gateway zur Nachverfolgung von Anforderungen eingesetzt werden.

Die Anforderungs-IDs können mithilfe des Programms zur Anforderungsverwaltung NI Requirements Gateway analysiert werden, um die Verwaltung von Prüfanforderungen und die Nachverfolgung der Einhaltung zu automatisieren. 

Erfahren Sie in einem Tutorium, wie Sie das NI Requirements Gateway mit dem Unit Test Framwork Toolkit zusammen einsetzen.

Die Anforderungen, die festlegen, wie Code implementiert wird und wie Prüfungen durchgeführt werden, sind in der Regel vor der Entwicklung abgeschlossen und "gesperrt". Dies gilt besonders für Entwicklungen, bei denen ein prüfbasiertes Prozessmodell zum Einsatz kommt. In der Praxis ist es jedoch häufig so, dass Anforderungen aufgrund unvorhergesehener Änderungen oder zusätzlicher Funktionen modifiziert werden müssen. Um herauszufinden, welche Codesegmente von Änderungen betroffen sind und demzufolge erneut validiert und überprüft werden müssen, sind Werkzeuge zur Anforderungs- und Konfigurationsverwaltung notwendig. 

Weitere Informationen zur Softwarekonfigurationsverwaltung für LabVIEW und Quellcodeverwaltung.

Durchführung der Prüfanwendung

Prüfanwendungen, die mit dem LabVIEW Unit Test Framework Toolkit erstellt wurden, können auf vielfältige Weise ausgeführt werden, u. a. als:

  • Einzelprüfungen: Klicken Sie im Projekt-Explorer mit der rechten Maustaste auf die Prüfanwendung und wählen Sie "Run".
  • VI-Überprüfung: Klicken Sie mit der rechten Maustaste auf das zu prüfende VI und wählen Sie "Unit Tests" und anschließend "Run".
  • Prüfungen in einem Ordner: Klicken Sie mit der rechten Maustaste auf den Ordner und wählen Sie "Unit Test" und anschließend "Run".
  • Prüfungen im Projekt-Explorer: Klicken Sie in der Werkzeugleiste des Projekt-Explorers auf "Run Unit Tests".
  • Programmatische Prüfungen: Verwenden Sie hierfür die VIs der Unit Test Framework Palette (Abb. 9).

Abbildung 9: Das Unit Test Framework Toolkit installiert eine VI-Palette zur Automatisierung der Prüfanwendungsausführung und Berichterstellung.

Ob die Anforderungen eingehalten wurden oder nicht, lässt sich über grüne (Anforderungen erfüllt) bzw. rote (Anforderungen nicht erfüllt) Punkte erkennen. Die Ergebnisse werden in einem Dialogfenster angezeigt, während gleichzeitig ein Bericht erstellt wird (vorausgesetzt, diese Einstellung ist aktiviert).

Testabdeckung: Sicherstellung, dass der gesamte Code überprüft wurde

Die Testabdeckung ist eine Metrik zur Feststellung, wieviel Code während des Prüfvorgangs überprüft bzw. ausgeführt wurde. Abhängig von der Komplexität und der Kritikalität der Software ist es in manchen Fällen unerlässlich, den gesamten Code zu überprüfen, um das Risiko für unerwünschte Verhaltensweisen so gering wie möglich zu halten.

Das LabVIEW Unit Test Framework Toolkit verfolgt die Testabdeckung für jeden einzelnen Prüfvektor. Es gibt alle durchgeführten Überprüfungen in Prozentzahlen an und kann somit feststellen, wieviele Codesegmente nicht abgedeckt wurden. Das Ergebnisfenster des Toolkits listet auf, wieviel Prozent des Codes überprüft wurden und dokumentiert, welcher Code nicht berücksichtigt wurde. Mit einem Klick auf einen Eintrag in der Liste wird der genaue Ort des Codesegments angezeigt (Abb. 10).

 Abbildung 10: Nachverfolgung und Identifizierung von Code, der während der Überprüfung nicht ausgeführt wurde.

Berichterstellung

Um nachzuweisen, dass Programmcode wie vorgesehen abläuft, ist eine Dokumentation erforderlich, die belegt, dass die Software alle festgelegten Kriterien erfüllt (Abb. 11). Das LabVIEW Unit Test Framework Toolkit ermöglicht die Erstellung von Dokumentation in den Formaten XML (ATML), HTML und ASCII. Sie haben die Möglichkeit festzulegen, welche Informationen in den Berichten enthalten sind, u. a. Angaben zur Prüfzeit und -dauer, den Prüfvektoreingängen, Ergebnissen und Informationen zur Testabdeckung.

 

Abbildung 11: Berichte werden vom Unit Test Framework Toolkit automatisch erstellt und enthalten detaillierte Angaben zur Überprüfung.

Fazit

Die Überprüfung von Software und anschließende Fehlerbehebung waren schon immer wichtige Bereiche in der Softwareentwicklung. Automatisierungsprogramme wie das LabVIEW Unit Test Framework Toolkit unterstützen Sie nun mit den notwendigen Werkzeugen bei der Überprüfung und Berichterstellung. Die Automatisierung dieser Prozesse sorgt nicht nur für eine wesentliche Zeitersparnis, sondern ermöglicht auch umfassendere Prüfvorgänge. Dies stellt nicht nur eine hohe Qualität der entwickelten Software sicher, sondern spart Herstellern Geld, da Probleme früher erkannt werden und Entwickler weniger Zeit mit der Überprüfung von Code verbringen müssen.