Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten - Teil 2 - isento

Die Seite wird erstellt Nepomuk Nowak
 
WEITER LESEN
Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten - Teil 2 - isento
Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten – Teil 2

www.architecture4testability.com
www.imbus.de/veranstaltungen/trends-in-testing-2015/

                Architektur und Testbarkeit:
                 Eine Checkliste (nicht nur)
              für Softwarearchitekten – Teil 2
  Im ersten Teil dieses Artikels, erschienen in der letzten Ausgabe von OBJEKTspektrum, haben wir motiviert,
    welchen Nutzen eine Checkliste mit konkreten Testbarkeitsanforderungen und zugehörigen Architektur-
  empfehlungen im Projektalltag hat, und den Begriff „(technische) Testbarkeit“ geschärft. Zentrale Elemente
 dabei waren die ISTQB-Begriffe „Point of Control“ bzw. „Point of Observation“ sowie die allgemeine Testfall-
    Definition (Abbildung 1). Aus dieser abgeleitet haben wir den ersten Bereich der Checkliste zum Thema
   „Startzustand und Vorbedingungen herstellen“ entwickelt (Tabelle 1). Analog werden wir nun die Bereiche
   „Eingaben ins SUT vornehmen“, „Ausgaben des SUT prüfen“ und „Nachbedingungen prüfen“ behandeln.

Eingaben ins SUT vornehmen                     2. Datenbank befüllen                            klariert) und kann in meisten Fällen durch
                                               Manche Vorbedingungen oder auch Ein-             Architektur anders angesiedelt werden,
