SlideShare una empresa de Scribd logo
1 de 29
Descargar para leer sin conexión
1
Agiles Testing Johannes Stiehler
Copyright: industrieblick - Fotolia
2
Test Driven
Development
Das Grundprinzip
Die Regeln
1. Du darfst keinerlei Produktionscode schreiben, bevor du
nicht einen scheiternden Unit-Test geschrieben hast.
2. Du darfst nicht mehr von einem Unit-Test schreiben, als
nötig ist, um zu scheitern – Nicht-Kompilieren ist
Scheitern.
3. Du darfst nicht mehr Produktionscode schreiben, als
notwendig ist, um den momentan scheiternden Unit-Test
zu bestehen.
3
Warum Test-First
• Der Test wird getestet (dadurch, dass er erstmal
scheitert).
• Der Test gibt das Interface vor, dadurch entstehen
testbare Klassen.
• Der Tests hilft, strukturiert über die Anforderungen
nachzudenken.
• Der Fokus liegt auf simplen, robusten Lösungen.
4
5
Vorteile
Sicherheit — der Code ist getestet
Mut — Änderungen brechen keine Funktionalität
Dokumentation — die Tests beschreiben das Verhalten
Design — das einfachste Design, das funktioniert
6
Komplexe Funktionalität testen
7
Domänenmodell
Support Klassen
Service Interface
Anforderung
Outside-In
Inside-Out
Ebenen testgetriebener Entwicklung
• Code-Ebene mit Unit-Tests (whitebox)
• Applikationsebene mit System-Tests
• Produktebene mit Akzeptanz-Tests
8
Ergänzende Praktiken
• Clean Code
• Pair Programming
• Code Reviews
• Simple Design
• Kollektives Eigentum
9
Designprinzipen für das Refactoring
Dependency Inversion Principle (DIP)
Don't Repeat Yourself (DRY)
Favour Composition over Inheritance (FCoI)
Information Hiding Principle (IHP)
Interface Segregation Principle (ISP)
10
Designprinzipen für das Refactoring
Law of Demeter (LOD)
Liskov Substitution Principle (LSP)
Open Closed Principle (OCP)      
Principle of Least Astonishment (PoLA)      
Single Level of Abstraction (SLA)
11
Designprinzipen für das Refactoring
Keep It Simple Stupid (KISS)
Separation of Concerns (SoC)
Single Responsibility Principle (SRP)
Tell don't ask (TDA)
You ain't gonna need it (YAGNI) 
12
Wartbare Tests
13
Given – When – Then
Feature: User trades stocks

Scenario: User requests a sell before close of trading
Given I have 100 shares of MSFT stock

And I have 150 shares of APPL stock

And the time is before close of trading
When I ask to sell 20 shares of MSFT stock
Then I should have 80 shares of MSFT stock

And I should have 150 shares of APPL stock

And a sell order has been executed
14
Given
• Zustand der „Welt“ vor der zu testenden Aktion
• Setup, Parameter etc.
• Vorbedingungen (fail early)
• Vergangenheitsform
• Passiv
• Werte, nicht Aktionen
15
When
• zu testende Aktion
• nur eine When-Aussage
• beschreibt den Zweck des Tests eindeutig
• Gegenwartsform
• Aktiv
16
Then
• erwartete Ergebnisse nach der Aktion
• nicht überspezifizieren
• Zukunftsform
• Passiv
• Werte, nicht Aktionen
17
Test-Benennung
• irgendwie (test1, test2, test3, test4)
• wie die Methode, die getestet wird
• wie das Verhalten das erwartet wird
@Test

