image
image

Stephan Grünfelder war Programmierer und Tester für die unbemannte Raumfahrt und Medizintechnik, später Projektleiter für Steuergeräte-Entwicklung im Automobilbereich und arbeitet nun als selbständiger Trainer für Software-Testing und als Senior Software Tester für Broadcast-Ausrüstung. Er hat bzw. hatte Lehraufträge an der Hochschule Reykjavik, der Fachhochschule Technikum Wien und der Technischen Universität Wien.

image

Zu diesem Buch – sowie zu vielen weiteren dpunkt.büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei dpunkt.plus+:

www.dpunkt.plus

Stephan Grünfelder

Software-Test für
Embedded Systems

Ein Praxishandbuch für Entwickler,
Tester und technische Projektleiter

2., aktualisierte Auflage

image

Stephan Grünfelder

Lektorat: Sandra Bollenbacher

Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

2., aktualisierte Auflage 2017

Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.

Vorwort

Wie viele Artikel und Bücher habe ich schon gelesen, in denen im ersten Satz steht, dass Computersysteme immer komplexer werden oder Entwicklungszyklen immer kürzer und dass man deshalb von nun an Dinge besser/schneller machen muss als früher? Ich kann es nicht sagen. Diese Ausrede und Einleitung ist aber schon seit mehreren Jahrzehnten gültig, denn Techniken werden unentwegt weiterentwickelt, Technologien wandeln sich durch neue Einflüsse und die Zeit steht niemals still. Schon gar nicht rund um die Themen der Software-Entwicklung. Dieses Buch wurde nicht geschrieben, weil gerade jetzt alles komplexer wird und ich, als Autor, der Welt sagen will, wie man damit umgeht, sondern weil es im deutschsprachigen Raum noch kein brauchbares Buch zum Thema Test von Software eingebetteter Systeme gab und ich oft genug gesehen habe, wie schwer sich manche Leute damit tun.

Praxisbezug des Buchs

Das Buch vermittelt praxisnahes Wissen zum Test von Software eingebetteter Systeme, so wie es jetzt und heute gemacht wird oder gemäß dem industriellen Stand der Technik gemacht werden sollte. Auch wenn der Stand der Wissenschaft und Forschung für das Schreiben des Buchs wichtig war, so nehmen forschungsnahe Themen nur wenig Platz ein, wenn deren industrielle Umsetzung Probleme bereitet. Das Buch präsentiert viele Beispiele, persönliche Erfahrungsberichte und enthält praxisnahe Fragen und Lösungen zum Selbsttest. Die Terminologie des Buchs orientiert sich weitgehend an der des ISTQB-Certified-Tester-Schemas und der Normenreihe ISO 29119. Das Buch ist dabei an vielen Stellen komplementär zum Curriculum des ISTQB, speziell dann, wenn es um Echtzeit, Concurrency und maschinennahe Themen geht, und es ist – unvermeidbar – zum Teil redundant dazu.

Software für eingebettete Systeme unterscheidet sich von anderer Software dadurch, dass die Software Teil des Produkts ist, das der Kunde kauft, und nicht das Produkt selbst. Meist wird das Produkt, in das ein Prozessor mit zugehöriger Software eingebettet ist, wertlos, wenn die Software nicht zuverlässig funktioniert. Im schlimmsten Fall muss es vom Markt genommen werden. Kein Wunder also, dass man sich in dieser Sparte der Software-Entwicklung besonders viele Gedanken zur Korrektheit von Software macht.

Aber durch Testen alleine erhält man kein fehlerfreies Produkt. Wie ein alter Freund von mir zu sagen pflegte: »Man kann Software nicht am Ende der Produktentwicklung ›gesund testen‹, wenn es in so manchen Entwicklungsschritten zuvor krankt.« Das vorliegende Buch beschäftigt sich daher auch mit Praktiken links und rechts vom Test, die die Entwicklung begleiten und dazu beitragen, mit höherer Wahrscheinlichkeit »gesunde« Software zu erhalten.

Wie man dieses Buch liest

Das Spektrum eingebetteter Systeme reicht von batteriebetriebenen 16-Bit-Controllern ohne Betriebssystem und mit geringen Anforderungen an die Systemintegrität bis hin zu im Internet Of Things vernetzten Multiprozessor-Systemen mit Echtzeitbetriebssystem, Mensch-Maschine-Schnittstelle und Sicherheitsrelevanz. Entsprechend viele Zielgruppen hat dieses Buch. Daher gibt es vermutlich Kapitel im Buch, die für Ihre speziellen Aufgaben irrelevant sein könnten. Sie dürfen diese Kapitel gerne überspringen, denn ich habe mir größte Mühe gegeben, jedes Kapitel weitgehend unabhängig von den anderen zu schreiben, und das Letzte, was dieses Buch tun sollte, ist, Sie zu langweilen. So können Systemtester zum Beispiel getrost die Kapitel über Reviews und statische Analyse auslassen. Die Unabhängigkeit der Kapitel macht es nötig, dass Inhalte teilweise wiederholt werden müssen.

Fans moderner Programmiersprachen sollten sich nicht daran stoßen, dass fast alle Beispielprogramme im Buch in der Programmiersprache C geschrieben sind. C ist weder komfortabel noch modern, doch hat C noch immer seinen festen Platz in der Entwicklung von Produkten mit höchsten Qualitätsanforderungen, und die meisten Entwickler verstehen die Basissyntax dieser Sprache ohne Probleme.

