| Teil einer Serie über |
| Softwareentwicklung |
|---|
Regressionstests (selten auch Nicht-Regressionstests [ 1 ] ) sind die erneute Ausführung funktionaler und nicht-funktionaler Tests, um sicherzustellen, dass zuvor entwickelte und getestete Software nach einer Änderung weiterhin wie erwartet funktioniert. [ 2 ] Andernfalls spricht man von einer Regression .
Änderungen, die Regressionstests erfordern können, umfassen Fehlerbehebungen , Softwareerweiterungen, Konfigurationsänderungen und sogar den Austausch elektronischer Bauteile ( Hardware ). [ 3 ] Da die Regressionstest -Suites mit jedem gefundenen Fehler tendenziell anwachsen, kommt häufig Testautomatisierung zum Einsatz. Manchmal wird eine Änderungsfolgenanalyse durchgeführt, um eine geeignete Teilmenge von Tests zu bestimmen ( Nicht-Regressionsanalyse [ 4 ] ).
Hintergrund
Wenn Software aktualisiert, geändert oder auf einem modifizierten Zielsystem wiederverwendet wird, kommt es häufig zum Auftreten neuer Fehler und/oder zum Wiederauftreten alter Fehler.
Manchmal tritt ein Fehler erneut auf, weil eine Fehlerbehebung durch mangelhafte Versionskontrolle (oder einfache menschliche Fehler bei der Versionskontrolle) verloren geht. Oft ist eine Fehlerbehebung „ fragil “, da sie das Problem zwar im speziellen Fall, in dem es zuerst auftrat, behebt, nicht aber in allgemeineren Fällen, die im Laufe der Softwarelebensdauer auftreten können. Häufig verursacht eine Fehlerbehebung in einem Bereich unbeabsichtigt einen Softwarefehler in einem anderen Bereich.
Es kann vorkommen, dass bei der Überarbeitung einer Funktion dieselben Fehler wie bei der ursprünglichen Implementierung auch in der überarbeiteten Version auftreten. In den meisten Softwareentwicklungssituationen gilt es als gute Programmierpraxis , nach dem Auffinden und Beheben eines Fehlers einen Test zu erstellen, der den Fehler aufdeckt, und diesen Test nach jeder weiteren Programmänderung regelmäßig erneut auszuführen. [ 5 ]
Obwohl dies auch manuell mithilfe von Programmiertechniken erfolgen kann , werden häufig automatisierte Testwerkzeuge eingesetzt . [ 6 ] Eine solche Testsuite enthält Softwarewerkzeuge, die es der Testumgebung ermöglichen, alle Regressionstestfälle automatisch auszuführen . Viele Projekte nutzen automatisierte Continuous-Integration -Systeme, um alle Regressionstests in festgelegten Intervallen erneut auszuführen und etwaige Fehler zu melden (die auf eine Regression oder einen veralteten Test hindeuten könnten). [ 7 ]
Gängige Strategien sind, ein solches System nach jeder erfolgreichen Kompilierung (bei kleinen Projekten), jede Nacht oder einmal pro Woche auszuführen. Diese Strategien können durch ein externes Tool automatisiert werden. [ 8 ]
Regressionstests sind ein integraler Bestandteil der Softwareentwicklungsmethode Extreme Programming (EP ). [ 9 ] Bei dieser Methode werden Designdokumente durch umfangreiche, wiederholbare und automatisierte Tests des gesamten Softwarepakets in jeder Phase des Softwareentwicklungsprozesses ersetzt . Regressionstests werden nach Abschluss der Funktionstests durchgeführt, um zu überprüfen, ob die übrigen Funktionen funktionieren.
In der Unternehmenswelt wurde Regressionstesting traditionell von einem Software-Qualitätssicherungsteam durchgeführt , nachdem das Entwicklungsteam seine Arbeit abgeschlossen hatte. Allerdings sind die in dieser Phase gefundenen Fehler am kostspieligsten zu beheben. Dieses Problem wird durch den zunehmenden Einsatz von Unit-Tests angegangen . Obwohl Entwickler schon immer im Rahmen des Entwicklungszyklus Testfälle geschrieben haben, handelte es sich dabei in der Regel entweder um Funktionstests oder um Unit-Tests , die lediglich die beabsichtigten Ergebnisse überprüften. Entwicklertests zwingen Entwickler dazu, sich auf Unit-Tests zu konzentrieren und sowohl positive als auch negative Testfälle einzubeziehen. [ 10 ]
Techniken
Die verschiedenen Regressionstestverfahren sind:
Alle Tests wiederholen
Diese Technik prüft alle Testfälle des aktuellen Programms auf seine Integrität. Obwohl sie aufwändig ist, da alle Testfälle erneut ausgeführt werden müssen, stellt sie sicher, dass keine Fehler aufgrund des geänderten Codes auftreten. [ 11 ]
Auswahl des Regressionstests
Im Gegensatz zur Methode „Alles erneut testen“ wird bei dieser Technik nur ein Teil der Testsuite ausgeführt (aufgrund der Kosten der Methode „Alles erneut testen“), wenn die Kosten für die Auswahl dieses Teils der Testsuite geringer sind als die Kosten der Methode „Alles erneut testen“. [ 11 ]
Priorisierung von Testfällen
Die Testfälle sollten priorisiert werden, um die Fehlererkennungsrate einer Testsuite zu erhöhen. Techniken zur Testfallpriorisierung planen die Testfälle so, dass die Testfälle mit höherer Priorität vor den Testfällen mit niedrigerer Priorität ausgeführt werden. [ 11 ]
Arten der Testfallpriorisierung
- Allgemeine Priorisierung – Priorisieren Sie Testfälle, die in späteren Versionen von Vorteil sein werden.
- Versionsspezifische Priorisierung – Testfälle werden in Bezug auf eine bestimmte Softwareversion priorisiert.
Hybrid
Diese Technik ist eine Kombination aus Regressionstestauswahl und Testfallpriorisierung. [ 11 ]
Vor- und Nachteile
Regressionstests werden durchgeführt, wenn Änderungen an der bestehenden Funktionalität der Software vorgenommen oder Fehler behoben werden. Regressionstests können auf verschiedene Weisen durchgeführt werden; ein umfassender Testansatz gewährleistet, dass die vorgenommenen Änderungen die bestehenden, unveränderten Funktionalitäten nicht beeinträchtigt haben. [ 12 ]
In der agilen Softwareentwicklung – wo die Softwareentwicklungszyklen sehr kurz, die Ressourcen knapp und die Softwareänderungen sehr häufig sind – kann Regressionstesting einen erheblichen unnötigen Mehraufwand verursachen . [ 12 ]
In einer Softwareentwicklungsumgebung, die häufig Black-Box- Komponenten von Drittanbietern verwendet, kann die Durchführung von Regressionstests schwierig sein, da jede Änderung an der Drittanbieterkomponente das restliche System beeinträchtigen kann (und die Durchführung von Regressionstests an einer Drittanbieterkomponente ist schwierig, da es sich um eine unbekannte Entität handelt). [ 12 ]
Verwendung
Regressionstests dienen nicht nur der Überprüfung der Korrektheit eines Programms, sondern häufig auch der Überwachung der Qualität seiner Ausgabe. [ 13 ] Beispielsweise könnten Regressionstests bei der Entwicklung eines Compilers die Codegröße sowie die Kompilierungs- und Ausführungszeit der Testfälle erfassen.
Aufgrund des Auftretens neuer Fehler erfordert die Programmwartung deutlich mehr Systemtests pro geschriebener Anweisung als jede andere Programmieraufgabe. Theoretisch müsste nach jeder Fehlerbehebung der gesamte zuvor ausgeführte Testfallsatz erneut getestet werden, um sicherzustellen, dass das System nicht auf unerklärliche Weise beschädigt wurde. In der Praxis muss ein solcher Regressionstest diesem theoretischen Ideal zwar annähernd entsprechen, ist aber sehr kostspielig.
— Fred Brooks , Der Mythos des Mannmonats , S. 122
Regressionstests können auf jeder Ebene durchgeführt werden, von Unit-Tests bis hin zur Systemintegration . Funktionstests prüfen das gesamte Programm mit verschiedenen Eingaben. Diese Tests werden aufgrund der Notwendigkeit der Wiederholung häufig automatisiert und können mit Testwerkzeugen durchgeführt werden, die nicht Teil der Compiler-Suite sind. Nicht-funktionale Tests bewerten Aspekte wie Leistung, Sicherheit oder Zuverlässigkeit. Die Durchführung nicht-funktionaler Regressionstests stellt zusätzliche Herausforderungen dar. Beispielsweise ist die Erkennung von Leistungsänderungen oft statistisch komplex [ 14 ] , während Sicherheitsprobleme typischerweise eher auf Schwachstellen im Software-Ökosystem als auf einzelne Codeänderungen zurückzuführen sind [ 15 ] .
Referenzen
- ^ Pezzè, Mauro; Young, Michal (2008). Software Testing and Analysis: Process, Principles, and Techniques . Wiley.
Testaktivitäten, die sich auf Regressionsprobleme konzentrieren, werden als (Nicht-)Regressionstests bezeichnet. Üblicherweise wird „Nicht“ weggelassen.
- ^ Basu, Anirban (2015). Software Quality Assurance, Testing and Metrics . PHI Learning. ISBN 978-81-203-5068-7Die
- ^ National Research Council Committee on Aging Avionics in Military Aircraft: Aging Avionics in Military Aircraft . The National Academies Press, 2001, Seite 2: „Jeder Technologieerneuerungszyklus erfordert Regressionstests.“
- ^ Boulanger, Jean-Louis (2015). CENELEC 50128 und IEC 62279 Normen . Wiley. ISBN 978-1-119-12248-7Die
- ^ Kolawa, Adam; Huizinga, Dorota (2007). Automatisierte Fehlervermeidung: Bewährte Verfahren im Softwaremanagement . Wiley-IEEE Computer Society Press. S. 73. ISBN 978-0-470-04212-0Archiviert vom Original am 25.04.2012 . Abgerufen am 20.07.2010 .
- ^ Regressionstests nach Möglichkeit automatisieren , Automatisiertes Testen: Ausgewählte Best Practices, Elfriede Dustin, Safari Books Online
- ^ daVeiga, Nada (06.02.2008). „Code ohne Angst ändern: Nutzen Sie ein Regressions-Sicherheitsnetz“ . Dr. Dobbs Tagebuch .
- Memon , A.; Banerjee, I.; Hashmi, N.; Nagarajan, A. (2003). „DART: Ein Framework für Regressionstests von „Nightly/Daily Builds“ von GUI-Anwendungen“ . International Conference on Software Maintenance : 410–419 . doi : 10.1109/icsm.2003.1235451 . Abgerufen am 13.06.2026 .
- ^ Andrea, Jennitta (2007). „Visioning the Next-Generation of Functional Testing Tools“ . IEEE Software . 24 (3): 58–66 . doi : 10.1109/MS.2007.73 . ISSN 0740-7459 .
- ^ Dudney, Bill (08.12.2004). „Entwicklertests sind im Trend: Ein Interview mit Alberto Savoia und Kent Beck“ . Abgerufen am 29.11.2007 .
- ^ a b c d Duggal, Gaurav; Suri, Bharti (29.03.2008). Understanding Regression Testing Techniques . National Conference on Challenges and Opportunities. Mandi Gobindgarh, Punjab, Indien. CiteSeerX 10.1.1.460.5875 .
- ^ a b c Yoo, S.; Harman, M. (2010). „Regressionstestminimierung, -auswahl und -priorisierung: eine Übersicht“. Software Testing, Verification and Reliability . 22 (2): 67–120 . doi : 10.1002/stvr.430 .
- ^ Kolawa, Adam . "Regressionstests von Programmierer zu Programmierer" . Wrox .
- Reichelt , DG; Kühne, S.; Hasselbring, W. (2022). „Automatisierte Identifizierung von Leistungsänderungen auf Codeebene“. 2022 IEEE 22nd International Conference on Software Quality, Reliability and Security (QRS) . IEEE. S. 916–925 . arXiv : 2303.14256 . doi : 10.1109/QRS57517.2022.00096 .
- ^ Rajapakse, RN; Zahedi, M.; Babar, MA; Shen, H. (2022). „Herausforderungen und Lösungen bei der Einführung von DevSecOps: Eine systematische Übersicht“. Information and Software Technology . 141 106700. doi : 10.1016/j.infsof.2021.106700 .