01.09.2013 Views

Software-Test - Software and Systems Engineering

Software-Test - Software and Systems Engineering

Software-Test - Software and Systems Engineering

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Techniken im<br />

<strong>Software</strong>-<strong>Test</strong><br />

München, 4. Juli 2000<br />

Heiko Lötzbeyer<br />

Institut für Informatik<br />

Lehrstuhl für <strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Technische Universität München


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Ziele des <strong>Software</strong> <strong>Test</strong>s<br />

• Überblick<br />

• <strong>Test</strong>stufen<br />

– Unit-<strong>Test</strong><br />

– Integrationstest<br />

– Systemtest<br />

• <strong>Test</strong>verfahren<br />

– manuelle <strong>Test</strong>verfahren<br />

– Whitebox<br />

– Blackbox<br />

• <strong>Test</strong>fallermittlung<br />

– Spezifikationsbasierte <strong>Test</strong>fallermittlung<br />

• Schluß<br />

Inhalt<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 2


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Was ist <strong>Test</strong>en?<br />

Ziele<br />

– G.J.Myers,´79:<br />

„<strong>Test</strong>en ist der Prozeß, ein Programm mit der Absicht<br />

auszuführen, Fehler zu finden.“<br />

– Hetzel ´83:<br />

„Messung der <strong>Software</strong>qualität“<br />

–DieÜberprüfung, daß ein System die spezifizierten<br />

Anforderungen erfüllt.<br />

• Ziele:<br />

– Fehler finden<br />

– auch: Fehler vermeiden (B. Beizer)<br />

– nicht: Korrektheitsnachweis<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 3


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Überblick<br />

• Entstehung und Entdeckung von Fehlern<br />

(aus Balzert, IEEE <strong>Software</strong>, Jan. 1985, S.83)<br />

60%<br />

50%<br />

40%<br />

30%<br />

20%<br />

10%<br />

0%<br />

Anforderungs- und<br />

Entwurfsphase<br />

Eingebrachte Fehler Gefundene Fehler<br />

Technische<br />

Entwurfsphase<br />

Konstruktions- und<br />

Systemphase<br />

Abnahmetest und<br />

Betriebsphase<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 4


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Fehlerbeseitigung<br />

• Relative Kosten zur Fehlerbeseitigung<br />

(H. Balzert, 1998; Boehm, 1976)<br />

1000<br />

100<br />

10<br />

1<br />

Definition<br />

3<br />

Entwurf<br />

5<br />

Implementierung<br />

10<br />

Entwicklungstest<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 5<br />

15<br />

Abnahmetest<br />

40<br />

Betrieb<br />

150


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Fehlerverteilung<br />

• Fehlerverteilung (Dick Bender, 1993)<br />

Design<br />

27%<br />

Code<br />

7%<br />

Other<br />

10%<br />

Requirements<br />

56%<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 6


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Fehlerverteilung:<br />

(Beispiel von Hewlett-Packard, Grady 1997)<br />

Data h<strong>and</strong>ling<br />

6%<br />

Documentation<br />

19%<br />

Requirements<br />

5%<br />

Other code<br />

11%<br />

Hardware<br />

4%<br />

Process/Interprocess<br />

5%<br />

Fehlerverteilung<br />

Computation<br />

18%<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 7<br />

Logic<br />

32%


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

<strong>Test</strong>fallermittlung<br />

<strong>Test</strong>fälle<br />

Regressionstest<br />

Ablaufprotokolle<br />

<strong>Test</strong>durchführung<br />

<strong>Test</strong>treiber<br />

<strong>Test</strong>objekt<br />

Regressionstest<br />

Neues<br />

<strong>Test</strong>objekt<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 8<br />

Stubs


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

<strong>Test</strong>stufen<br />

• Unit-, Komponenten-, Modul- oder Klassentest<br />

– <strong>Test</strong> einer einzelnen Einheit<br />

• Integrationstest<br />