Ich wünsche Ihnen viel Freude beim Lesen und viel Erfolg bei der Umsetzung der in diesem Buch präsentierten Ideen.

Herzlichst

Stephan Grünfelder, Oktober 2016

Danksagung

Ich persönlich fand es immer ärgerlich ein Buch zu lesen, in dem ein Autor über Themen schrieb, bei denen er – wie ich später herausfand – nicht wirklich sattelfest war oder die er nur aus einem einzigen Projekt kannte. Nun habe ich selbst ein Buch verfasst und noch dazu eines mit dem Anspruch, praxisnah zu sein. Ich kann nicht für alle in diesem Buch beschriebenen Methoden ein Experte mit jahrelanger Erfahrung sein. Um meinen eigenen Ansprüchen an ein Fachbuch gerecht zu werden, war es daher unumgänglich, Partner zur Unterstützung hinzuzuziehen. Diesen Unterstützern gilt mein besonderer Dank. Ich nenne zunächst Personen, die ganze Kapitel (mit)gestaltet haben:

Reinhard Wilhelm, wissenschaftlicher Direktor des Leibniz-Zentrums für Informatik und Professor an der Universität des Saarlandes, hat das Kapitel über Worst Case Execution Timing Analysis verfasst.

Michael González Harbour, Professor des Computer- und Echtzeitteams der Fakultät für Computer und Elektronik der Universität Kantabrien, Spanien, hat das Kapitel über Schedulability-Analyse geschrieben.

Oliver Alt, Autor des Buchs »Modell-basierter Systemtest von Car Multimedia Systemen mit SysML« steuerte den größten Teil von Kapitel 15 bei.

Stoff und Idee für das Kapitel »Trace-Daten im Testumfeld« kamen von Alexander Weiss, Accemic GmbH, und von Martin Leucker, Professor am Institut für Softwaretechnik und Programmiersprachen an der Universität zu Lübeck.

Johannes Bergsmann, gerichtlich vereidigter Sachverständiger und Ziviltechniker für Informatik sowie Geschäftsführer des Unternehmens Software Quality Lab, hat mich durch eine Review des Kapitels 17 unterstützt und den Großteil von Kapitel 18 geschrieben.

Die Inhalte aus Kapitel 19 zum Thema Haftung stammen aus einer Publikation, die ich im Jahr 2009 gemeinsam mit dem Heidelberger Fachrechtsanwalt Tobias Sedlmeier und zuvor genanntem Johannes Bergsmann veröffentlicht habe. Für die unabhängige Durchsicht des auf Basis dieser Publikation neu geschriebenen Kapitels danke ich dem Münchner Rechtsanwalt Christian R. Kast recht herzlich.

Eine ganze Reihe von Personen hat mich durch eine Review oder Ergänzungen des Manuskripts unterstützt. Ich freue mich, dass die folgenden von mir ausgewählten Spezialisten meiner Bitte, Teile des Buchs zu prüfen und zu ergänzen, Folge geleistet haben:

Helmut Pichler, Präsident des Austrian Testing Boards, hat die Buchpassagen mit Bezug zu ISTQB reviewt.

Markus Unterauer, Trainer und Berater für Requirements Engineering, hat das Kapitel »Anforderungen und Test« kritisch gelesen.

Gernot Salzer, Professor am Institut für Computersprachen der Technischen Universität Wien, hat meine Ausführungen zu formalen Methoden korrigiert und ergänzt. Ich gebe unumwunden zu, dass formale Methoden nicht zu meiner Kernkompetenz gehören. Dementsprechend viel Rotstift fand sich in meinem Manuskript und dementsprechend kurz ist der betreffende Abschnitt in meinem Buch. Sein Kollege Georg Weissenbacher hat diese undankbare Aufgabe bei der Überarbeitung für die zweite Auflage übernommen.

Robert Mittermayr, Promovend auf dem Gebiet der Deadlock-Analyse, unterstützte mich durch eine Review der Kapitel zu Deadlocks und Race Conditions.

Daniel Kästner, Mitbegründer der AbsInt Angewandte Informatik GmbH, ergänzte für die zweite Auflage meine Ausführungen zur statischen Data-Race-Analyse um die Technik der abstrakten Interpretation.

Renate Gutjahr, Product Managerin der PLATO AG in Lübeck, sah Kapitel 14 durch und lieferte wertvolle Ergänzungen für die Abschnitte mit Bezug zur FMEA.

Matthias Daigl von der imbus AG hat mich unterstützt, indem er die Teile der zweiten Auflage des Buchs korrigierte, die Bezug zur ISO 29119 nehmen.

Aus dem Kreis der Abonnenten meines Newsletters meldeten sich viele Testleser für einzelne Kapitel dieses Buchs; Einsteiger wie ausgewiesene Experten. Für Hinweise und Kommentare aus diesem Leserkreis danke ich Oliver Bee, Frank Büchner, Christian Fuchs, Ralf Geiger, Alfred Guszmann, Wolfgang Höllmüller, Martin Horauer, Stefan Larndorfer, Sebastian Koopmann, Reinhard Meyer, Anke Mündler, Harald Nistelberger, Rudolf Ramler, Thilo Richard, Gerald Schröder, Christian Siemers, Arnd Strube, Andreas Weigl-Pollack und Bodo Wenzel.

