
SBOM-Best Practices für Embedded- und Medizinsoftware
Moderne Software basiert auf Schichten von Open-Source- und Drittanbieterkomponenten – was sowohl Innovation als auch Risiko mit sich bringt. In […]
Join us at Qt C++ Warsaw Meetup - 21.08.2025
Sign up for free!Die Sicherstellung hoher Qualität und regulatorischer Konformität in qualitätsorientierten Branchen erfordert rigorose Softwaretests und Validierung. Zu den wichtigsten Kennzahlen zur Bewertung der Testeffektivität gehören Codeabdeckung und Testabdeckung. Obwohl eng miteinander verwandt, haben diese Begriffe unterschiedliche Bedeutungen und Implikationen.
Daher ist das Verständnis des Unterschieds zwischen ihnen entscheidend für die Entwicklung sicherer, zertifizierbarer Produkte.
Wenn Sie medizinische Software entwickeln oder sicherheitskritische Systeme – und Klarheit darüber benötigen, wie Sie die Testeffektivität messen, verbessern und kommunizieren können – ist dieser Artikel für Sie.
Wir behandeln:
Benötigen Sie Unterstützung, um Ihre Testpraktiken mit den Compliance-Anforderungen in Einklang zu bringen oder Ihre Teststrategie effektiv zu skalieren?
Lassen Sie uns darüber sprechen, wie wir Ihr Team mit den richtigen Tools, Einblicken und Fachkenntnissen unterstützen können.
Codeabdeckung ist ein quantitatives Maß dafür, wie viel des Quellcodes Ihrer Anwendung beim Ausführen der Tests ausgeführt wird. Einfach ausgedrückt, zeigt es, welche Zeilen, Funktionen oder Verzweigungen des Codes von Ihrer Testsuite durchlaufen wurden und welche nicht. Die Codeabdeckung wird typischerweise als Prozentsatz ausgedrückt (z. B. „75 % der Zeilen ausgeführt“). Höhere Prozentsätze bedeuten, dass weniger Teile des Codes von automatisierten Tests ungetestet bleiben.
Die Codeabdeckung wird mithilfe von Instrumentierungs- oder Analysetools gemessen, die überwachen, welcher Code während des Testprozesses ausgeführt wird. Häufige Abdeckungskriterien sind:
Betrachten Sie eine einfache Funktion mit einer if-else-Klausel, die eine medizinische Sensormessung verarbeitet. Wenn Ihre Tests nur den „if“-Zweig ausführen und niemals den „else“-Zweig auslösen, könnten Sie 100 % Zeilenabdeckung haben (alle Zeilen wurden ausgeführt), aber nur 50 % Verzweigungsabdeckung (nur einer von zwei Zweigen wurde getestet). Ein Codeabdeckungsbericht würde darauf hinweisen, dass der else-Pfad nicht getestet wurde. Durch Hinzufügen eines Tests, der die else-Bedingung abdeckt, würden Sie die Verzweigungsabdeckung auf 100 % erhöhen. Auf diese Weise helfen Codeabdeckungsmetriken, ungetestete Bereiche des Codebestands zu identifizieren.
In sicherheitskritischer Software ist ungetesteter Code ein Risiko. Eine hohe Codeabdeckung gibt die Sicherheit, dass der Großteil des Codes unter Testbedingungen bewertet wurde, was wiederum die Wahrscheinlichkeit unentdeckter Fehler in der Produktion verringert. Insbesondere kann die Codeabdeckung:
Obwohl die Codeabdeckung bestätigt, dass Code ausgeführt wurde, bestätigt sie nicht das korrekte Verhalten oder dass die Ausgaben validiert wurden. Es ist möglich, über 90 % Abdeckung zu haben und dennoch kritische Fehler zu übersehen, wenn die Tests das richtige Verhalten nicht überprüfen oder wenn der ungetestete 10 %ige Code Randfälle enthält. Außerdem kann das Erreichen sehr hoher Abdeckung (nahe 100 %) zu abnehmendem Nutzen führen – Tests, die nur geschrieben werden, um jede Zeile zu erreichen, können trivial sein und keine bedeutenden Probleme aufdecken. Daher garantiert 100 % Codeabdeckung nicht fehlerfreie Software oder ausreichende Tests. Sie zeigt lediglich an, dass Tests jede Zeile/Verzweigung ausgeführt haben; es liegt in der Verantwortung des Teams sicherzustellen, dass diese Tests tatsächlich korrekte Ergebnisse überprüfen.
Allgemein bezieht sich Testabdeckung darauf, inwieweit Ihre Tests mit Anforderungen, Funktionen und risikobasierten Bedürfnissen übereinstimmen – nicht nur mit Codepfaden. Anstatt die Codeausführung zu betrachten, fragt die Testabdeckung: Haben wir Tests für jedes wichtige Benutzerszenario, jede geschäftliche Anforderung oder jedes in den Spezifikationen identifizierte Risiko geschrieben? Es geht darum, Tests der beabsichtigten Funktionalität zuzuordnen und sicherzustellen, dass aus Verhaltensperspektive nichts Wichtiges ungetestet bleibt.
Im Gegensatz zur Codeabdeckung ist die Testabdeckung keine einzelne prozentuale Kennzahl, die automatisch von einem Tool berechnet wird. Sie umfasst oft die Erstellung einer Rückverfolgbarkeitsmatrix oder die Auflistung von Anforderungen gegenüber Testfällen. Zum Beispiel:
Eine hohe Testabdeckung stellt sicher, dass sich das System unter verschiedenen Bedingungen korrekt verhält und Ergebnisse durch erfolgreiche Testausführung validiert werden. Sie hilft sicherzustellen, dass die Software tut, was sie soll (und mit Situationen umgeht, die sie nicht tun soll), und verringert die Wahrscheinlichkeit, dass eine spezifizierte Funktionalität ungetestet bleibt. Wichtige Vorteile sind:
Die Testabdeckung, die qualitativ ist, kann schwieriger objektiv zu messen sein. Sie ist nur so gut wie die Anforderungen und das Testdesign – wenn eine Anforderung übersehen oder falsch spezifiziert wurde, kann eine 100%ige Testabdeckung der bekannten Anforderungen dennoch ein kritisches Verhalten verpassen. Außerdem garantiert, wie bei der Codeabdeckung, eine hohe Testabdeckung nicht, dass die Tests effektiv sind; schlechte Testfälle können ein falsches Sicherheitsgefühl vermitteln. Schließlich kann die Gewährleistung der Rückverfolgbarkeit für vollständige Testabdeckung ressourcenintensiv sein, abhängig von der erforderlichen Strenge (in regulierten Kontexten erfordert dies oft umfangreiche Dokumentation). Dies gilt insbesondere, wenn man sich auf manuelle Tests verlässt, bei denen menschliche Faktoren zu Inkonsistenzen bei der Testdurchführung oder Dokumentation führen können.
Beide Metriken zielen darauf ab, die Softwarequalität zu verbessern, jedoch aus unterschiedlichen Perspektiven. Sie ergänzen sich: Codeabdeckung fragt „Welche Teile unseres Codes haben wir in Tests ausgeführt?“ und Testabdeckung fragt „Welche Teile unseres Plans/Anforderungen haben wir durch Tests überprüft?“. Hier ist ein Vergleich:
Aspekt | Codeabdeckung | Testabdeckung |
---|---|---|
Definition | Prozentsatz des während der Tests ausgeführten Quellcodes.
„Wie viel des Codes haben wir in Tests ausgeführt?“ |
Ausmaß, in dem die Anforderungen, Funktionen und Risiken der Software durch Tests abgedeckt sind.
„Wie viel der Funktionalität haben wir getestet?“ |
Perspektive | White-Box: Fokussiert sich auf die interne Code-Struktur (Zeilen, Verzweigungen usw.) | Black-Box: Fokussiert sich auf das extern sichtbare Verhalten und die Anforderungen. Betrachtet aus Sicht des Softwaretests und des Endbenutzers. |
Gemessen durch | Quantitative Metriken (%, Anzahl der ausgeführten Zeilen/Verzweigungen) aus Instrumentierungstools. | Qualitative Zuordnung von Tests zu Anforderungen oder Szenarien (oft manuell analysiert oder durch Testmanagement-Tools). Ergebnis ist „X von Y Anforderungen abgedeckt“. |
Übliche Werkzeuge | Codeabdeckungstools (z. B. Coco für C++/Qt, JaCoCo für Java, Istanbul/nyc für JavaScript, Coverage.py für Python) instrumentieren den Code, um ausgeführte Teile zu protokollieren. | Testfallmanagement- und Rückverfolgbarkeitstools (z. B. Testmanagementsysteme, Trace-Matrizen). Ebenfalls Nutzung von Automatisierungsframeworks (JUnit, Selenium usw.), um sicherzustellen, dass jede Anforderung Tests hat. |
Typische Verantwortliche | Entwickler, insbesondere während Unit-Tests, um sicherzustellen, dass alle Codepfade getestet werden. Oft in CI-Pipelines integriert. | QA-Ingenieure und Testmanager während Integrations-/Systemtests, die sicherstellen, dass alle Funktionen & Anforderungen Testabdeckung haben. Ebenfalls von Compliance-Beauftragten zur Rückverfolgbarkeit überprüft. |
Ausgabe & Lücken | Liefert Abdeckungsberichte, die nicht ausgeführten Code hervorheben (z. B. „Zeilen 40–50 nicht abgedeckt“). Lücken zeigen Code, der keine Tests hat (potenzielle Blindstellen oder toter Code). | Liefert Matrizen oder Listen ungetesteter Anforderungen/Szenarien (z. B. „Kein Test für Anforderung 3.1 – Fehlerbehandlung bei ungültiger Eingabe“). Lücken zeigen Funktionalität, die durch keinen Test validiert wurde (potenziell nicht erfüllte Spezifikation oder nicht überprüftes Risiko). |
Wert | Verbessert die Test-tiefe: stellt sicher, dass Tests die Interna ausführen, und findet Fehler in ungetesteten Codeabschnitten. Wesentlich für Vertrauen beim Refactoring und zur Verhinderung von Regressionen in der Code-Logik. | Verbessert die Test-breite: stellt sicher, dass die Testsuite alle beabsichtigten Verhaltensweisen abdeckt und fehlende Testfälle für bestimmte Funktionen findet. Wesentlich, um zu bestätigen, dass das Produkt alle Anforderungen und Benutzerbedürfnisse erfüllt. |
Beschränkungen | Bewertet nicht, was überprüft wird – 100 % Codeabdeckung stellt nicht sicher, dass die Tests korrekte Ergebnisse prüfen oder dass Anforderungen erfüllt werden. Kann durch triviale Tests manipuliert werden oder durch Ausschluss von Code aus der Analyse. | Schwerer zu quantifizieren – „100 % Testabdeckung“ ist nur so vollständig wie Ihre Anforderungsliste. Zeigt nicht direkt, wie gründlich der Code ausgeführt wird (ein Test könnte eine Anforderung abhaken, aber nur einen Codepfad abdecken). Hängt von einer guten Spezifikation der Anforderungen ab. |
Um die Abdeckung effektiv zu verfolgen, stehen verschiedene Tools zur Verfügung. Hier sind einige bemerkenswerte und wie sie Ihre Abdeckungsziele unterstützen:
Coco ist ein umfassendes Analysewerkzeug für Codeabdeckung von Qt Quality Assurance, das C, C++, C#, QML und andere Sprachen unterstützt. Es instrumentiert Ihr Programm und kann mehrere Abdeckungsebenen (Anweisung, Verzweigung, MC/DC usw.) melden. Coco eignet sich hervorragend für die Embedded-Entwicklung und das Qt-Framework; es misst nicht nur die Abdeckung, sondern hilft auch, Tests zu optimieren, indem es ungetesteten oder redundant getesteten Code findet und sogar toten Code identifiziert. In einem medizinischen Projekt mit Qt oder C++ kann Coco unschätzbar sein, um Auditoren gründliche Tests nachzuweisen, mit Unterstützung für das Zusammenführen von Ergebnissen aus mehreren Testläufen und das Generieren detaillierter HTML/JSON-Berichte. (Coco ist ein kommerzielles Tool, aber sein umfangreicher Funktionsumfang ist darauf ausgelegt, hohe Standards wie die IEC 62304-Konformität zu erfüllen.)
LCOV ist ein weit verbreitetes Open-Source-Abdeckungstool für C und C++-Entwicklung, das auf dem gcc-Dienstprogramm gcov basiert. Es sammelt Abdeckungsdaten aus instrumentierten Binärdateien und generiert detaillierte HTML-Berichte, die Zeilen- und Verzweigungsabdeckung enthalten. LCOV integriert sich gut in Unix/Linux-basierte Build-Umgebungen (wie Make oder CMake) und ist besonders in CI-Pipelines üblich, in denen Codequalitätsgrenzen durchgesetzt werden. Zum Beispiel kann LCOV in einer sicherheitskritischen Embedded-Anwendung Auditoren zeigen, dass kritische Bedingungen und Pfade durch Visualisierung ungetesteter Zeilen und Verzweigungen getestet werden. Obwohl es einige erweiterte Analysen kommerzieller Tools nicht bietet, machen seine Leichtigkeit und starke Community-Unterstützung es zu einer zuverlässigen Wahl für viele regulierte Branchen, einschließlich Automobil- und Medizin.
OpenCppCoverage ist ein kostenloses, Windows-basiertes Tool zur Codeabdeckung für C++-Anwendungen, das den Microsoft Visual C++ Compiler (MSVC) verwendet. Es instrumentiert den Code zur Laufzeit, um Zeilen- und Funktionsabdeckung zu melden, was es besonders geeignet für native Windows-Entwicklungsumgebungen macht. Das Tool gibt menschenlesbare Berichte (HTML, XML) aus und kann Dateien und Symbole filtern, um sich auf bestimmte Module oder Bibliotheken zu konzentrieren. In einer Windows-basierten medizinischen Desktop-Anwendung könnte OpenCppCoverage ungetestete Logik in einem Modul zur Gerätekalibrierung aufdecken. Obwohl es einfacher ist als Tools wie Coco, ist es in eingeschränkten Umgebungen, in denen Visual Studio die Hauptumgebung ist und kommerzielle Tools keine Option sind, wertvoll.
Coverage.py ist das Standardtool zur Messung der Codeabdeckung in Python-Programmen. Es verwendet die Trace-Hooks von Python, um aufzuzeichnen, welche Codezeilen während der Tests ausgeführt werden. Nach dem Ausführen Ihrer Testsuite (z. B. mit pytest) kann Coverage.py einen Bericht (Text oder HTML) generieren, der zeigt, welche Zeilen ausgeführt wurden und welche nicht. In einem Python-basierten medizinischen Datenanalysetool könnte Coverage.py beispielsweise aufdecken, dass ein Modul zur Datenanalyse nicht durch Tests abgedeckt wurde – was das Team dazu veranlasst, die notwendigen Tests hinzuzufügen. Es unterstützt auch Verzweigungsabdeckung und lässt sich einfach über Plugins wie pytest-cov integrieren.
Es gibt viele andere Abdeckungstools für verschiedene Sprachen (z. B. Cobertura oder OpenClover für Java, dotCover für .NET, gcov für C usw.), aber das Konzept bleibt dasselbe – sie helfen sicherzustellen, dass kein Teil des kritischen Codes ungetestet bleibt. Es ist auch erwähnenswert, dass Testmanagement-Tools (für die Testabdeckung) wie Jama, Polarion oder Helix ALM die Rückverfolgbarkeit von Anforderungen zu Tests verfolgen können, was in regulierten Branchen häufig zur Verwaltung der Testabdeckung verwendet wird.
Praxistipp
In Continuous Integration (CI) können Sie diese Tools automatisieren, um bei jedem Build Abdeckungsergebnisse zu erhalten. Beispielsweise könnte eine CI-Pipeline Unit-Tests mit Coco oder JaCoCo ausführen und dann fehlschlagen oder warnen, wenn die Abdeckung gesunken ist. Dies hält das Team über die Abdeckungsmetriken während des gesamten Projektlebenszyklus informiert und verantwortlich. Das Coco-Tool bietet sogar einen Testdatengenerator und Optimierungsvorschläge, um schneller eine höhere Abdeckung zu erreichen – nützlich, wenn Sie versuchen, strenge Qualitätsziele zu erreichen.
Im Testen medizinischer Gerätesoftware legen regulatorische Standards und Richtlinien großen Wert auf gründliche Tests – sowohl in Bezug auf die Erfüllung von Anforderungen als auch auf die Codeausführung. Während IEC 62304 (die internationale Norm für den Softwarelebenszyklus medizinischer Geräte) keinen spezifischen numerischen Abdeckungswert vorschreibt, „weist sie auf die Notwendigkeit rigoroser Tests, Akzeptanzkriterien und Rückverfolgbarkeit hin“, was implizit den Einsatz von Abdeckungsanalysen und anderen Tools zur Gewährleistung der Softwaresicherheit erfordert. So verknüpfen sich Abdeckungsmetriken mit Qualität und Compliance:
Für medizinische Software der Klasse C (bei der ein Softwarefehler schwere Verletzungen oder den Tod verursachen könnte) erwarten die Regulierungsbehörden den Nachweis, dass die Software umfassend verifiziert wurde. Die FDA-Leitlinie erwähnt beispielsweise ausdrücklich die Testabdeckung als Mittel, um Vertrauen in die Sicherheit der Software vor der Freigabe aufzubauen. Eine Aussage der FDA lautet, dass Entscheidungsabdeckung (Branch Coverage) „als Mindestabdeckung für die meisten Softwareprodukte gilt, aber allein für Anwendungen mit hoher Integrität unzureichend ist“.
In der Praxis bedeutet dies, dass sich ein FDA-Prüfer zufriedener zeigt, wenn Sie nicht nur 100 % Verzweigungsabdeckung, sondern auch nachweisen können, dass kritische Algorithmen strengeren Kriterien (wie MC/DC-Abdeckung) für Software mit höchstem Risiko entsprechen. Eine hohe Codeabdeckung wird somit de facto zur Anforderung in sicherheitskritischen Systemen – viele Organisationen, die Geräte der Klasse C entwickeln, streben 100 % Codeabdeckung (mindestens für Zeilen und Verzweigungen) an, um interne Qualitätsziele zu erfüllen und Auditoren Sicherheit zu geben.
Die Entwicklung medizinischer Software umfasst die Identifizierung von Gefahren und Abhilfemaßnahmen. Die Testabdeckung ist damit durch Anforderungsbasiertes Testen und risikobasiertes Testen (beide in IEC 62304 erwähnt) verknüpft. Sie müssen nachweisen, dass alle Risikokontrollmaßnahmen in der Software getestet wurden. Wenn beispielsweise eine Anforderung lautet „Die Software soll bei Kommunikationsfehlern mit der Pumpe eine Warnung ausgeben“, müssen Sie dafür einen Test haben. Rückverfolgbarkeitsmatrizen verknüpfen jede solche Anforderung mit einem oder mehreren Testfällen und zeigen den Regulierungsbehörden, dass jedes identifizierte Risiko und jede Anforderung mindestens einen bestandenen Test hat. Dies ist im Wesentlichen die Testabdeckung der Anforderungen und wird häufig während Zertifizierungsaudits überprüft.
Aus technischer Sicht tragen hohe Abdeckungsmetriken direkt zur Produktqualität bei. In lebenswichtigen Anwendungen ist ungetesteter Code zu riskant, um im Produkt zu verbleiben. Durch die Verwendung von Codeabdeckungstools entdecken Teams oft Teile des Codes, die von keinem Test ausgeführt wurden – beispielsweise einen Fehlerbehandlungszweig, der nur bei einem seltenen Sensorfehler ausgelöst wird. Wenn dies bekannt ist, können sie einen neuen Test schreiben (oder den Fehler simulieren), um diesen Zweig abzudecken und möglicherweise einen Fehler aufzudecken, der erst im Feld auftreten würde. Mit anderen Worten, Abdeckungsmetriken helfen, latente Fehler vor dem Einsatz des Produkts in Krankenhäusern oder bei Patienten zu finden. Das Endergebnis ist ein robusteres Produkt mit weniger Fehlern nach der Markteinführung.
Auch Abdeckungstrends im Zeitverlauf sind wichtig – sie helfen sicherzustellen, dass neue Funktionen von Tests begleitet werden und dass Tests sich auf sich entwickelnde Risikobereiche konzentrieren. Wenn zum Beispiel das Modul zur Berechnung der Infusionspumpendosis nur zu 60 % getestet ist, aber sicherheitskritisch ist, sollten Manager dort mehr Testressourcen zuweisen. Umgekehrt kann bei einem weniger kritischen Modul mit 95 % Abdeckung der Aufwand umverteilt werden. Sinkt die Abdeckung, deutet dies möglicherweise darauf hin, dass neuer Code ohne Tests hinzugefügt wurde (ein Prozessfehler, der korrigiert werden muss). Viele sicherheitsorientierte Teams machen die Abdeckung zu einem wichtigen Qualitäts-KPI und überprüfen sie regelmäßig in Projektbesprechungen.
Beim Streben nach Zertifizierung (FDA 510(k), CE-Kennzeichnung nach MDR usw.) fügen Entwicklungsteams die Analyseberichte zur Abdeckung oft in den Antrag oder die technische Datei ein. Diese Dokumente belegen die Sorgfaltspflicht. Zum Beispiel könnte ein IEC-62304-Projekt der Klasse C eine Zusammenfassung enthalten: „Unit-Tests erreichten 98 % Anweisungs- und 100 % Verzweigungsabdeckung für alle Klasse-C-Module“, gestützt durch Toolberichte. Zusätzlich kann die Toolqualifizierung eine Rolle spielen: Wenn Sie ein Abdeckungstool zur Erfüllung einer regulatorischen Anforderung verwenden, verlangen Standards wie IEC 62304 und ISO 13485, dass dieses Tool für den Einsatz validiert/qualifiziert wird. (Viele Anbieter, einschließlich Qt für Coco, stellen Tool Qualification Kits zur Verfügung, um dies zu erleichtern.)
Teams neigen leicht dazu, Abdeckungszahlen als Kontrollkästchen oder Eitelkeitsmetriken zu behandeln. Richtig eingesetzt, sind sie jedoch mächtige Werkzeuge für das Management der Softwarequalität. Hier sind einige Tipps für CTOs, QA-Manager und andere Führungskräfte, um Code- und Testabdeckungsdaten optimal zu nutzen:
Im Kontext sicherheitskritischer Bereiche, in denen Ausfälle Leben kosten können, sind sowohl Codeabdeckung als auch Testabdeckung unverzichtbare Metriken zur Sicherstellung der Softwarequalität und zur Erfüllung regulatorischer Anforderungen.
Die Aufrechterhaltung eines Gleichgewichts – quantitative Codeabdeckung, um sicherzustellen, dass kein Code im Dunkeln bleibt, und qualitative Testabdeckung, um sicherzustellen, dass keine Anforderung unüberprüft bleibt – bringt Ihre Organisation in eine starke Position, um qualitativ hochwertige, konforme Software zu liefern. Durch das Verständnis und die kluge Nutzung dieser Metriken können Führungskräfte und Manager Projekte dort zum Erfolg führen, wo es am wichtigsten ist.
Die Entwicklung sicherheitskritischer Software ist mit hohen Risiken und hohen Erwartungen verbunden.
Ob Sie die Rückverfolgbarkeit verbessern, die Entwicklung optimieren oder regulatorische Anforderungen mit Zuversicht erfüllen müssen – wir sind hier, um zu helfen. Lassen Sie uns darüber sprechen, wie wir Ihr Team während des gesamten Entwicklungszyklus unterstützen können.
Kommen wir zur Sache: Es ist eine Herausforderung, Top-Qt-QML-Entwickler zu finden. Helfen Sie sich selbst und starten Sie die Zusammenarbeit mit Somco Software – echten Experten im Qt C++ Framework.
Entdecken Sie unsere Fähigkeiten!Moderne Software basiert auf Schichten von Open-Source- und Drittanbieterkomponenten – was sowohl Innovation als auch Risiko mit sich bringt. In […]
Haben Sie schon einmal bemerkt, dass die meisten professionellen Softwareprodukte und Spiele für alle gängigen Plattformen verfügbar sind? Das ist […]
Willkommen zu diesem umfassenden Leitfaden über 3D-Grafiken in Qt. In diesem Artikel werden wir drei Hauptmöglichkeiten untersuchen, wie Sie 3D-Inhalte […]