1. UI-Objekte erkennen und bedienen            gaben ins SUT finden am besten direkt in         vorzugsweise direkt im SUT.
Automatisierte System- und Akzeptanztests      Datenbank-Tabellen statt (z. B. Flags zur
benutzen meistens die Benutzungsoberflä-       Simulation, etwa von Gesperrt-Zuständen).        3. Andere Schnittstellen befüllen
che (GUI) als Eingabeschnittstelle. Für eine   Viele Architekten finden es ausreichend,         Neben GUI und Datenbank kann ein Test-
nachhaltige Automatisierung mit kontrol-       wenn eine Persistenzschicht definiert, quali-    objekt über weitere spezifische Schnittstel-
lierbaren Wartungskosten ist es unerläss-      tätsgesichert und ausreichend dokumentiert       len verfügen, in die zu Testzwecken Einga-
lich, dass die UI-Entwicklung von Anfang       wird – die Datenbankschema-Definition            ben vorgenommen werden müssen.
an eine robuste Objekterkennung gewähr-        wird nur noch generiert. Dabei ist es aber       Die flexible Anbindung von externen
leistet, da anderenfalls die Anpassungsauf-    wichtig zu beachten, dass der Generator          Schnittstellen ist immer ein wichtiger As-
wände in der Testautomatisierung rasch         durch mehrere Parameter gesteuert wird           pekt in der Entwicklung. Einerseits ist es
überhand nehmen können.                        und ein Austausch des Generators Änderun-        unabdingbar, möglichst nah an der frem-
Die Aufgabe des Architekten in diesem          gen in der Schemadefinition zur Folge haben      den Schnittstellenspezifikation zu bleiben,
Zusammenhang ist einerseits die Prüfung,       kann. Um die nötige Stabilität im Projekt zu     andererseits erzeugen Änderungen in der
ob die einzelnen Entwickleraufgaben (z. B.     gewährleisten und die Dokumentation der          Implementierung der externen Schnittstel-
User-Storys oder Use-Cases) so geschnitten     Datenbankschema-Definition für alle zu-          len, sofern diese überhaupt bereits fertigge-
und verteilt werden können, dass die Ober-     gänglich und verständlich zu gestalten, soll-    stellt sind, unnötige Störungen im Verlauf.
flächenstruktur eine gewisse Beständigkeit     ten Datenbankschemata in einem separaten,        Aus Architektursicht ist es empfehlenswert,
hat. Andererseits muss der Architekt über-     abstrakten Modell definiert werden. Hier-        die Fremdschnittstellen nach Möglichkeit
prüfen, ob die eingesetzte Technologie von     für sind sowohl grafische, als auch XML-         zu kapseln und selbst implementierte oder
dem Testframework unterstützt wird und         basierte Modellierungswerkzeuge, wie z.B.        extern bereitgestellte, aber stabile Mock-
die eventuell zur Laufzeit generierten Ele-    „Liquibase“, gut geeignet. Durch eine ex-        Ups zu nutzen. Die Nutzung der Mock-Ups
ment-IDs für die gleichen Elemente auch        terne Schemadefinition hat der Tester dann       muss transparent für den Entwickler erfol-
immer gleich bleiben – sich also insbeson-     die Möglichkeit, auf eine gültige, verständli-   gen und lediglich von der Konfiguration
dere nicht ändern, wenn das Element in der     che Dokumentation zuzugreifen und eigene         abhängig sein – diese Anforderung legt es
Oberfläche minimal verschoben wird. Viele      Skripte und Werkzeuge daran auszurichten.        nahe, dem Gesamtsystem ein Framework zu
Technologien, die Oberflächen-Artefakte        Funktionalität, die in Datenbanksystemen         Grunde zu legen, das über die Konfigurati-
generieren (z. B. aus einem Objekt- oder       realisiert wird (z. B. Trigger und Stored        on die Anbindung/Bereitstellung und Nut-
Datenmodell), bieten keine Möglichkeit,        Procedures), erschwert den Test (nebenbei        zung der Module/Schnittstellen erlaubt (vgl.
solche konstanten IDs zu erzeugen.             wird das Datenbanksystem zum SUT de-             TU-Abstraktionsschicht in Abbildung 2).
Sollte die im Projekt definierte Technologie
es erlauben, die IDs für die Oberflächenele-
mente selbst zu definieren, muss im Entwick-
lungsteam klar kommuniziert werden, dass
diese IDs eine besondere Bedeutung haben
und nicht ohne Grund geändert werden dür-
fen. Maßnahmen zur Einhaltung sind: Klare
Kommunikation der Auswirkungen der Än-
derung an die Entwickler, regelmäßige Re-
views, statische Code-QS mit der Überprü-
fung, ob die IDs wie definiert gesetzt sind.   Abb. 1: Genereller Aufbau eines Testfalls.

72
Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten - Teil 2 - isento
www.objektspektrum.de

                                                                                            onsschicht (z. B. JPA in JEE-Applikationen)
                                                                                            die Unit-Tests die Datenbankzugriffe mit-
                                                                                            testen sollten oder nicht. Grundsätzlich gilt,
                                                                                            dass die Abstraktionsschicht eine bereits
                                                                                            vielfach getestete Komponente darstellt
                                                                                            und ihre Funktionalität nicht mehr getestet
                                                                                            werden muss. Das bedeutet, dass es aus-
                                                                                            reicht, beim Persistieren von Daten via Ab-
                                                                                            straktionsschicht wieder über die Abstrak-
                                                                                            tionsschicht zu überprüfen, ob diese Daten
                                                                                            korrekt persistiert wurden. Die alternative
                                                                                            Vorgehensweise – Überprüfung der erfolg-
                                                                                            ten Persistierung der Daten direkt in der
                                                                                            Datenbank (ohne die Abstraktionsschicht)
                                                                                            – wird nicht empfohlen, da dies die Unit-
                                                                                            Tests abhängig von der Infrastruktur macht
                                                                                            und ihre Portierung mit zusätzlichem Auf-
                                                                                            wand verbunden ist.
                                                                                            In speziellen Fällen ist es aber unabdingbar,
                                                                                            Daten direkt in der Datenbank zu überprü-
                                                                                            fen – sei es das Testen der Konfiguration
Abb. 2: Testbegriffe aus der Architektur-Perspektive.                                       der Caching-Mechanismen oder der Konfi-
                                                                                            guration der Abstraktionsschicht selbst: In
Frameworks mit Dependency-Injection-Un-        welche Applikationsmodule welche Pakete      jedem Projekt müssen entsprechende Tests
terstützung und Inversion of Control bieten    importieren bzw. nutzen (siehe Tabelle 2).   definiert sein. Damit die enge Bindung an
hier hervorragende Unterstützungsmecha-                                                     die Datenbank nicht zum Nachteil wird,
nismen, insbesondere auch wegen der Au-        Ausgaben des SUT prüfen                      wird empfohlen, spezielle Werkzeuge ein-
tomatisierbarkeit der Konfigurationseinstel-                                                zusetzen, die den Zugriff zwar ohne die
lungen je nach Testumgebung oder Testziel.     1. UI-Objekte erkennen und auslesen          Abstraktionsschicht realisieren, aber eigene
Dabei muss sichergestellt werden, dass die     Hier gelten dieselben Architektur-Maßnah-    Mechanismen anbieten, um unabhängig
Entwicklung nicht „ausbricht“ und an-          men wie bei „UI-Objekte erkennen und be-     von den Datenbank-Treibern den Zugriff
fängt, fremde Schnittstellen direkt, d.h.      dienen“.                                     zu realisieren und die Daten auszulesen.
unter Umgehung der Abstraktionsschicht,                                                     Zuletzt sollte noch darauf hingewiesen wer-
zu nutzen. Dies kann mit relativ wenig Auf-    2. Datenbank auslesen                        den, dass die Datenbanktabellen-Struktur
wand durch statische Codeanalyse erreicht      Entwickler sind zuweilen uneinig darüber,    und die Klassenstruktur der Persistenz-
werden, indem regelmäßig überprüft wird,       ob in Projekten mit Datenbank-Abstrakti-     schicht durchaus Unterschiede aufweisen

Tabelle 1: Architekturmaßnahmen im Kontext „Startzustand und Vorbedingungen herstellen“.

02/2016                                                                                                                                73
Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten - Teil 2 - isento
Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten – Teil 2

Tabelle 2: Architekturmaßnahmen im Kontext „Eingaben ins SUT vornehmen“.

können. So kann die Tabellenstruktur sich        zu protokollieren sind. Ein einheitliches Log-   imstande, Protokolldateien auf jedem Kno-
ändern, obwohl die Klassenstruktur im enge-      ging-Framework über Komponenten hinweg           ten im Cluster automatisiert in eine zentrale
ren Sinne identisch bleibt (z.B. nur durch die   vereinfacht die Handhabung und die Ver-          Referenzliste einzutragen, sodass kein Kno-
Änderung der Konfiguration oder der An-          waltung und die Konfiguration für das Log-       ten versehentlich vergessen wird.
notationen). Solche Sonderfälle sind bei der     ging kann so außerdem zentralisiert werden.      Zuletzt sei darauf hingewiesen, dass die
Gestaltung der Abfragen zu berücksichtigen.      In vielen Projekten mit Bezug auf persönliche    Konfiguration des Formats der Protokollaus-
Einen guten Funktionsumfang für die Test-        Daten werden besondere Vorschriften bezüg-       gaben nicht weniger wichtig ist. Einerseits
unterstützung mit Datenbankzugriff bieten        lich Protokolldaten definiert. Beispielsweise    müssen die Protokollausgaben möglichst alle
Frameworks wie „DBUnit“ im Java-Um-              muss es grundsätzlich vermieden werden,          notwendigen Details liefern, damit die Feh-
feld und „ndbunit“ in der .NET-Welt.             personenbezogene Daten zu protokollieren.        leranalyse möglich ist. Andererseits ist aber
                                                 Das erleichtert auch den Zugriff auf die         darauf zu achten, dass die Protokolldateien
3. Log- und Protokoll-Dateien auslesen           Log-Dateien, da keine vorgelagerten Verwal-      nicht allzu groß werden – die Bereithaltung
Manche Testergebnisse sind aus Logfiles          tungsprozesse wie Freigaben notwendig sind.      der Protokolldaten für mehrere Tage kann
auszulesen, da das System hier die zu prü-       Aktuelle Softwaresysteme werden meist auf        für einige Großsysteme bereits zu einer Her-
fende Information ablegt.                        mehrere Knoten (z. B. im Cluster) verteilt.      ausforderung werden. Und auch der Test be-
Eine durchdachte Protokollierung kann            Es ist besonders wichtig darauf zu achten,       nötigt Informationen, wie er die zu prüfende
nicht nur bei der Fehlersuche im System hel-     dass entweder jeder Knoten für sich so weit      Information (z.B. automatisiert) findet.
fen, sondern somit auch zur Vereinfachung        abgeschlossen ist, dass die Fehlersuche in-
der Testausführung beitragen. In speziellen      nerhalb des Knotens stattfinden kann, oder       4. Andere Schnittstellen auslesen
Situationen können Log-Einträge als Nach-        das Logging-Framework so zu konfigurie-          Hier gelten dieselben Architekturmaßnah-
weis für die erfolgreiche Ausführung einer       ren, dass die Protokolleinträge auf unter-       men wie bei „Andere Schnittstellen befül-
Aktivität mit externen Schnittstellen aus-       schiedlichen Systemen einem Ereignis zu-         len“ (siehe Tabelle 3).
reichen, wenn z. B. die detaillierte Analyse     geordnet werden können. Hierfür benötigt
der Zustände in externen Schnittstellen zu       man spezielle Werkzeuge zur Zusammen-            Endzustand und
aufwändig ist.                                   führung mehrerer Protokolldateien und            Nachbedingungen prüfen
Bei der Definition der Richtlinien für Pro-      zur Analyse. Damit die Zusammenführung
tokollierung ist darauf zu achten, dass sich     möglich wird, müssen diverse Protokollein-       1. Zustand des SUT auslesen
eine nachvollziehbare Gewichtung der Log-        träge eines Ereignisses einander zugeordnet      Analog zur kontrollierten Erzeugung eines
Ausgaben für die Log-Stufen ergibt. Auf          werden können. Das kann auf einfache             Startzustands zu Testbeginn muss der Test
den Produktivsystemen wird meistens Log-         Weise durch die Ausgabe der ID des Initi-        erkennen, in welchem Zustand sich das SUT
Stufe „Info“ oder „Warn“ aktiviert – d.h.        alereignisses, durch Thread-ID oder durch        nach Abschluss des Tests befindet, um prü-
im Entwicklungsteam muss kommuniziert            Framework-interne Kontext-ID erfolgen.           fen zu können, dass ein Soll-Zustand wie
sein, welche Aktionen mit dieser Log-Stufe       Einige Frameworks sind darüber hinaus            verlangt tatsächlich erreicht wurde. Aber

Tabelle 3: Architekturmaßnahmen im Kontext „Ausgaben des SUT prüfen“.

74
Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Softwarearchitekten - Teil 2 - isento
www.objektspektrum.de

Tabelle 4: Architekturmaßnahmen im Kontext „Nachbedingungen prüfen“.

nicht nur für den Test, sondern auch für die
Wartung des Systems ist es notwendig, diese                              Literatur & Links
Zustände eindeutig identifizieren zu können.
Als Voraussetzung zur Erfüllung dieser An-               [Bra15] C. Brandes, S. Okujava, J. Baier, Architektur und Testbarkeit: Eine Checkliste (nicht
forderung müssen die Systemzustände do-                  nur) für Softwarearchitekten – Teil 1, in: OBJEKTspektrum 1/2016
kumentiert und nachvollziehbar sein. Au-                 [Fow02] M. Fowler, Patterns of Enterprise Application Architecture, Addison-Wesley, 2002
ßerdem ist es essenziell, geeignete PoOs pro             [Hei10] Heise Developer, Podcast: SoftwareArchitekTOUR – Podcast für den professionellen
Zustand bereitzustellen, damit der Tester                Softwarearchitekten, Folge 24: „Testing & Softwarearchitektur“, 2010, siehe:
den Zustandsübergang verifizieren kann.                  http://www.heise.de/developer/artikel/Episode-24-Testing-Softwarearchitektur-1080236.html
Eine Alternative wäre die explizite Proto-               [Ise] Isento GmbH, Architektur und Testbarkeit: Eine Checkliste (nicht nur) für Software-Ar-
kollierung des erreichten Systemzustands.                chitekten, siehe: http://www.architecture4testability.com
                                                         [IST15] International Software Testing Qualifications Board (ISTQB), Glossary, 2015, siehe:
2. Fremdkomponenten in                                   http://www.istqb.org/downloads/glossary.html
der Testumgebung auslesen                                [Jun02] S. Jungmayr, Design for Testability, 2002, siehe:
Zuweilen kann es aus Testsicht erforderlich              http://www.jungmayr.de/Publikationen/CONQUEST02_jungmayr.pdf
sein, Endzustand und Nachbedingungen                     [Tes] Testtool Review, Toolübersicht zu Testdatenmanagement, siehe:
auch von externen Komponenten ausle-                     https://www.testtoolreview.de/de/toolkategorien/item/68-testdatenmanagement
sen und prüfen zu können – wobei das                     [Zil12] F. Zilberfeld, InfoQ, Design for Testability – The True Story, 2012, siehe:
eher die Ausnahme ist, da es nicht Teil des              http://www.infoq.com/articles/Testability
Testauftrags sein sollte, die Korrektheit
angebundener Partnersysteme mitzutesten.
Ansonsten gelten dieselben Architektur-                 wurde nach unserem Kenntnisstand vorher            als Startschuss – idealerweise wird sie künf-
Maßnahmen wie bei „Fremdkomponenten                     noch nie die Brücke zu konkreten Testbar-          tig von Architekten genutzt und ergänzt,
befüllen“ (siehe Tabelle 4).                            keitsnotwendigkeiten geschlagen und dabei          verbessert und erweitert. Deshalb haben wir
                                                        der Versuch einer umfassenden Sammlung             sie auf einer eigenen Seite publiziert und Ka-
Zusammenfassung und Ausblick                            unternommen. Hierin sehen wir den größten          näle für Erweiterungswünsche eingerichtet
Wie wir gesehen haben, sind die diskutierten            Nutzen unserer bisherigen Arbeit.                  (vgl. [Ise]). Der weiteren Entwicklung sowie
Maßnahmen für Architekten allesamt wohl-                Folglich betrachten wir die Checkliste (siehe      konstruktivem Feedback jeder Art sehen
bekannt und keine Geheimwissenschaft. Nur               Tabellen 1 bis 4) in der aktuellen Form nur        wir mit Spannung entgegen.                  ||

                 Die Autoren

  || Dr. Christian Brandes                              || Dr. Shota Okujava                                || Dr. Jürgen Baier
  (christian.brandes@imbus.de)                          (shota.okujava@isento.de)                           (juergen.baier@modellar.de)
  arbeitet als leitender Berater und Trainer für        ist geschäftsführender Gesellschafter der Isento    ist geschäftsführender Gesellschafter der
  die imbus AG. Aktuelle Arbeitsthemen sind             GmbH sowie als Architekt und Berater für Java-      Modellar GmbH und als agiler Coach, Architekt
  Testprozess-Analysen, agiles Testen sowie             Enterprise-Technologien in Großprojekten tätig.     und Berater im JEE-Umfeld tätig. Neben agilen
  Schnittstellen des Tests zu anderen IT-Disziplinen.   Seine Spezialthemen sind SOA, modellgetriebene      Entwicklungsframeworks beschäftigen ihn vor-
                                                        Softwareentwicklungsprozesse sowie Integra-         rangig CI/CD und die Synchronisation verteilter
                                                        tionstechnologien.                                  Datenbestände.

02/2016                                                                                                                                                      75
Sie können auch lesen