Meiner Frau und meinen Kindern danke ich für ihre Geduld. Viele Monate lang war ich fast jede freie Minute mit dem Schreiben des Buchs beschäftigt.

Inhaltsverzeichnis

1Einleitung

1.1Motivation

1.2Abgrenzung des Buchs zu ISTQB-Lehrplänen

1.3Zur Gliederung dieses Buchs

1.4Die wichtigsten Begriffe kurz erklärt

1.4.1Definition von Fachbegriffen

1.4.2Zu Definitionen und TesterInnen

1.5Ein Überblick über das Umfeld des Software-Testing

1.5.1Ursachen von Software-Fehlern

1.5.2Warum Programmfehler nicht entdeckt werden

1.5.3Angebrachter Testaufwand

1.5.4Der Tester und der Testprozess

1.5.5Modellieren der Software-Umgebung

1.5.6Erstellen von Testfällen

1.5.7Ausführen und Evaluieren der Tests

1.5.8Messen des Testfortschritts

1.5.9Testdesign und Testdokumentation im Software-Entwicklungsprozess

1.5.10Verschiedene Teststufen und deren Zusammenspiel

1.5.11Andere Verifikationsmethoden als Ergänzung zum Test

1.5.12Agile Prozessmodelle

1.5.13Der Software-Test in agilen Vorgehensmodellen

1.5.14Wer testet die Tester?

2Anforderungen und Test

2.1Die Bedeutung textueller Anforderungen

2.2Requirements Engineering im Projekt

2.3Arten und Quellen von Anforderungen

2.4Warum Anforderungen dokumentiert werden sollen

2.5Die Review von Anforderungen

2.5.1Testbarkeit von Anforderungen

2.5.2Modifizierbarkeit und Erweiterbarkeit

2.5.3Relevanz von Anforderungen

2.6Der Umgang mit natürlicher Sprache

2.6.1Einfache Sprache gegen Missverständnisse

2.6.2Gelenkte Sprache

2.7Hinweise zur Dokumentenform

2.8Die Spezifikation an der Schnittstelle zum Testteam

2.8.1Konfiguration von Testdesigns

2.8.2Vollständigkeit von Spezifikationen

2.9Werkzeuge zur Review von Anforderungen

2.10Diskussion

2.10.1Verifikation beim Requirements Engineering mit Augenmaß

2.10.2Bewertung der Rolle des Requirements Engineering für den Testprozess

2.11Fragen und Übungsaufgaben

3Review des Designs

3.1Ziele der Review des Architekturdesigns

3.2Ziele der Review des Detaildesigns

3.3Eigenschaften von gutem Software-Design

3.4Hinweise zur Architektur-Design-Review

3.5Embedded Design

3.5.1Sicherheit, Verfügbarkeit & Co

3.5.2Wartbarkeit des Geräts

3.5.3Ressourcenverbrauch

3.5.4Design von Echtzeitsystemen

3.6Diskussion

3.7Fragen und Übungsaufgaben

4Automatische statische Code-Analyse

4.1Motivation zum Einsatz von Analysewerkzeugen

4.2Techniken von Analysewerkzeugen im unteren Preissegment

4.2.1Sprachspezifische Fallstricke

4.2.2Kontrollflussanalyse

4.2.3Datenflussanalyse, Initialisation Tracking

4.2.4Datenflussanalyse, Value Tracking

4.2.5Semantische Analyse

4.2.6Starke Typenprüfung

4.3Techniken von Analysewerkzeugen im oberen Preissegment

4.3.1Größerer Komfort für den Benutzer

4.3.2Concurrency Checks

4.3.3Stack-Analyse und erweiterte Kontrollflussanalyse

4.3.4Erschöpfende Analyse des Zustandsbaums

4.4Statische Security-Analyse (SSA)

4.5Code-Metriken

4.6Werkzeuge für die Automatische Code-Analyse

4.7Diskussion

4.8Fragen und Übungsaufgaben

5Code-Reviews

5.1Review-Arten

5.1.1Code-Inspektionen

5.1.2Walkthrough

5.1.3Peer-Review

5.2Pair Programming

5.3Werkzeuge zur Code-Review

5.4Diskussion

5.5Fragen und Übungsaufgaben

6Unit-Tests

6.1Der Unit-Test im Entwicklungsprozess

6.2Zur Definition von Unit-Test und Modultest

6.3Black-Box-Testfälle beim White-Box-Test

6.3.1Äquivalenzklassenbildung

6.3.2Grenzwertanalyse

6.3.3Andere Methoden

6.4Stubs und Treiber

6.5Verschiedene Typen von Werkzeugen beim White-Box-Test

6.5.1Unit-Test-Frameworks

6.5.2Werkzeuge zur Testerstellung

6.5.3Werkzeuge zur Messung der Testabdeckung

6.6Testabdeckung

6.6.1Statement Coverage

6.6.2Branch Coverage und Decision Coverage

6.6.3Decision/Condition Coverage

6.6.4Modified Condition/Decision Coverage

6.6.5Andere Testabdeckungen