public void holdsItemsInTheOrderTheyWereAdded()
18
Test-Data-Builder
Order order=anOrder() # factory method for builder
.fromCustomer( # builder method
aCustomer().withAddress( # factory method
anAddress().withPostcode())).build();
19
Hamcrest
assertThat(instruments,
hasItem(instrumentWithPrice(greaterThan(81))
Expected: a collection containing instrument at price a
value greater than <81>
but: price was <50>, price was <72>, price was <31>
20
Wie entkoppelt man Frontend-Tests vom HTML?
Page Objects
public class LoginPage {
    public HomePage loginAs(String username, String password) {
        // ... clever magic happens here
    }
   
    public LoginPage loginAsExpectingError(String username, String password) {
        //  ... failed login here, maybe because one or both of the username and 

// password are wrong
    }
   
    public String getErrorMessage() {
        // So we can verify that the correct error is shown
    }
}
21
Long live the test
Test-Code sollte die gleiche – wenn nicht bessere –
Qualität haben wie Produktivcode, da er in einem
agilen Projekt vermutlich länger „überlebt“.
22
Tests für Legacy-Systeme
23
Schritt 1: System Tests
24
Schritt 1: Was testen?
• Risiko-basiertes Testen: Regression für die kritischsten
Komponenten, änderungsbasierte Tests für alle
zukünftigen Features.
• Äquivalenzpartitionierung: Nur Werte mit potentiell
unterschiedlichem Verhalten werden getestet, beginnend
mit den häufigsten Werbereichen.
• Änderungsfrequenz: Was sich häufig ändert, wird
zuerst getestet.
25
Schritt 2: Komponenten-Test
26
Schritt 3: Testbare Teile auslagern
• Methoden durch IDE-Refactorings extrahieren
• extrahierte Methoden in separate Klassen schieben
• Unit-Tests für diese neuen Klassen schreiben
• neue Features mit TDD hinzufügen
27
Schritt 4: konsequentes TDD
• nach weitgehender Umarbeitung ganzer Komponenten
• Inkonsequenz lässt sofort wieder „Alt-Code“ entstehen
• ein fehlender Test ist technische Schuld
• test-last-Entwicklung erzeugt technische Schuld
28
Vielen Dank für Ihre Aufmerksamkeit
johannes.stiehler@ideenpla.net
29

Más contenido relacionado

Destacado

Fase1 trabajo colaborativo_grupo49
Fase1 trabajo colaborativo_grupo49Fase1 trabajo colaborativo_grupo49
Fase1 trabajo colaborativo_grupo49xavierlindo
 
Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...
Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...
Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...Jan Schmidt
 
Portafolio de diagnóstico2
Portafolio de diagnóstico2Portafolio de diagnóstico2
Portafolio de diagnóstico20926242722
 
Das Ende der Anwesenheitspflicht
Das Ende der AnwesenheitspflichtDas Ende der Anwesenheitspflicht
Das Ende der AnwesenheitspflichtFranz Kuehmayer
 
Neue Öffentlichkeiten im Social Web
Neue Öffentlichkeiten im Social WebNeue Öffentlichkeiten im Social Web
Neue Öffentlichkeiten im Social WebJan Schmidt
 
Potestades por josé torrealba
Potestades por josé torrealbaPotestades por josé torrealba
Potestades por josé torrealbamarileypalacio
 
Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)
Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)
Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)Jan Schmidt
 
Banco de archivos-yessica
Banco de archivos-yessicaBanco de archivos-yessica
Banco de archivos-yessicaoncedosgrj2014
 
effiziente Werbung für kleine Unternehmen
effiziente Werbung für kleine Unternehmeneffiziente Werbung für kleine Unternehmen
effiziente Werbung für kleine UnternehmenSteiner Werbung AG
 
S7N en la revista Orbita de la Universidad Autónoma de Querétaro
S7N en la revista Orbita de la Universidad Autónoma de QuerétaroS7N en la revista Orbita de la Universidad Autónoma de Querétaro
S7N en la revista Orbita de la Universidad Autónoma de QuerétaroS7N
 
Editorial del Blog
Editorial del BlogEditorial del Blog
Editorial del BlogTaEthekai
 
La enseñanza de lenguas en el siglo xxi
La enseñanza de lenguas en el siglo xxiLa enseñanza de lenguas en el siglo xxi
La enseñanza de lenguas en el siglo xximagutz
 

Destacado (20)