– Überprüfung des fehlerfreien Zusammenwirkens von<br />

Systemkomponenten<br />

• Systemtest<br />

– abschließender <strong>Test</strong> des Gesamtsystems<br />

Funktion, Leistung (Massen-, Zeit-, Streßtest), Benutzbarkeit,<br />

Sicherheit, Interoperabilität<br />

• Abnahmetest<br />

– <strong>Test</strong> unter Mitwirkung des Auftraggebers<br />

– Alpha-<strong>Test</strong>, Beta-<strong>Test</strong><br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 9


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Integrationsstrategien:<br />

– nicht-inkrementell:<br />

• bigbang<br />

• geschäftsprozeßorientiert<br />

– inkrementell:<br />

• top-down-Integration<br />

• bottom-up-Integration<br />

• funktionsorientiert<br />

• nach Verfügbarkeit<br />

Integrationstest<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 10


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Manuelle Prüfverfahren:<br />

<strong>Test</strong>verfahren<br />

– Programminspektion, Review, Walkthrough<br />

– effektiv: 30-70% (Myers, Balzert)<br />

– Zeit- und Personalaufwendig<br />

• Whitebox-<strong>Test</strong> (struktureller <strong>Test</strong>)<br />

– Ausgangspunkt: Struktur des Prüflings<br />

– Messung der <strong>Test</strong>überdeckung mittels Metrik<br />

• Blackbox-<strong>Test</strong> (funktionaler <strong>Test</strong>)<br />

– Ausgangspunkt: Spezifikation des Prüflings<br />

– Sicherstellung der gewünschten Funktionalität<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 11


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Whitebox-<strong>Test</strong><br />

• Instrumentierung des Codes (Zähler einfügen)<br />

• <strong>Test</strong>s durchführen<br />

• Messung der<br />

– verarbeiteten Anweisungen<br />

– ausgewerteten Bedingungen<br />

– Schleifendurchläufe<br />

• Auswertung der erreichten Überdeckung anh<strong>and</strong> von<br />

Metriken<br />

– kontrollflußorientiert<br />

– datenflußorientiert<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 12


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Function count(int x) {<br />

}<br />

int z;<br />

if x < 0 then z = -x;<br />

else z = x;<br />

while z > 0 { z--; }<br />

Kontrollflußorientiert<br />

X < 0<br />

YES NO<br />

z = -x z = x<br />

z > 0<br />

Z--<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 13<br />

NO<br />

2<br />

3<br />

1<br />

YES<br />

Programm Flußdiagramm


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Metriken:<br />

– Anweisungsüberdeckung<br />

Kontrollflußorientiert<br />

• jede Anweisung mind. 1 mal durchlaufen<br />

• hier: 3 Anweisungen können mit 2<br />

<strong>Test</strong>durchläufen überdeckt werden<br />

– Zweigüberdeckung<br />

• jeder Zweig (jede Bedingung: true, false)<br />

• hier: 2 Bedingungen mit jeweils 2<br />

Möglichkeiten können mit 2 <strong>Test</strong>durchläufen<br />

überdeckt werden<br />

– Pfadüberdeckung<br />

• jeder Pfad muß durchlaufen werden<br />

• hier: unendlich viele Pfade<br />

– Bedingungsüberdeckung, MC/DC<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 14<br />

FT<br />

F<br />

T,F


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Es gilt:<br />

Anweisungsüberdeckung<br />

⊂<br />

Zweigüberdeckung<br />

⊂ ⊂<br />

Modified Condition/Decision Coverage Pfadüberdeckung<br />

⊂<br />

Bedingungsüberdeckung<br />

• Probleme:<br />

– Infeasible Paths (nicht erreichbare Pfade)<br />

• z.B. if A do x; [...] if ¬A doy;<br />

• aus Redundanzen (z.B. Range-Checking-Code vom Compiler)<br />

• bei Exceptions<br />

– geeignete <strong>Test</strong>daten zu finden<br />