6.6.6Testabdeckung bei modellbasierter Entwicklung

6.6.7Messung der Testabdeckung

6.7Basis Path Testing

6.8Host oder Target Testing?

6.9Den Code immer unverändert testen?

6.10Unit-Tests bei objektorientierten Sprachen

6.11Grenzen des Unit-Tests

6.12Werkzeuge für den Unit-Test

6.12.1Unit-Test-Frameworks

6.12.2Werkzeuge zur Testerstellung

6.12.3Coverage-Analyse

6.13Diskussion

6.13.1Testabdeckung

6.13.2Organisation von Unit-Tests

6.14Fragen und Übungsaufgaben

7Integrationstests

7.1Software/Software-Integrationstest

7.1.1Bottom-up-Unit-Tests als Integrationstest

7.1.2Strukturierter Integrationstest

7.1.3Testabdeckung der Aufrufe von Unterprogrammen

7.1.4Vergleich der Teststrategien

7.1.5Grenzen des Software/Software-Integrationstests

7.1.6Diskussion des Software/Software-Integrationstests

7.2Ressourcentests

7.2.1Statischer Ressourcentest

7.2.2Dynamischer Ressourcentest

7.3Hardware/Software-Integrationstest

7.3.1Bottom-up-Verfahren

7.3.2Regressionsverfahren

7.3.3Black-Box-Verfahren

7.3.4Test und Analysen bei Sicherheitsrelevanz

7.3.5Diskussion des Hardware/Software-Integrationstests

7.4Systemintegrationstest

7.5Werkzeuge für den Integrationstest

7.6Fragen und Übungsaufgaben

8Systemtests

8.1Funktionale Systemtests

8.1.1Zuordnung funktionaler Systemtests zu Anforderungen

8.1.2Äquivalenzklassen und Grenzwerte im Black-Box-Test

8.1.3Zustandsbasierter Test

8.1.4Ursache-Wirkungs-Analyse

8.1.5CECIL-Methode

8.1.6Entscheidungstabellentechnik

8.1.7Paarweises Testen und Klassifikationsbaum-Methode

8.1.8Back To Back Testing

8.1.9Erfahrungsbasierter Test

8.1.10Diskussion des Black-Box-Tests

8.1.11Auswahl eines Black-Box-Testverfahrens für eine Aufgabe

8.1.12Werkzeuge für Funktionstests

8.2Test der Benutzerschnittstelle

8.2.1Grafische Benutzerschnittstelle

8.2.2Werkzeuge für GUI-Tests

8.2.3Eingebettete Benutzerschnittstellen

8.2.4Werkzeuge für den Test von eingebetteten Benutzerschnittstellen

8.3Performanztest und Lasttest

8.4Stresstest

8.5Volumentest

8.6Failover und Recovery Testing

8.7Ressourcentests

8.8Installationstests

8.9Konfigurationstests

8.10Security-Tests

8.11Dokumententests

8.12Testumgebung und Testdaten

8.13Formale Methoden

8.13.1Symbolischer Test

8.13.2Deduktive Verifikation von funktionalen Anforderungen

8.13.3Model Checking

8.14Automation von Systemtests

8.14.1Vor- und Nachteile der Testautomation

8.14.2Tipps zur Automation von Systemtests

8.15Dokumentation des Testdesigns und der Testergebnisse

8.16Grenzen des Systemtests

8.17Fragen und Übungsaufgaben

9Testen von RTOS und Middleware

9.1Definition und Motivation

9.2White-Box-Requirements-Test

9.3Test eines Interrupt-Managers

9.4Test eines Schedulers

9.5Fragen und Übungsaufgaben

10Race Conditions

10.1Definition von Data Races

10.2Dynamische Data-Race-Analyse

10.2.1Eraser

10.2.2Lamports Happens-Before-Relation

10.3Statische Data-Race-Analyse

10.3.1Ansätze zur statischen Data-Race-Analyse

10.3.2Vergleich zur dynamischen Data-Race-Analyse

10.4Werkzeuge für die Data-Race-Analyse

10.5Diskussion

10.6Fragen und Übungsaufgaben

11Deadlocks

11.1Über die Entstehung von Deadlocks

11.2Verschiedene Arten der Deadlock-Analyse

11.3Dynamische Deadlock-Analyse

11.4Statische Deadlock-Analyse

11.5Werkzeuge zur Deadlock-Detektion

11.6Diskussion

11.7Fragen und Übungsaufgaben

12Echtzeit-Verifikation

12.1Antwortzeiten bei funktionalen Tests

12.2WCET-Analyse

12.2.1Problemstellung

12.2.2Laufzeitanalyse

12.3Werkzeuge für die WCET-Analyse

12.4Diskussion

12.5Fragen und Übungsaufgaben

13Schedulability-Analyse

13.1Aufgaben der Schedulability-Analyse

13.2Definitionen

13.3Diskussion der Scheduling-Strategien

13.3.1Statisches Scheduling

13.3.2Dynamisches Scheduling

13.4Analyse bei Fixed-Priority-Single-CPU-Systemen

13.4.1Optimale Prioritätsvergabe

13.4.2Rate Monotonic Analysis

13.4.3Exakte Antwortzeitenanalyse

13.4.4Gegenseitiger Ausschluss

13.4.5Aperiodische Aufgaben