Fase1 trabajo colaborativo_grupo49
Fase1 trabajo colaborativo_grupo49Fase1 trabajo colaborativo_grupo49
Fase1 trabajo colaborativo_grupo49
 
Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...
Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...
Onlinebasierte Öffentlichkeiten und ihre Auswirkungen auf Politik und Zivilge...
 
Practica4
Practica4Practica4
Practica4
 
1
11
1
 
Portafolio de diagnóstico2
Portafolio de diagnóstico2Portafolio de diagnóstico2
Portafolio de diagnóstico2
 
Das Ende der Anwesenheitspflicht
Das Ende der AnwesenheitspflichtDas Ende der Anwesenheitspflicht
Das Ende der Anwesenheitspflicht
 
Lenguaje (2)
Lenguaje (2)Lenguaje (2)
Lenguaje (2)
 
Steiner werbung wasgehtapp
Steiner werbung wasgehtappSteiner werbung wasgehtapp
Steiner werbung wasgehtapp
 
Neue Öffentlichkeiten im Social Web
Neue Öffentlichkeiten im Social WebNeue Öffentlichkeiten im Social Web
Neue Öffentlichkeiten im Social Web
 
Potestades por josé torrealba
Potestades por josé torrealbaPotestades por josé torrealba
Potestades por josé torrealba
 
La evolución de la web
La evolución de la webLa evolución de la web
La evolución de la web
 
Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)
Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)
Das Social Web im Kontext übergreifender Medienrepertoires (Uwe Hasebrink)
 
Banco de archivos-yessica
Banco de archivos-yessicaBanco de archivos-yessica
Banco de archivos-yessica
 
Historia B - Presentación unidad 2
Historia B - Presentación unidad 2Historia B - Presentación unidad 2
Historia B - Presentación unidad 2
 
effiziente Werbung für kleine Unternehmen
effiziente Werbung für kleine Unternehmeneffiziente Werbung für kleine Unternehmen
effiziente Werbung für kleine Unternehmen
 
S7N en la revista Orbita de la Universidad Autónoma de Querétaro
S7N en la revista Orbita de la Universidad Autónoma de QuerétaroS7N en la revista Orbita de la Universidad Autónoma de Querétaro
S7N en la revista Orbita de la Universidad Autónoma de Querétaro
 
Editorial del Blog
Editorial del BlogEditorial del Blog
Editorial del Blog
 
Stefanie 2
Stefanie 2Stefanie 2
Stefanie 2
 
La enseñanza de lenguas en el siglo xxi
La enseñanza de lenguas en el siglo xxiLa enseñanza de lenguas en el siglo xxi
La enseñanza de lenguas en el siglo xxi
 
Historia
HistoriaHistoria
Historia
 

Similar a Agiles Testing

Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungChristian Baranowski
 
Funktionstests in SAP
Funktionstests in SAPFunktionstests in SAP
Funktionstests in SAPCadaxo GmbH
 
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)Florian Wolters
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklungjlink
 
130605 blog - drools
130605   blog - drools130605   blog - drools
130605 blog - droolsjava-pe
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTddjlink
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Torsten Kleiber
 
TDD mit ABAP Units
TDD mit ABAP UnitsTDD mit ABAP Units
TDD mit ABAP UnitsCadaxo GmbH
 
Automatisierter Software-Test unter Java
Automatisierter Software-Test unter JavaAutomatisierter Software-Test unter Java
Automatisierter Software-Test unter JavaGFU Cyrus AG
 
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschafteneCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschaftenChristoph Menke
 
Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11Stephan Hochdörfer
 
Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12Stephan Hochdörfer
 
Die nächste Generation des Unit Testing
Die nächste Generation des Unit TestingDie nächste Generation des Unit Testing
Die nächste Generation des Unit TestingDaniel Lehner
 
Monitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-AnwendungenMonitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-Anwendungengedoplan
 
Robustes Testen mit Selenium
Robustes Testen mit SeleniumRobustes Testen mit Selenium
Robustes Testen mit Seleniumx-celerate
 
Streaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlStreaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlMatthias Niehoff
 
OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...
OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...
OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...NETWAYS
 

Similar a Agiles Testing (20)

Einführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software EntwicklungEinführung Vorgehensmodelle und Agile Software Entwicklung
Einführung Vorgehensmodelle und Agile Software Entwicklung
 
Funktionstests in SAP
Funktionstests in SAPFunktionstests in SAP
Funktionstests in SAP
 
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
Automatisiertes Testen von Software in C++ (mit dem Test Framework Google Test)
 
Property Based Testing
Property Based TestingProperty Based Testing
Property Based Testing
 
Testgetriebene Softwareentwicklung
Testgetriebene SoftwareentwicklungTestgetriebene Softwareentwicklung
Testgetriebene Softwareentwicklung
 
130605 blog - drools
130605   blog - drools130605   blog - drools
130605 blog - drools
 
AdvancedTdd
AdvancedTddAdvancedTdd
AdvancedTdd
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
 
Agiles Testen - Überblick
Agiles Testen - ÜberblickAgiles Testen - Überblick
Agiles Testen - Überblick
 
TDD mit ABAP Units
TDD mit ABAP UnitsTDD mit ABAP Units
TDD mit ABAP Units
 
Automatisierter Software-Test unter Java
Automatisierter Software-Test unter JavaAutomatisierter Software-Test unter Java
Automatisierter Software-Test unter Java
 
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen SystemlandschafteneCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
eCATT & OpenSource - Automatisierter Test in heterogenen Systemlandschaften
 
Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11Testing untestable code - PHPUGFFM 01/11
Testing untestable code - PHPUGFFM 01/11
 
Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12Testing untestable code - Herbstcampus12
Testing untestable code - Herbstcampus12
 
Die nächste Generation des Unit Testing
Die nächste Generation des Unit TestingDie nächste Generation des Unit Testing
Die nächste Generation des Unit Testing
 
Monitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-AnwendungenMonitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-Anwendungen
 
Robustes Testen mit Selenium
Robustes Testen mit SeleniumRobustes Testen mit Selenium
Robustes Testen mit Selenium
 
Streaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der WahlStreaming Plattformen und die Qual der Wahl
Streaming Plattformen und die Qual der Wahl
 
OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...
OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...
OSMC 2011 | Performance-Vergleich von Nagios Monitoring Lösungen by Christoph...
 