Kontrollflußorientiert<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 15


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Betrachtet werden<br />

– Definition,<br />

– lesende Zugriffe,<br />

– schreibende Zugriffe<br />

von Variablen<br />

• Defs/Uses-Verfahren:<br />

Datenflußorientiert<br />

– def: Wertzuweisung, auch Definitionen, Initialisierung<br />

– c-use: berechnende Benutzung (computational use)<br />

– p-use: prädikative Benutzung (predicate use)<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 16


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Datenflußgraph<br />

• Kontrollflußgraph mit Datenflußdarstellung:<br />

Function count(int x) {<br />

}<br />

int z;<br />

if x < 0 then z = -x;<br />

else z = x;<br />

while z > 0 { z--; }<br />

c-use x<br />

def z<br />

p-use z<br />

def x<br />

def z<br />

p-use x p-use x<br />

p-use z<br />

c-use z<br />

def z<br />

c-use x<br />

def z<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 17


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Datenflußmetriken<br />

• Metriken: (Statistiken aus Girgis, Woodware `86)<br />

– all defs: (24%, keine Kontrollflußfehler)<br />

• jede Definition muß in einer Berechnung oder Bedingung benutzt<br />

werden<br />

– all p-uses: (34%, identifiziert sicher Kontrollflußfehler)<br />

• Jede Kombination aus Variablendefinition und deren prädikative<br />

Nutzung muß getestet werden<br />

• Beinhaltet Zweigüberdeckung<br />

– all c-uses: (48%, identifiziert Berechnungsfehler)<br />

• Jede Kombination aus Variablendefinition und deren berechnende<br />

Benutzung muß getestet werden<br />

– all uses: (insgesamt ca. 70% der Programmierfehler)<br />

• c-uses und p-uses zusammen<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 18


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Whitebox-<strong>Test</strong>:<br />

Code<br />

<strong>Test</strong><br />

Abstraktion<br />

Modell<br />

<strong>Test</strong>fallermittlung<br />

Automatische Verfahren:<br />

Model-Checker,<br />

KI<br />

<strong>Test</strong>fälle und<br />

<strong>Test</strong>daten<br />

Überdeckung:<br />

Anweisungsüberdeckung,<br />

MC/DC<br />

Konkretisierung<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 19


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Blackbox-<strong>Test</strong>:<br />

Blackbox-<strong>Test</strong><br />

– Ermittlung der <strong>Test</strong>fälle ausschließlich aus der Spezifikation<br />

– Ziel ist eine möglichst umfassende und redundanzarme<br />

Prüfung der Funktionalität<br />

• Techniken:<br />

– Äquivalenzklassenbildung<br />

– Grenzwertanalyse<br />

– <strong>Test</strong>sequenzermittlung aus<br />

• Use-Cases<br />

• Beispielabläufen<br />

• Zust<strong>and</strong>sdiagrammen<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 20


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Äquivalenzklassenbildung:<br />

Äquivalenzklassen<br />

– Definitions- und Wertebereich in Äquivalenzklassen zerlegen<br />

• gültige Äquivalenzklassen => Funkionstests<br />

• ungültige Äquivalenzklassen => Stabilitätstests<br />

– Bsp: Monat : [1..12] zerlegen in<br />

• eine gültige Äquivalenzklasse : 1


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Classifaction Tree Editor:<br />

CTE<br />

Klassifikationsbaum<br />

≈ Kombination von<br />

Äquivalenzklassen<br />

Kombinationstabelle<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 22


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Zust<strong>and</strong>sautomaten<br />

• Ableitung von <strong>Test</strong>fällen aus Zust<strong>and</strong>sautomaten:<br />

– über Graphen:<br />

• Transitionsüberdeckung (Transitionstour)<br />

• Zust<strong>and</strong>süberdeckung<br />

• Pfadüberdeckung<br />

– durch Simulation<br />

• manuell mit Aufzeichnung<br />

• symbolische Ausführung<br />

– logikbasiert<br />

• Transformation in Aussagenlogik/Prädikatenlogik, deklarative<br />

Beschreibung der <strong>Test</strong>fälle<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 23


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Blackbox-<strong>Test</strong>:<br />

<strong>Test</strong>objekt<br />

<strong>Test</strong><br />

Spezifikation<br />

<strong>Test</strong>fallermittlung<br />

Automatische Verfahren:<br />

Model-Checker,<br />

KI<br />

<strong>Test</strong>fälle und<br />

<strong>Test</strong>daten<br />

<strong>Test</strong>ziel<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 24


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Methoden:<br />

Mealy-Automaten<br />

– Transitionstour, W-Methode, UIO-Methode<br />

• Vorteile:<br />

– vollautomatisch<br />

– auch Korrektheitsbeweis<br />

• Nachteile:<br />

– nur endliche Systeme<br />

– Korrektheitsbeweise erfordern starke Annahmen über <strong>Test</strong>objekt<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 25<br />

0/0<br />

0<br />

1/0<br />

0/1<br />

1<br />

1/1


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Transitionstour<br />

• Findet den kürzesten Pfad durch den Automaten, der alle<br />

Transitionen überdeckt<br />

• Vorteile:<br />

– vollautomatisch<br />

• Nachteile:<br />

– Automat muß bestimmte Eigenschaften haben:<br />

• stark zusammenhängend<br />

• errechnete Transitionssequenz muß wirklich durchführbar sein<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 26


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Methode:<br />

Model-Checking<br />

– Verwendung von Gegenbeispielen vom Model-Checker<br />

– Ermittlung der Systemläufe durch die Lösung aussagenlogischer<br />

Formeln<br />

• Vorteile:<br />

– vollautomatisch<br />

• Einschränkungen<br />

– nur zust<strong>and</strong>sendliche Systeme<br />

sonst Abstraktion notwendig<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 27


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

AF-Spezifikation<br />

Aussagenlogik<br />

<strong>Test</strong>ziel<br />

SATO<br />

(Aussagenlogik)<br />

<strong>Test</strong>fall<br />

(EET)<br />

Übersetzung Rückübersetzung<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 28


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Methode:<br />

CLP<br />

– Codierung in regelbasierte Systeme mit Constraint-Mechanismen (CLP<br />

= Constraint Logic Programming)<br />

– symbolische Simulation<br />

• Vorteile:<br />

– vollautomatisch<br />

– auch unendliche Systeme<br />

• Einschränkungen<br />

– Datentypen / Arithmetik<br />

– Schwierigkeiten mit nichtlinearen Prädikaten<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 29


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

AF-Spezifikation<br />

Constraintlogik<br />

<strong>Test</strong>ziel<br />

Prolog/CLP<br />

(Regeln,<br />

Constraintlogik)<br />

<strong>Test</strong>fall<br />

(EET)<br />

Übersetzung Rückübersetzung<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 30


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

• Weitgehend gelöst:<br />

– Metriken für Whitebox-<strong>Test</strong>s<br />

• Problematisch:<br />

– <strong>Test</strong>ziele definieren<br />

• Aktuell:<br />

– automatische <strong>Test</strong>fallermittlung aus<br />

• Use-Cases,<br />

• graphischen Beschreibungstechniken<br />

– Generierung von <strong>Test</strong>treibern, Stubs<br />

Schluß<br />

Inhalt Ziele Überblick <strong>Test</strong>stufen <strong>Test</strong>verfahren <strong>Test</strong>fallermittlung Schluß<br />

4. Juli 2000 H. Lötzbeyer 31


Lehrstuhl für<br />

<strong>Software</strong> & <strong>Systems</strong> <strong>Engineering</strong><br />

Next Events:<br />

ENDE<br />

Steinheil<br />

Alex B. Schmidt:<br />

Anwendungen der Relationenalgebra<br />

Dienstag 18.7.2000, 17.00 Uhr, Raum1546

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!