13.4.6Kontextwechsel

13.4.7Cache und Out Of Order Execution

13.4.8Input-Jitter

13.4.9Interrupts

13.5Multi-CPU-Systeme

13.5.1Multicore- und Multiprozessor-Systeme

13.5.2Verteilte Systeme

13.6Scheduling-Analyse für CAN

13.7Werkzeuge

13.8Diskussion

13.9Fragen und Übungsaufgaben

14Hardware/Software-Interaktionsanalyse

14.1Die FMEA als Grundlage der HSIA

14.2Die HSIA als Quelle für Software-Anforderungen

14.3Software-Kritikalitätsanalyse

14.4Software-FMEA

14.5Werkzeuge

14.6Diskussion

14.7Fragen und Übungsaufgaben

15Modellbasierter Test

15.1Begriffsdefinition

15.2MBT und Testautomation

15.3Modelle

15.3.1Statecharts

15.3.2SDL

15.3.3Message Sequence Charts

15.3.4UML Version 2

15.3.5SysML

15.3.6Funktionsmodellierung

15.4Testmodell vs. Implementierungsmodell

15.5Werkzeuge

15.6Diskussion

15.7Fragen und Übungsaufgaben

16Trace-Daten im Testumfeld

16.1Das Dilemma mit instrumentiertem Code

16.2Embedded-Trace-Schnittstellen

16.3Werkzeuge

16.4Diskussion

17Testmanagement

17.1Testplanung

17.2Teststeuerung

17.3Abweichungsmanagement

17.4Bewertung und Anpassung des Testprozesses

17.4.1Formale Reifegradmodelle für den Software-Test

17.4.2Prozessbewertung in agilen Projekten

17.4.3Mit Augenmaß ins Kostenoptimum

17.5Risikobasierter Test

17.6Werkzeuge

17.7Diskussion

17.8Fragen und Übungsaufgaben

18Qualitätsmanagement

18.1Definition

18.2Qualitätsmanagement-Standards

18.3Kosten und Haftungsrelevanz des QM

18.4Umsetzung des Qualitätsmanagements

18.5Die Rolle des Qualitätsmanagers

18.6Mit Metriken die Qualität steuern

18.7Die Wirtschaftlichkeit von QM

18.8Werkzeuge

18.9Diskussion

18.10Fragen und Übungsaufgaben

19Software-Test und Haftungsrisiko

19.1Ein Software-Fehler im Sinne des Gesetzes

19.2Vertragliche Gewährleistung und Haftung

19.3Vertragliche Beschränkung der Haftung

19.4Produzentenhaftung bei Software

19.5Produkthaftung

19.6Sorgfaltspflicht des Software-Herstellers

19.7Technische Normen mit Bezug zum Software-Test

19.7.1DIN IEC 56/575/CD

19.7.2IEEE Std 1012

19.7.3IEEE Std 829

19.7.4IEEE Std 1008-1987

19.7.5ISO/IEC 29119

19.7.6IEC/EN 61508

19.7.7ISO 26262

19.7.8Normenreihe 250XX

19.8Tipps vom Rechtsanwalt und vom Techniker

19.9Fragen und Übungsaufgaben

Nachwort

Anhang

Anhang A – Lösungen zu den Übungsaufgaben

Anhang B – Dokumentation des Testdesigns

Anhang C – Software-Verifikationsplan

Anhang D –Software-Verifikationsreport

Quellenverzeichnis

Index

1Einleitung

Fast jeder fortgeschrittene Programmierer hat ein oder mehrere Bücher über Programmiersprachen und Software-Entwicklung gelesen. Bücher über das Testen von Software stehen aber weit weniger oft in den Regalen. Das liegt vermutlich unter anderem am hartnäckigen Gerücht, dass Testen von Software langweilig sei. Um diesem Gerücht entschieden entgegenzutreten, ist dieses Kapitel geschrieben worden. Es soll ein Appetitanreger auf die im Buch behandelten Testthemen sein, beschreibt die Eingliederung des Tests in den Software-Entwicklungsprozess und analysiert zunächst einmal den Feind: den Software-Fehler. Doch zuvor noch ein paar Worte zur Motivation des Software-Tests, zur Eingliederung dieses Buchs in andere Literatur und ein paar Definitionen.

1.1Motivation

Fehler in der Software eingebetteter Systeme können teure Rückholaktionen zur Folge haben. Selten ist es den Anbietern von eingebetteten Systemen möglich, einfach einen Bugfix per E-Mail zu verschicken und wieder dem Tagesgeschäft nachzugehen. Daher sollte man in Branchen mit hoher Anforderung an die Software-Integrität erstens besonders bedacht sein, Software-Fehler zu vermeiden, und zweitens, gemachte Fehler zu erkennen. Punkt eins zielt auf die Prozesslandschaft, die Qualifikation der Mitarbeiter und die Unternehmensstruktur ab. Er betrachtet also, wie sehr das Talent oder – viel wichtiger – das fehlende Talent eines Mitarbeiters die Qualität des Produkts beeinflussen kann. Punkt zwei heißt, die Software und begleitende Dokumente sorgfältig zu verifizieren. Solche Dokumente können zum Beispiel die Anforderungsdefinition, Analysen der zu erwartenden CPU-Last oder das Design festhalten.

