Optimieren Sie das Testen eingebetteter Software mit einem CI / CD-Workflow
Von Ricardo Camacho
6. Mai 2021
7 min lesen
Das Testen eingebetteter Software wird immer beliebter. Was macht das Testen eingebetteter Software wichtig? Wie automatisieren Sie das Testen eingebetteter Software, um die Herausforderungen zu bewältigen, die dem Testen eingebetteter Software innewohnen? Erhalten Sie unten Antworten auf diese Fragen.
Zum Abschnitt springen
Implementieren eines Continuous Integration und Continuous Delivery (CI/CD) Workflow für die Entwicklung eingebetteter Software wird immer beliebter. Projekte für eingebettete Software sind oft auf eine Art und Weise eingeschränkt, wie dies bei der Anwendungsentwicklung nicht der Fall ist. Neben den physikalischen und rechnerischen Beschränkungen der Zielhardwareplattform gibt es Beschränkungen auf dem Markt.
Der eingebettete Markt hat tendenziell einzigartige Anforderungen an Sicherheit und Datenschutz sowie extrem lange Lebenszyklen. Die Produkte können jahrzehntelang auf dem Markt bleiben.
Die Herausforderungen beim Testen eingebetteter Software
Die Automatisierung von Tests für eingebettete Software ist aufgrund der Notwendigkeit und Komplexität der Initiierung und Beobachtung von Tests für eingebettete Ziele eine Herausforderung. Außerdem haben Softwareteams normalerweise nur eingeschränkten Zugriff auf die Zielhardware.
Die Automatisierung von Softwaretests ist wichtig, damit eingebettete Tests vom Host-Entwicklungssystem bis zum Zielsystem kontinuierlich funktionieren. Das Testen eingebetteter Software ist besonders zeitaufwändig. Die Automatisierung der Regressionstestsuite bietet erhebliche Zeit- und Kosteneinsparungen.
Grundlagen zum Testen eingebetteter Software
Testergebnisse und die Erfassung von Codeabdeckungsdaten aus dem Zielsystem sind für die Validierung und die Einhaltung von Standards nach Bedarf von entscheidender Bedeutung. Die Datenerfassung ist für die Testausführung von entscheidender Bedeutung. Dies kann erreicht werden, indem die Rückverfolgbarkeit zwischen Testfällen, Testergebnissen, Quellcode und Anforderungen aufgezeichnet und aufrechterhalten wird.
Integrierte Testlösungen wie der Parasoft C / C ++ - Test bieten ein Testkabel, das so optimiert ist, dass es nur minimalen zusätzlichen Aufwand für den binären Footprint erfordert, und stellen es in Form von Quellcode bereit, wo es angepasst werden kann, wenn plattformspezifische Änderungen erforderlich sind.
Automatisieren Sie das Testen eingebetteter Software
Es gibt Lösungen, die dedizierte Integrationen mit eingebetteten IDEs und Debuggern ermöglichen, um die Ausführung von Testfällen reibungslos und automatisiert zu gestalten. Die Testlösung von Parasoft für die Entwicklung von c / c ++ - Software unterstützt die Erstellung von Regressionstest-Baselines als organisierte Sammlung von Tests und überprüft automatisch alle Ergebnisse. Diese Tests werden regelmäßig automatisch ausgeführt, um zu überprüfen, ob Codeänderungen die in den Regressionstests erfassten Funktionen ändern oder beeinträchtigen.
Wenn Änderungen vorgenommen werden, können diese Testfälle das Team nicht auf das Problem aufmerksam machen. Bei nachfolgenden Tests Parasoft C ++ Test meldet Aufgaben, wenn Änderungen am Verhalten festgestellt werden, die im ersten Test erfasst wurden.
Die Parität der Funktionen der Remote-Zielausführung mit hostbasierten Tests bedeutet, dass eingebettete Softwareteams die gleichen Vorteile der Automatisierung nutzen können wie jede andere Art der Anwendungsentwicklung.
Automatisierung ist wichtig, muss aber mehr tun, als den Status Quo beizubehalten. Um die Sicherheit und Qualität der Software zu verbessern, sind weitere Tests innerhalb der CI / CD-Pipeline erforderlich, ohne den Fortschritt weiter zu verlangsamen.
Verbessern Sie die Testautomatisierung, um CI / CD für eingebettete Software zu optimieren
Das größte Problem, dem sich Teams gegenübersehen, besteht darin, die Testeffizienz zu verbessern und gleichzeitig die Anforderungen an Sicherheit und Qualität zu erfüllen, ohne die Zeitpläne und Kosten zu beeinträchtigen. Selbst bei einfacher Testautomatisierung (Testausführung und Ergebnisse) sind zwangsläufig Kompromisse erforderlich, um die Testzeit angemessen zu halten.
Die einfache Lösung besteht darin, mit Rätselraten auszuwählen, welche Teile der Software als vollständige Systemtestsuiten getestet werden sollen, was zu zeitaufwändig und zu teuer ist. Eingebettete Softwareteams müssen ihre Tests verbessern und gleichzeitig die Tests auf genau das konzentrieren, was benötigt wird. Durch die Optimierung von Tests mithilfe einer intelligenteren Testautomatisierung wird das Rätselraten bei der Erstellung und Ausführung von Tests vereinfacht.
Optimieren Sie das Testen mit Code Coverage
Im Allgemeinen ist die Codeabdeckung ein Maß dafür, wie viel des Produktionscodes ausgeführt wird, während Ihre automatisierten Tests ausgeführt werden. Wenn Sie eine Reihe von Tests ausführen und die Daten zur Codeabdeckung anzeigen, können Sie allgemein erkennen, wie viel von der Anwendung getestet wird.
Es gibt mehrere Arten der Codeabdeckung. Bei eingebetteten Systemen müssen Sie mit Anweisung, Verzweigung und MC / DC vertraut sein. Für die strengsten Anforderungen, z. B. in sicherheitskritischer Software, kann eine Objektcodeüberprüfung oder eine Codeabdeckung in Assemblersprache erforderlich sein.
Sammeln und Analysieren von Code-Coverage-Metriken
Das Sammeln und Analysieren von Kennzahlen zur Codeabdeckung ist ein wichtiger Aspekt der sicherheitskritischen Entwicklung eingebetteter Software. Die Codeabdeckung misst den Abschluss von Testfällen und durchgeführten Tests. Es liefert den Nachweis, dass die Validierung abgeschlossen ist, zumindest wie im Software-Design angegeben.
Es zeigt auch das Fehlen eines unbeabsichtigten Verhaltens - Code, der von keinem Test abgedeckt wird, ist eine Haftung, da sein Verhalten und seine Funktionalität unbekannt sind. Umfang und Umfang der Codeabdeckung hängen von der Sicherheitsintegritätsstufe ab. Je höher das Integritätsniveau, desto höher ist erwartungsgemäß die verwendete Genauigkeit und unweigerlich die Anzahl und Komplexität der Testfälle.
Hier finden Sie Beispiele für empfohlene Arten der Codeabdeckung.
- Statement-Berichterstattung erfordert, dass jede Programmanweisung mindestens einmal ausgeführt wird (Zweig- und MC / DC-Abdeckung umfasst Anweisungsabdeckung).
- Filialabdeckung stellt sicher, dass jeder mögliche Entscheidungszweig (Wenn-Dann-Sonst-Konstrukte) ausgeführt wird.
- Geänderte Bedingung / Entscheidungsabdeckung (MC / DC) erfordert die vollständigste Codeabdeckung, um sicherzustellen, dass Testfälle jeden Entscheidungszweig und alle möglichen Kombinationen von Eingaben ausführen, die sich auf das Ergebnis der Entscheidungslogik auswirken. Bei komplexer Logik kann die Anzahl der Testfälle explodieren, sodass die geänderten Bedingungsbeschränkungen verwendet werden, um Testfälle auf diejenigen zu beschränken, die dazu führen, dass sich eigenständige logische Ausdrücke ändern. Schau dir das an Tutorial von der NASA.
Erweiterte Tools zur Automatisierung von Komponententests wie der Parasoft C / ++ - Test bieten all diese Kennzahlen zur Codeabdeckung und mehr. Der C / C ++ - Test automatisiert diese Datenerfassung beim Testen von Hosts und Zielen und sammelt den Verlauf der Testabdeckung im Laufe der Zeit. Dieser Verlauf der Codeabdeckung kann sich auf Einheiten-, Integrations- und Systemtests erstrecken, um sicherzustellen, dass die Abdeckung auf allen Testebenen vollständig und nachvollziehbar ist.
Erhöhen Sie die Codeabdeckung mit der automatisierten Erstellung von Komponententestfällen
Die Erstellung produktiver Komponententests war schon immer eine Herausforderung. Die Einhaltung funktionaler Sicherheitsstandards erfordert qualitativ hochwertige Software, was den Bedarf an Testsuiten erhöht, die Statistiken mit hoher Codeabdeckung beeinflussen und erstellen.
Teams benötigen Unit-Testfälle, mit denen sie ihre Abdeckungsziele erreichen können, die auch außerhalb des Bereichs sicherheitskritischer Software wichtig sind. Jeder Code, der nicht durch mindestens einen Test abgedeckt ist, wird ungetestet versendet!
Das Erhöhen der Codeabdeckung kann eine Herausforderung sein. Das Analysieren von Zweigen im Code und der Versuch, Gründe zu finden, warum bestimmte Codeabschnitte nicht behandelt werden, stiehlt weiterhin Zyklen von Entwicklungsteams.
So erhalten Sie eine 100% ige strukturelle Code-Abdeckung sicherheitskritischer Systeme
Deckungslücken schließen
Teams können Abdeckungslücken in Testsuiten mithilfe von a beheben Deckungsberater. Parasoft entdeckte, wie mithilfe der erweiterten statischen Code-Analyse (Daten- und Kontrollflussanalyse) Werte für die Eingabeparameter ermittelt werden können, die zum Ausführen bestimmter Zeilen ungedeckten Codes erforderlich sind.
Diese Analyse berechnet die Voraussetzungen für Funktionsparameter, globale Variablen und externe Funktionsaufrufe, die zum Ausführen einer bestimmten Codezeile erforderlich sind. Der Coverage Advisor präsentiert eine Sammlung von Lösungen für die vom Benutzer ausgewählten Codezeilen. Die dargestellten Werte werden zum Erstellen neuer Komponententestfälle verwendet. Diese Funktionalität erhöht die Produktivität von Entwicklern, die an Unit-Testfällen arbeiten, um die Codeabdeckung zu verbessern.
Jede Abdeckungslösung umfasst:
- Erforderliche Abhängigkeiten. Abhängigkeiten, die angepasst werden müssen, um die ausgewählte Linie abzudecken. Dies können Funktionsparameter, externe Funktionsaufrufe, globale Variablen, lokale Variablen und Klassenmitglieder sein.
- Voraussetzungen. Bedingungen, die von den erforderlichen Abhängigkeiten erfüllt sein müssen, um die ausgewählte Zeile abzudecken. Durch Klicken auf eine Vorbedingung wird zur zugehörigen Codezeile navigiert.
- Erwartete Abdeckung. Codezeilen, die abgedeckt werden, wenn alle Voraussetzungen erfüllt sind.
Optimieren Sie das Testen mit Smart Test Execution
Um das Testen in einer kontinuierlichen Pipeline zu beschleunigen, ist eine intelligente Testausführung pro Build erforderlich, um die Anzahl der Tests zu reduzieren, die ausgeführt werden müssen, um das Risiko zu berücksichtigen, das durch jede neue Iteration eingeführt wurde. Die von der Testauswirkungsanalyse bereitgestellten Analysen sind der Schlüssel dafür, dass sich die Tests nur auf das konzentrieren, was unbedingt getestet werden muss, und nicht auf den Schrotflintenansatz, der ansonsten verwendet wird.
Nur durch Smart können datenbasierte Entscheidungen kontinuierliche Tests ermöglichen. Die Konzentration des Entwicklungsteams auf die Mindestanzahl von Tests, um bei jeder Iteration eine ordnungsgemäße Abdeckung sicherzustellen, ist der Schlüssel, um die Agilität wieder auf die agilen Entwicklungsmethoden zurückzubringen.
Setzen Sie die Agilität mit Change-Based Testing wieder in die agile Entwicklung ein
Die intelligente Testausführung im Parasoft C / C ++ - Test wird um Plugins für CI-Systeme (Jenkins, TeamCity, Bamboo usw.) erweitert, um erweiterte Funktionen bereitzustellen, mit denen Softwareentwicklungsunternehmen Engpässe beim Ausführen kontinuierlicher Builds reduzieren können. Dieselben Funktionen stehen in IDE-Umgebungen mit dedizierten Plugins zur Verfügung, die über eine REST-API auf ein zentrales Abdeckungsbild zugreifen und bestimmen, welche Tests lokal in der IDE ausgeführt werden müssen, um den gesamten geänderten Code zu überprüfen.
Auf der Entwicklungsseite wenden erfahrene Entwickler möglicherweise die richtige Struktur bei der Organisation ihrer Tests an und führen nur eine Teilmenge davon manuell aus. Sie wissen jedoch möglicherweise nicht, welche Tests ausgeführt werden müssen, um ALLE Änderungen zu überprüfen.
Teams, die CI verwenden, verlassen sich möglicherweise auf nächtliche Builds, um alle Tests automatisch über Nacht auszuführen und am nächsten Tag Feedback zu erhalten, jedoch nur, wenn es möglich ist, die Gesamtzahl der Tests in weniger als 12 Stunden auszuführen.
Leider führen die meisten Softwareentwicklungsteams ihre täglichen Abläufe durch und akzeptieren diese nicht skalierbaren Testpraktiken. Die Situation wird noch schwieriger, wenn manuelle Tests durchgeführt werden. Herkömmliche Softwareentwicklungsorganisationen folgen immer noch Testpraktiken, die durch eine umgekehrte Pyramide dargestellt werden. Dabei wird betont, dass manuelle Tests aus dem einen oder anderen Grund über automatisierte Tests ausgeführt werden.
Bei der intelligenten Testausführung wird die Testauswirkungsanalyse verwendet, um die Ausführung manueller Tests für Anwendungen und die damit verbundenen, erfassten Informationen zur Codeabdeckung zu verfolgen. Eine ähnliche Technologie wird für automatisierte Tests verwendet. Diese Analyse ermittelt, welche manuellen Tests ausgeführt werden müssen, um auf geänderte Funktionen zuzugreifen, die bei jedem neuen Build bereitgestellt werden. Daher ist die intelligente Testausführung auf Entwickler- und Testerebene in ihren lokalen IDEs von entscheidender Bedeutung. Es ermöglicht ihnen, die Tests dort zu konzentrieren, wo sie benötigt werden, und Rätselraten und zusätzliche „Nur für den Fall“ -Arbeiten zu beseitigen.
Zusammenfassung
Kontinuierliche Integration und kontinuierliche Bereitstellung sind in der Embedded-Entwicklung an der Tagesordnung. Die Migration eines Wasserfallprozesses auf CI / CD- und Agile-Entwicklung zahlt sich in Risikominderung sowie Qualitäts- und Sicherheitsverbesserungen aus. Das Testen bleibt jedoch eine Hürde für die Einführung von CI / CD-Workflows für eingebettete Systeme, da die Automatisierung der Tests für diese Systeme besondere Herausforderungen mit sich bringt. Das Entfernen dieser Hindernisse durch intelligente Testausführung und das Optimieren von Tests bei gleichzeitiger Verbesserung der Codeabdeckung ist der Schlüssel für eine erfolgreiche CI / CD-Einführung.
Continuous Integration & Continuous Delivery (CI/CD) für eingebettete Systeme