Welche zwei Möglichkeiten zur Überprüfung von Software gibt es? Erläutere sie.
Formale Verifikation: Algorithmische Beweisführung der Korrektheit für alle Situationen
Test: Explorative Untersuchung auf Fehlerfreiheit für bestimmte Situationen
In welche zwei Verfahren kann ein Softwaretest bezüglich der Ausführung aufgeteilt werden. Erläutere sie kurz und nenne je ein Beispiel.
Statische Testverfahren: Quellcode wird untersucht, aber nicht ausgeführt
Beispiele: Syntaxprüfung durch Parser, Code-Review durch Entwickler
Dynamische Testverfahren: Quellcode wird ausgeführt
Beispiele: Zustandserkennung durch Logger, Gesteuerte Ausführung durch Debugger, Ergebnisvergleich durch Tests
In welche zwei Tests können Softwaretests bezüglich des Testobjekts aufgeteilt werden?
Komponententests: Untersuchung der Fehlerfreiheit einzelner Module (Klassen etc.)
Integrationstests: Untersuchung der fehlerfreien Zusammenarbeit mehrerer Module als Gesamtsystem
Durch welches Tool kann man Softwaretests in Eclipse durchführen?
JUnit
Wie läuft ein Test mit JUnit ab?
Tests einzelner Methode einer Klasse (Komponententestverfahren)
Ausführung von Methoden der Klasse (Dynamisches Testverfahren)
Vergleich von erwartetem und erreichtem Ergebnis
Was sind die wesentlichen Eigenschaften von JUnit 4?
Sammlung von Werkzeugen zur Vorbereitung, Durchführung und Nachbereitung von Tests
Bereitstellung von Annotationen zur Definition von Testmethoden
Bereitstellung von Methoden für Testauswertung („Assert“)
Standardmäßig in Eclipse eingebunden
Wie kann man eine Klasse zum Testen in Eclipse anlegen? Was ist dabei zu beachten.
Assistentengestützte Erstellung der Testklasse mittels Datei... - Neu... - JUnit-Testfall
Namenskonvention für Testklassen: Klassenname mit nachgestelltem Test
Wie kann man eine Methode testen? Was kann die Testmethode?
Testmethode wird in Java implementiert und kann die Java-Fähigkeiten nutzen
Namenskonvention für Testmethoden: Methodenname mit nachgestellter Angabe der Situation und erwartetem Ergebnis
Kennzeichnung von Testmethoden: Annotation @Test vor Methodensignatur
Beschreibung und Prüfung des erwarteten Ergebnisses: Methoden aus org.junit.Assert.assert...
org.junit.Assert.* importieren
Wie sind geeignete Testfälle zu wählen?
Testfälle decken fast nie alle möglichen Parameterkombinationen ab
Testfälle sollen für eine bestimmte Klasse von Parameterkombinationen repräsentativ sein
Testfälle repräsentieren Äquivalenzklassen
Testfälle sollen „normale“ und „unnormale“ Parameterkombinationen abdecken
Testfälle sollen möglichst alle Teile der zu testenden Methode testen
Wie funktioniert die Bildung von Äquivalenzklassen und Erzeugen von Testfällen?
abstrakte Testfälle erzeugen
zum Beispiel positive Werte, negative Werte, …
einige Möglichkeiten der Aufteilung:
Positive Ganzzahl
Negative Ganzzahl
Numerischer Nullwert
Fließkommazahl
Null
Einzelnes Zeichen (char)
Zeichenkette
. . .
Wie definieren sich geeignete Testfälle?
Testfälle aus mittlerem Bereich jeder Äquivalenzklasse
Testfälle aus Extremwerten jeder Äquivalenzklasse
Testfälle mit zu großen und zu kleinen Werte
Testfälle mit ungültigen Parametern, die die Methode nicht unterbrechen
Testfälle mit ungültigen Parametern, die die Methode unterbrechen
Wie kann man Tests vorbereiten? Also zum Beispiel Umgebungen initialisieren oder Objekte instanziieren?
Einmalig vor Ausführung der Testklasse:
@BeforeClass public static void setUpBeforeClass()
Wird einmal vor der Ausführung der gesamten Klasse ausgeführt
Vor Ausführung jeder Testmethode:
@Before public void setUp()
Wird vor jeder neuen Testmethode erneut ausgeführt
Wie kann man Tests nachbereiten? Also zum Beispiel Referenzen aufheben?
Dereferenzierung…
Einmalig nach Ausführung der Testklasse:
@AfterClass public static void tearDownAfterClass()
Wird einmal nach Ausführung der gesamten Klasse durchgeführt
Nach Ausführung jeder Testmethode:
@After public void tearDown()
Nach jeder Methode wird es erneut durchgeführt
Auf welche Arten kann ein Test fehlschlagen?
Tests können unerwartet fehlschlagen
Tests können erwartet fehlschlagen und eine Exception erzeugen
Wie funktioniert ein Test mit erwarteter Exception?
Test mit erwarteter Exception soll als bestanden gelten
Einrichtung von Testfällen mit Angabe der Erwartung mittels expected-Parameter
Wie funktioniert ein Test mit Ausführungszeitbeschränkung?
Tests haben eine Ausführungszeit
Ausführungszeit bei korrekten Programmen endlich
Problem bei inkorrekten Programmen mit Endlosschleifen
Ausführungszeitbeschränkung mittels timeout-Parameter in Millisekunden
Wie funktionieren Testsuites?
Anlegen einer Testsuite(klasse) mit Informationen zu Testklassen
Namenskonvention: Name des Packages mit nachgestelltem TestSuite
Festlegen von TestRunner und zu testenden Klassen
@RunWith(Suite.class)
@SuiteClasses({Testklasse1.class, Testklasse2.class})
Mit was können Überdeckungstests durchgeführt werden?
EclEmma
Was sind Überdeckungstests?
Jeder Teil der Testmethode soll getestet werden
Festlegung von Testfällen
Manuelle Kontrolle der Überdeckung aufwändig
Automatische Kontrolle der Überdeckung möglich
Wie wird EclEmma für Überdeckungstests genutzt?
Ausführung als eigene Ausführungskonfiguration in Eclipse
Zeilengenaue Protokollierung während der Ausführung
Anzeige der Ergebnisse durch farbige Hinterlegung der Zeilen
Anzeige der Ergebnisse methodengenau durch prozentuale Angaben
Welche Gründe für Versionierung bestehen für Einzelpersonen?
▶ Entwicklung von Softwareprodukten ist großteils iterativ
▶ Iterationen führen zu unterschiedlichen Entwicklungsständen
▶ Wunsch: Historie der Entwicklungsstände sollte nachvollziehbar sein
▶ Wunsch: Entwicklungsstände sollten wiederhergestellt werden können
Welche Gründe für Versionierung bestehen für Gruppen?
▶ Entwicklung von Softwareprodukten ist kollaborativ
▶ Wunsch: Entwicklungsstände zentral bereitstellen
▶ Wunsch: Entwicklungsstände einheitlich benennen
▶ Wunsch: Parallele Entwicklungen ermöglichen
Wie erfolgt die Bezeichnung verschiedener Versionen?
▶ Bezeichnungsschema von Entwicklungsständen, oft in aufsteigender Reihenfolge
▶ Bezeichnungsschema fast ausschließlich numerisch und oft hierarchisch gegliedert
▶ Beispiel für Bezeichnungsschema: „Semantic Versioning“ (https://semver.org/)
▶ Entwicklungsstände werden als Versionen oder Revisionen bezeichnet
In Modul M7: Versionen für Gesamtprodukte, Revisionen für einzelne Komponenten
Was können Revisionsverwaltungssysteme?
Werkzeuge zur zentralen Verwaltung von Ressourcen
▶ Vergeben von Revisionsbezeichnungen und Zusammenfassung zu Versionen
▶ Aufbewahren historischer Zwischenstände mit Vergleich der Stände
▶ Vermeiden von Konflikten bei mehreren Bearbeitern, wenn möglich
▶ Lösen von Konflikten bei mehreren Bearbeitern
▶ Abtrennen und Zusammenführen von Entwicklungszweigen
Was ist Subversion (SVN)?
▶ Lokales und Client-Server-fähiges Revisionsverwaltungssystem
▶ SVN in verschiedenen Implementierungen verfügbar
▶ Zugriff über Dateisystem, SVN-Protokoll oder WebDAV (HTTP) ▶ Zugriff über SVN-Browser oder Einbindung in andere Software (Dateimanager, IDE)
Wie funktioniert die Datenhaltung in SVN?
▶ Zentrale Speicherung erfolgt in Repository
▶ Repository speichert Differenzen zur Vorversion
▶ Entwicklung findet nicht im Repository statt
▶ Verwendung von Arbeitskopien
Was ist TortoiseSVN? Wo wird es genutzt?
▶ SVN-Client für Windows mit Einbindung in Explorer
▶ Nutzen der Arbeitskopie über Kontextmenü des Explorers
▶ Durchsuchen des Repositorys mittels TortoiseSVN-Browser
▶ Zusammenführen bei Konflikten mittels TortoiseMerge
Wie nutzt man SVN in Eclipse?
▶ SVN-Integration nicht Teil der Standardinstallation
▶ SVN-Integration mittels Plugin nachrüstbar
▶ Unterschiedliche Plugins verfügbar (Subversive SVN, Subclipse, . . . )
Was macht man für eine Repository-Verbindung in SVN?
▶ Erstellen eines eigenen lokalen Repositorys
Welche Schritte gibt es beim Datenaustausch mit Repository durch SVN?
▶ Importieren eines Ausgangsstandes (Import)
▶ Auschecken des aktuellen Standes (Checkout)
▶ Aktualisieren auf neueren Stand (Update)
▶ Einchecken des bearbeiteten Standes (Commit)
Was sind Konflikte in SVN?
▶ Konflikte werden zwischen Repository und Arbeitskopie erkannt
▶ Voraussetzung: Beide Versionen wurden verändert
▶ Lösungsmöglichkeit: Überschreiben einer Version
▶ Lösungsmöglichkeit: Zusammenführen der Änderungen (Merge)
▶ Zeilenweises Zusammenführen, nicht für alle Dateitypen möglich
Wie werden Konflikte behandelt?
▶ Teilweise automatische Konfliktbehandlung
▶ Konfliktlösung durch Zusammenführen der Änderungen (teilweise automatisch)
▶ Konfliktlösung durch Festlegen der zu erhaltenden Version
Wie werden Versionen in SVN behandelt?
▶ Vergeben eines Namens für eine Revision (Tagging)
▶ Kein nachträgliches Verändern dieser Revision vorgesehen
Was sind Entwicklungszweige in SVN?
▶ Entwicklungszweige verwalten parallele Weiterentwicklungen ▶ Entwicklungszweige haben gemeinsamen Ausgangspunkt
▶ Entwicklungszweige lassen sich zusammenführen
Wie werden Entwicklungszweige verwaltet?
▶ Anlegen eines Entwicklungszweiges (Branch)
▶ Wechseln zwischen Entwicklungszweigen (Switch)
▶ Zusammenführen von Entwicklungszweigen (Merge)
▶ Konfliktbehandlung beim Zusammenführen
Welche Gründe gibt es für Automatisierung bei Softwareentwicklung?
▶ Softwareentwicklung endet nicht beim Codieren
▶ Zusätzliche Tätigkeiten wie Linken, Kompilieren, Testen, Paketieren, Einsetzen
▶ Tätigkeiten werden wiederholt ausgeführt
Wie läuft die Automatisierung der Softwareentwicklung ab?
▶ Festlegen und Konfigurieren der auszuführenden Schritte (Pipeline)
▶ Festlegen von Startbedingungen (Trigger)
▶ Ausführen der Schritte mit Erfolgsüberwachung (Build)
▶ Optional: Weiterverarbeiten der Ergebnisse
→ Continuous Integration, optional Continuous Delivery/Continuous Deployment
Welche Werkzeuge zur Automatisierung bei Softwareentwicklung gibt es?
▶ Lokale Build-Werkzeuge: Maven (Java), Ant (Java), make (Unix), . . .
▶ Zentrale Build-Werkzeuge: Jenkins, Travis CI, Azure DevOps Server, . . .
Was ist Jenkins als CI-Plattform?
▶ Modulares System mit Pipeline-Definition und -Ausführung als Kern
▶ Vorbereitung, Durchführung und Nachbereitung von Builds
▶ Builds in der Regel durch Trigger automatisiert ablaufend
▶ Überwachung und Auswertung der Build-Vorgänge
▶ Weiterverarbeitung der Ergebnisse
Zuletzt geändertvor 2 Jahren