1.2Abgrenzung des Buchs zu ISTQB-Lehrplänen

Leider wurde lange Zeit nicht nur im deutschsprachigen Raum das Thema Verifikation von Software, wozu auch Testen gehört, wenig an Hochschulen gelehrt. Eine Konsequenz daraus ist, dass Vertreter der Industrie das International Software Testing Qualifications Board (ISTQB) ins Leben gerufen haben, das eine »Certified Tester«-Ausbildung definiert. Der Inhalt des vorliegenden Buchs deckt sich nicht mit den Lehrplänen des ISTQB. In diesem Buch werden Themen genauer als durch das ISTQB behandelt, wenn sie für Embedded-Software besonders wichtig sind, und es werden Methoden präsentiert, die für eingebettete Software wichtig sein können, sich aber zurzeit nicht in den ISTQB-Lehrplänen befinden. Ebenso werden Themen der ISTQB-Lehrpläne hier nicht behandelt, wenn sie nicht technischer Natur sind oder nur Multisysteme oder reine Business-Anwendungen betreffen.

Das Buch ist für Personen ohne Vorwissen aus dem Bereich Software-Testing geschrieben. Absolventen der ISTQB-Certified-Tester-Lehrgänge werden im vorliegenden Buch daher viel Bekanntes wiederfinden und aus oben beschriebenen Gründen trotzdem ebenso viel Neues erfahren.

1.3Zur Gliederung dieses Buchs

Die technischen Grundlagenkapitel dieses Buchs orientieren sich dabei am zeitlichen Verlauf eines Projekts. Das heißt, auch wenn das wichtigste Thema dieses Buchs der Test ist, handeln die ersten der folgenden Kapitel noch nicht vom Test, denn am Anfang eines Projekts gibt es zunächst noch keine Software, die man testen könnte. Wohl aber gibt es schon Dokumente (bei phasenorientierten Projekten) oder Vorgänge (bei agilen Vorgehensweisen), für die ein Tester einen Beitrag zur Software-Qualität leisten kann.

Kapitel 2 beschreibt, wie dieser Beitrag bei der Review von Anforderungstexten aussehen kann. Kapitel 3 beschreibt kurz die möglichen Verifikationsschritte beim Design. In den Kapiteln 4 und 5 wird beschrieben, wie Code-Reviews durchgeführt werden können und wie Werkzeuge funktionieren, die teilweise oder gänzlich automatisch Review-Aufgaben übernehmen können.

Dann erst geht es mit dem Testen los. In Kapitel 6 werden Unit-Tests, in Kapitel 7 Integrationstests und in Kapitel 8 Systemtests beschrieben. Bei Tests von Middleware können diese Teststufen alle stark verschwimmen, wie Kapitel 9 zeigt. Im Anschluss daran beschäftigt sich Kapitel 10 mit einer Art von Fehler, die nur durch Zufall in den zuvor beschriebenen Tests gefunden werden kann: Race Conditions. Das Kapitel zeigt, wie sich Data Races zuverlässig auffinden lassen, gefolgt von einem verwandten Thema: Kapitel 11 zeigt, wie sich Deadlocks automatisch auffinden lassen.

Das darauf folgende Kapitel 12 beschreibt Verfahren zur Bestimmung der maximalen Ausführungszeit von Code. Das Ergebnis kann ein wichtiger Beitrag für die Schedulability-Analyse sein, die in Kapitel 13 behandelt wird.

Spätestens nach diesem Kapitel hält sich die Reihung der weiteren Kapitel nicht mehr an den zeitlichen Verlauf eines Projekts. Die nun folgenden Kapitel sind auch weit weniger umfangreich. In Kapitel 14 wird die Hardware/Software-Interaktionsanalyse vorgestellt, die auf Produkt/System-Ebene stattfindet. Mit einem kurzen Kapitel 15 über modellbasierten Test und einem technischen Ausblick in Kapitel 16 verlässt das Buch das technische Terrain.

In Kapitel 17 werden Hinweise für das Testmanagement gegeben und Kapitel 18 beschreibt die Aufgaben und möglichen Vorgehensweisen des Qualitätsbeauftragten. Auch diese beiden Kapitel sind bewusst kurz gehalten und geben eher nützliche Tipps, als dass man lange Abhandlungen darin findet, denn zu diesen Themen gibt es jede Menge Spezialliteratur. Das Kapitel 19 widmet sich dem Thema Haftung: In welchem Maß ist ein Programmierer oder ein Tester für Fehler haftbar? Dort erfahren Sie es.

Die meisten Kapitel schließen mit einem Fragenkatalog und Übungsaufgaben zur Kontrolle des Lernziels. Am Ende des Buchs finden Sie Lösungen dazu und Quellenverzeichnisse für referenzierte Literatur.

1.4Die wichtigsten Begriffe kurz erklärt

1.4.1Definition von Fachbegriffen

Die ISO 29119-1 und das ISTQB-Glossary of Terms definieren eine ganze Reihe von Fachwörtern rund ums Testen. In Einzelfällen sind sie allerdings nicht übereinstimmend. Dabei ist zu erwarten, dass das ISTQB-Glossar früher oder später an die ISO 29119-1 angepasst wird. Wenn man in einem Unternehmen Dinge rund um das Thema Software-Qualität benennen möchte, ist man gut beraten, sich an diesen Definitionen zu orientieren. Das ISTQB-Glossar kann man im WWW nachschlagen, siehe [URL: ISTQB] für die englische Fassung und [URL: ISTBQ/D] für die deutschsprachige, die ISO-Norm ist kostenpflichtig.