Agiles Testing

  • 1. 1 Agiles Testing Johannes Stiehler Copyright: industrieblick - Fotolia
  • 3. Die Regeln 1. Du darfst keinerlei Produktionscode schreiben, bevor du nicht einen scheiternden Unit-Test geschrieben hast. 2. Du darfst nicht mehr von einem Unit-Test schreiben, als nötig ist, um zu scheitern – Nicht-Kompilieren ist Scheitern. 3. Du darfst nicht mehr Produktionscode schreiben, als notwendig ist, um den momentan scheiternden Unit-Test zu bestehen. 3
  • 4. Warum Test-First • Der Test wird getestet (dadurch, dass er erstmal scheitert). • Der Test gibt das Interface vor, dadurch entstehen testbare Klassen. • Der Tests hilft, strukturiert über die Anforderungen nachzudenken. • Der Fokus liegt auf simplen, robusten Lösungen. 4
  • 5. 5
  • 6. Vorteile Sicherheit — der Code ist getestet Mut — Änderungen brechen keine Funktionalität Dokumentation — die Tests beschreiben das Verhalten Design — das einfachste Design, das funktioniert 6
  • 7. Komplexe Funktionalität testen 7 Domänenmodell Support Klassen Service Interface Anforderung Outside-In Inside-Out
  • 8. Ebenen testgetriebener Entwicklung • Code-Ebene mit Unit-Tests (whitebox) • Applikationsebene mit System-Tests • Produktebene mit Akzeptanz-Tests 8
  • 9. Ergänzende Praktiken • Clean Code • Pair Programming • Code Reviews • Simple Design • Kollektives Eigentum 9
  • 10. Designprinzipen für das Refactoring Dependency Inversion Principle (DIP) Don't Repeat Yourself (DRY) Favour Composition over Inheritance (FCoI) Information Hiding Principle (IHP) Interface Segregation Principle (ISP) 10
  • 11. Designprinzipen für das Refactoring Law of Demeter (LOD) Liskov Substitution Principle (LSP) Open Closed Principle (OCP)       Principle of Least Astonishment (PoLA)       Single Level of Abstraction (SLA) 11
  • 12. Designprinzipen für das Refactoring Keep It Simple Stupid (KISS) Separation of Concerns (SoC) Single Responsibility Principle (SRP) Tell don't ask (TDA) You ain't gonna need it (YAGNI)  12
  • 14. Given – When – Then Feature: User trades stocks
 Scenario: User requests a sell before close of trading Given I have 100 shares of MSFT stock
 And I have 150 shares of APPL stock
 And the time is before close of trading When I ask to sell 20 shares of MSFT stock Then I should have 80 shares of MSFT stock
 And I should have 150 shares of APPL stock
 And a sell order has been executed 14
  • 15. Given • Zustand der „Welt“ vor der zu testenden Aktion • Setup, Parameter etc. • Vorbedingungen (fail early) • Vergangenheitsform • Passiv • Werte, nicht Aktionen 15
  • 16. When • zu testende Aktion • nur eine When-Aussage • beschreibt den Zweck des Tests eindeutig • Gegenwartsform • Aktiv 16
  • 17. Then • erwartete Ergebnisse nach der Aktion • nicht überspezifizieren • Zukunftsform • Passiv • Werte, nicht Aktionen 17
  • 18. Test-Benennung • irgendwie (test1, test2, test3, test4) • wie die Methode, die getestet wird • wie das Verhalten das erwartet wird @Test
 public void holdsItemsInTheOrderTheyWereAdded() 18
  • 19. Test-Data-Builder Order order=anOrder() # factory method for builder .fromCustomer( # builder method aCustomer().withAddress( # factory method anAddress().withPostcode())).build(); 19
  • 20. Hamcrest assertThat(instruments, hasItem(instrumentWithPrice(greaterThan(81)) Expected: a collection containing instrument at price a value greater than <81> but: price was <50>, price was <72>, price was <31> 20
  • 21. Wie entkoppelt man Frontend-Tests vom HTML? Page Objects public class LoginPage {     public HomePage loginAs(String username, String password) {         // ... clever magic happens here     }         public LoginPage loginAsExpectingError(String username, String password) {         //  ... failed login here, maybe because one or both of the username and 
 // password are wrong     }         public String getErrorMessage() {         // So we can verify that the correct error is shown     } } 21
  • 22. Long live the test Test-Code sollte die gleiche – wenn nicht bessere – Qualität haben wie Produktivcode, da er in einem agilen Projekt vermutlich länger „überlebt“. 22
  • 24. Schritt 1: System Tests 24
  • 25. Schritt 1: Was testen? • Risiko-basiertes Testen: Regression für die kritischsten Komponenten, änderungsbasierte Tests für alle zukünftigen Features. • Äquivalenzpartitionierung: Nur Werte mit potentiell unterschiedlichem Verhalten werden getestet, beginnend mit den häufigsten Werbereichen. • Änderungsfrequenz: Was sich häufig ändert, wird zuerst getestet. 25
  • 27. Schritt 3: Testbare Teile auslagern • Methoden durch IDE-Refactorings extrahieren • extrahierte Methoden in separate Klassen schieben • Unit-Tests für diese neuen Klassen schreiben • neue Features mit TDD hinzufügen 27
  • 28. Schritt 4: konsequentes TDD • nach weitgehender Umarbeitung ganzer Komponenten • Inkonsequenz lässt sofort wieder „Alt-Code“ entstehen • ein fehlender Test ist technische Schuld • test-last-Entwicklung erzeugt technische Schuld 28
  • 29. Vielen Dank für Ihre Aufmerksamkeit johannes.stiehler@ideenpla.net 29