Es ergibt nicht viel Sinn, diese Definitionen hier zu kopieren. Stattdessen enthält die folgende Aufstellung die wichtigsten Begriffe, die im vorliegenden Buch Verwendung finden, unmittelbar gefolgt von der Definition aus dem ISTQB-Glossar und einer kurzen Ergänzung:

Agile Software-Entwicklung ist eine auf iterativer und inkrementeller Entwicklung basierende Gruppe von Software-Entwicklungsmethoden, wobei sich Anforderungen und Lösungen durch die Zusammenarbeit von selbstorganisierenden funktionsübergreifenden Teams entwickeln.

Der mit großem Abstand bedeutendste Vertreter agiler Entwicklungsmodelle ist Scrum, gefolgt von Extreme Programming. Speziell in Projekten mit begrenzter Größe und nur vage definierten Anforderungen haben diese Entwicklungsmodelle ihre Berechtigung. Diese »agilen Methoden« kommen in Reinform ohne Projektleiter aus. Die Teams sind selbstorganisierend.

Audit: Ein unabhängiges Prüfen von Software-Produkten und -prozessen, um die Konformität mit Standards, Richtlinien, Spezifikationen und/oder Prozeduren basierend auf objektiven Kriterien zu bestimmen, einschließlich der Dokumente, die (1) die Gestaltung oder den Inhalt der zu erstellenden Produkte festlegen, (2) den Prozess der Erstellung der Produkte beschreiben (3) und spezifizieren, wie die Übereinstimmung mit den Standards und Richtlinien nachgewiesen beziehungsweise gemessen werden kann.

Ein Audit führt also ein externer Fachmann durch, der sich nicht nur das Produkt ansieht, sondern auch und vor allem den Entstehungsprozess des Produkts. Ein Auditor prüft, ob ein Unternehmen ein Prozessumfeld schafft, das die Wahrscheinlichkeit von guter (beziehungsweise angepasster) Software-Qualität maximiert.

Validierung ist die Bestätigung durch Bereitstellung eines objektiven Nachweises, dass die Anforderungen für einen spezifischen beabsichtigten Gebrauch oder eine spezifische beabsichtigte Anwendung erfüllt worden sind.

Wer diese Definition aus der deutschen Version des ISTQB-Software-Testing-Glossars beim ersten Durchlesen versteht, gewinnt einen Preis. Weiter auf Deutsch übersetzt könnte man sagen: Validierung bestätigt, dass das Produkt, so wie es vorliegt, seinen beabsichtigten Verwendungszweck erfüllen kann. Validierung stellt also sicher, dass »das richtige Ding erzeugt wird«. Etwas weniger streng definierte die nun abgelöste IEEE 829-2008 diesen Begriff und verstand Validierung einfach als Nachweis der Erfüllung der Anforderungen.

Verifikation ist die Bestätigung durch Bereitstellung eines objektiven Nachweises, dass festgelegte Anforderungen erfüllt worden sind.

Das IEEE Glossary of Software Engineering Terminology [IEEE 610.12] beschränkt den Begriff nicht auf Anforderungen, sondern bezieht ihn auf Entwicklungsphasen: »Verifikation ist die Prüfung eines Systems oder einer Komponente, mit dem Ziel zu bestimmen, ob die Produkte einer Entwicklungsphase die Vorgaben erfüllen, die zum Start der Phase auferlegt wurden.« Verifikation subsumiert gemäß IEEE also alle Techniken, die sicherstellen, dass man »das Ding richtig erzeugt«. Zu diesen Techniken gehören der Test des Produkts, Reviews, die Sicherstellung eines Zusammenhangs von Design, Anforderungen und Tests (Traceability) sowie Audits [PSS-05-0].

Im allgemeinen Sprachgebrauch kann man ein Ding nicht testen, das es noch nicht gibt. Das ISTQB-Glossar hat eine Definition des Begriffs Testen, der dem allgemeinen Sprachgebrauch widerspricht:

Test: Der Prozess, der aus allen Aktivitäten des Lebenszyklus besteht (sowohl statisch als auch dynamisch), die sich mit der Planung, Vorbereitung und Bewertung eines Software-Produkts und dazugehöriger Arbeitsergebnisse befassen. Ziel des Prozesses ist sicherzustellen, dass diese allen festgelegten Anforderungen genügen, dass sie ihren Zweck erfüllen, und etwaige Fehlerzustände zu finden.

Bei dieser Definition subsumiert der Begriff Test Aktivitäten, die in der älteren Definition von IEEE der Verifikation zugeordnet werden, und enthält auch Planungsschritte für das Software-Produkt. So weit gefasst ist dann fast alle Projektarbeit, außer der Produktentwicklung selbst, ein Test.

In diesem Buch wird, so wie bei der Definition von IEEE, dann vom Testgesprochen, wenn das Produkt Software, zumindest in Teilen, Gegenstand des Tests ist. Alle Schritte zur »Bewertung eines Software-Produkts und dazugehöriger Arbeitsergebnisse« davor werden aber nicht »Test« genannt, damit dem allgemeinen Sprachgebrauch und den IEEE-Standards nicht widersprochen wird.

Ansonsten entspricht die Verwendung von Fachwörtern in diesem Buch den Definitionen des ISTQB-Glossars und der ISO 29119-1. Und Hand aufs Herz: Ob man die Review dem Test (wie ISTQB) oder der Verifikation (wie IEEE) zuordnet, ist wohl weniger wichtig, als dass man sie ordentlich macht.

1.4.2Zu Definitionen und TesterInnen

Mit der Niederschrift der Definition der verwendeten Fachbegriffe zu Beginneines Dokuments sehen Sie eine Praxis, die auch im Umfeld der Software-Entwicklung gut aufgehoben ist und in einschlägigen Standards so empfohlen wird, zum Beispiel [IEEE 829]. Welche Zeitverschwendung, wenn Sie als Leser einen Begriff anders verstehen als der Autor, aber erst im Laufe des Lesens dahinter kommen und deshalb zum besseren Verständnis die ersten Passagen des Buchs noch einmal lesen müssen!

Apropos Missverständnis: Wenn in diesem Buch vom Beruf des Testers oder von anderen Rollen in der Software-Entwicklung gesprochen wird, so wird immer die männliche Form verwendet. Dies soll nur der Leserlichkeit dienen, aber in keiner Weise die Frauen diskriminieren. Ein Trost für alle Leserinnen: Wahre Top-Experten nennt man Koryphäen, auch wenn es Männer sind. Und zum Wort »Koryphäe« gibt es keine männliche Form.

1.5Ein Überblick über das Umfeld des Software-Testing

In diesem Teil der Einleitung wird das Umfeld des Software-Tests erörtert und ein Überblick über Möglichkeiten und Grenzen des Testens gegeben. Für das Verstehen der späteren Kapitel ist das Lesen nicht notwendig, weil große Teile von Abschnitt 1.5 redundant zum Inhalt der vertiefenden Kapitel sind. Lesern, die sich schon mit dem Thema Test auseinandergesetzt haben und die wissen, wie sie eine Brücke vom V-Modell zu agilen Methoden schlagen können, wird daher empfohlen, bei Kapitel 2 weiterzulesen.

Ohne Zweifel helfen die folgenden Seiten aber Neueinsteigern, die später vorgestellten Methoden im Software-Entwicklungsprozess besser einzuordnen. Und – wie gesagt – diese Seiten sind ein Appetitanreger auf das, was später noch im Buch behandelt wird.

Der Protagonist schlechthin im Umfeld des Software-Tests ist der Software-Fehler. Als Einstieg in das Thema Testen werden wir daher zunächst seine möglichen Ursachen untersuchen.

1.5.1Ursachen von Software-Fehlern

Warum hat Software überhaupt Fehler? Die einfachste Antwort auf diese Frage ist, dass Software von Menschen geschrieben wird, und Menschen machen nun einmal Fehler. Wenn die Antwort auf eine komplexe Frage sehr einfach ist, dann übersieht sie meistens viele Facetten des zugrunde liegenden Problems. So auch in diesem Fall. Viele Software-Fehler, die sehr viel Geld kosteten, waren alles andere als einfache Programmierfehler. Die folgende Aufzählung skizziert einige typische, aber sehr unterschiedliche Ursachen für Fehler in Software.

Ein Software-Fehler hat also viele verschiedene Ursachen. Tests sind nur geeignet, klassische Programmier- und Designfehler zu finden und sind bei allen, bis auf die letztgenannte Fehlerursache ein vergleichsweise wirkungsloses Instrument. Wenn zum Beispiel ein Kommunikationsproblem vorliegt und daher gegen eine falsche Anforderungsspezifikation getestet wird, dann nützt der gewissenhafteste Test nichts. Bis auf den Programmierfehler kann man aber allen anderen genannten Fehlerursachen durch Methoden des Managements begegnen.

Mit dem Wissen, dass Testen nur eine von vielen Maßnahmen im Kampf gegen Software-Fehler ist, nehmen wir nun den Programmierfehler, den Software-»Bug«, genauer ins Visier und erörtern, warum es so schwierig ist, alle Bugs zu finden. Die Bezeichnung Bug stammt übrigens laut Gerüchteküche von einer Motte, die auf einer Speicherplatine des Computers eines Zerstörers der US-Navy landete. Der resultierende Kurzschluss grillte nicht nur das unglückliche Insekt, sondern führte auch zu einer Fehlfunktion des Computers. Seitdem werden Software-Fehler nach dem Insekt benannt.

1.5.2Warum Programmfehler nicht entdeckt werden

Vielen Software-Entwicklern ist Folgendes nicht unbekannt: Der Kunde meldet einen Programmierfehler, obwohl unzählige Stunden mit gewissenhafter Code-Review verbracht wurden, obwohl tagelang getestet wurde. Wie konnte dieser Fehler unbemerkt das Haus verlassen?

Unter der Annahme, dass sich der Kunde nicht irrt, kann einer der folgenden Punkte diese Frage beantworten:

Software wird fast nie zu 100 % getestet. Das gilt auch für sicherheitskritische Anwendungen. [Hayhurst 01Kapitel 6