Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Containerized End-2-End-Testing - Software-QS-Tag (deutsch)

toschneck
November 03, 2016

Containerized End-2-End-Testing - Software-QS-Tag (deutsch)

Bei der Konzeption von End-2-End-Tests ist eine der größten Problemstellungen die Frage, wie die Testausführung möglichst robust, reproduzierbar und parallelisierbar gestaltet werden kann. Diese Hürde lässt sich meist mit klassischen Ansätzen nicht überwinden.

Einen eleganten Ausweg bieten in Container verpackte Testumgebungen. Dadurch wird es möglich, einen definierten Systemstand reproduzierbar aufzurufen und Tests performant auszuführen. Anhand typischer E2E-Tests wird gezeigt, wie z. B. parallele GUI-Tests in verschiedenen Umgebungen zur Qualitätssicherung beitragen. Die Beispiele sind mit dem Open-Source-Tools „Sakuli“ und „Docker“ realisiert und testen Web- und Rich-Client-Applikationen. Um die Integration in eine Continous-Deployment-Pipeline zu demonstrieren, wird eine rein auf Container-Technologie basierende Testumgebung durch das CI-Tool Jenkins aufgebaut, um darauf automatisierte End-2-End-Tests headless zur Ausführung zu bringen.

Ziel ist es, dem Zuhörer aufzuzeigen, wie das Potenzial von Container-Technologien genutzt werden kann, um die Softwarequalität zu erhöhen und den manuellen Testaufwand drastisch zu verringern. Eine abschließende Bewertung der Erfahrungen sowie ein Ausblick auf weitere Einsatzszenarien und Entwicklungsschritte runden den Vortrag ab.

toschneck

November 03, 2016
Tweet

More Decks by toschneck

Other Decks in Programming

Transcript

  1. Besonderheiten bei End­2­End Tests Unterschiedliche Testarten: Regressionstests Funktionale Abnahmetests Parallele

    Tests mit GUIs sind komplex! Stateful Tests: User­Logins, Sessions, verlaufsbasierte Daten Setup und Cleanup von Testdaten Manueller Aufwand > Aufwand für Automatisierung
  2. Vorteile der Container­Technologie Isolation von Umgebungen Repository für Versionierung und

    Verteilung Reproduzierbarer Aufbau von Umgebungen Dockerfile, docker­compose.yml Start von Containern on­the­fly Optimiert für Parallelisierung Geteilter Linux Kernel (Speicherplatz, CPU, RAM) Cloud­ready (Kubernetes, OpenShift, Mesos)
  3. Containerized GUIs # # # s t a r t

    t h e d o c k e r c o n t a i n e r v i a x ­ f o r w a r d i n g d o c k e r r u n ­ i t ­ e D I S P L A Y = $ D I S P L A Y ­ v / t m p / . X 1 1 ­ u n i x : / t m p / . X 1 1 ­ u n i x : r w r a s c h / i n k s c a p e # # # s t a r t t h e d o c k e r c o n t a i n e r w i t h V N C i n t e r f a c e # c o n n e c t v i a U R L : h t t p : / / l o c a l h o s t : 6 9 1 1 / v n c _ a u t o . h t m l ? p a s s w o r d = v n c p a s s w o r d d o c k e r r u n ­ i t ­ p 5 9 1 1 : 5 9 0 1 ­ p 6 9 1 1 : 6 9 0 1 c o n s o l / u b u n t u ­ x f c e ­ v n c d o c k e r r u n ­ i t ­ p 5 9 1 2 : 5 9 0 1 ­ p 6 9 1 2 : 6 9 0 1 c o n s o l / c e n t o s ­ x f c e ­ v n c
  4. Was bietet ? Kategorie Web Tests via HTML­Selektoren Testen von

    nativen GUI Inhalten (nicht HTML­Inhalte, z. B. PDF's oder Plugins) Open Source & Java API Headless­Execution Unterstützung bei Testerstellung (Recorder, Screenshot­Finder) Automatisierbarkeit & Ergebnis­Aufbereitung (CI, DB, Monitoring Systeme)
  5. Aktionsbereich: Browser­Inhalte (HTML­Seiten, Single­Page­Apps) Objekt­Adressierung über DOM­Elemente Erkennt, wenn Seiten/AJAX­Requests

    fertig geladen sind (keine waits) Guter Umgang mit modernen Web­ Frameworks Recorder­ / Selektoren­UI­Assistent Assert Funktionen Aktionsbereich: Bildschirm ­Inhalte (z.B. Rich­Clients, Browser­Plugins) Objekt­Adressierung über Image­Patterns (Mini­Screenshots) Off­Browser­Testing, sieht und steuert das, was der User sieht Flexible Region­Patterns für die Navigation innerhalb des Bildschirms OCR­Features (experimental) Nutzt java.awt.Robot und openCV
  6. Test Case Structure / / t e s t c

    a s e . j s / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * I n i t i a l i z a t i o n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / _ d y n a m i c I n c l u d e ( $ i n c l u d e F o l d e r ) ; v a r t e s t C a s e = n e w T e s t C a s e ( 6 0 , 7 0 ) ; v a r e n v = n e w E n v i r o n m e n t ( ) ; v a r a p p N o t e p a d = n e w A p p l i c a t i o n ( " g e d i t " ) ; v a r r e g i o n = n e w R e g i o n ( ) ; / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * D e s c r i p t i o n o f t h e t e s t c a s e * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / t r y { / / . . . / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * E x c e p t i o n h a n d l i n g a n d s h u t d o w n o f t e s t c a s e * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / } c a t c h ( e ) { t e s t C a s e . h a n d l e E x c e p t i o n ( e ) ; } f i n a l l y { t e s t C a s e . s a v e R e s u l t ( ) ; }
  7. Unterstützung für alle Sahi­Funktionen / / t e s t

    a c a s e . j s / * * * * * * * * * * * * * * * * * * * * * * * * * C a l l S a h i F u n c t i o n s * * * * * * * * * * * * * * * * * * * * * * * / _ n a v i g a t e T o ( " h t t p : / / s a h i . e x a m p l e . c o m / _ s _ / d y n / D r i v e r _ i n i t i a l i z e d " ) ; _ h i g h l i g h t ( _ l i n k ( " S S L M a n a g e r " ) ) ; _ i s V i s i b l e ( _ l i n k ( " S S L M a n a g e r " ) ) ; _ h i g h l i g h t ( _ l i n k ( " L o g s " ) ) _ c l i c k ( _ l i n k ( " L o g s " ) ) t e s t C a s e . e n d O f S t e p ( " T e s t S a h i l a n d i n g p a g e " , 5 ) ;
  8. Fluent API für UI­Testing / / t e s t

    a c a s e . j s / * * * o p e n c a l c u l a t o r a p p * * * / v a r c a l c u l a t o r A p p = n e w A p p l i c a t i o n ( " g a l c u l a t o r " ) . o p e n ( ) ; t e s t C a s e . e n d O f S t e p ( " O p e n C a l c u l a t o r " , 3 ) ; / * * * c a l c u l a t e 5 2 5 + 1 0 0 * * * / v a r c a l c u l a t o r R e g i o n = c a l c u l a t o r A p p . g e t R e g i o n ( ) ; c a l c u l a t o r R e g i o n . t y p e ( " 5 2 5 " ) . f i n d ( " p l u s . p n g " ) . c l i c k ( ) . t y p e ( " 1 0 0 " ) . f i n d ( " c a l c u l a t e " ) . c l i c k ( ) ; t e s t C a s e . e n d O f S t e p ( " c a l c u l a t e 5 2 5 + 1 0 0 " , 2 0 ) ;
  9. Custom Functions / / e . g . e x

    c l u d e d i n t o a s e p a r a t e c o m m o n . j s / * * * * * * * * * * * C o m b i n e c l i c k a n d h i g h l i g h t * * * * * * * * * / f u n c t i o n c l i c k H i g h l i g h t ( $ s e l e c t o r ) { _ h i g h l i g h t ( $ s e l e c t o r ) ; _ c l i c k ( $ s e l e c t o r ) ; } / * * * * * * * * * * * * * * * * O p e n P D F i n n a t i v e v i e w e r * * * * * * * * * * * * * * / v a r P D F _ E D I T O R _ N A M E = " m a s t e r p d f e d i t o r 3 " ; f u n c t i o n o p e n P d f F i l e ( p d f F i l e L o c a t i o n ) { r e t u r n n e w A p p l i c a t i o n ( P D F _ E D I T O R _ N A M E + ' " ' + p d f F i l e L o c a t i o n + ' " ' ) . o p e n ( ) ; }
  10. Demo ­ Sakuli Container # s t a r t

    t h e d o c k e r c o n t a i n e r d o c k e r r u n ­ i t ­ p 5 9 1 1 : 5 9 0 1 ­ p 6 9 1 1 : 6 9 0 1 c o n s o l / s a k u l i ­ u b u n t u ­ x f c e d o c k e r r u n ­ i t ­ p 5 9 1 2 : 5 9 0 1 ­ p 6 9 1 2 : 6 9 0 1 c o n s o l / s a k u l i ­ c e n t o s ­ x f c e # s t a r t i n p a r a l l e l v i a d o c k e r ­ c o m p o s e # u s e d o c k e r ­ c o m p o s . y m l f r o m h t t p s : / / g i t h u b . c o m / C o n S o l / s a k u l i / t r e e / m a s t e r / d o c k e r d o c k e r ­ c o m p o s e u p
  11. Bakery Demo g i t c l o n e

    h t t p s : / / g i t h u b . c o m / t o s c h n e c k / s a k u l i ­ e x a m p l e ­ b a k e r y ­ t e s t i n g . g i t # s t a r t j e n k i n s j e n k i n s / d e p l o y _ j e n k i n s . s h # s t a r t O M D m o n t i o r i n g o m d ­ n a g i o s / d e p l o y _ o m d . s h # s t a r t t h e b u i l d o f t h e a p p l i c a t i o n i m a g e s b a k e r y ­ a p p / a p p ­ d e p l o y m e n t ­ d o c k e r ­ c o m p o s e / d e p l o y _ a p p . s h # s t a r t t e s t s s a k u l i ­ t e s t s / e x e c u t e _ a l l . s h # s t a r t t e s t s f o r m o n i t o r i n g s a k u l i ­ t e s t s / e x e c u t e _ a l l _ 4 _ m o n i t o r i n g . s h
  12. What's next? Headless­Execution ­ Linux: VNC & Docker Windows: ?

    Cloud­ready container für OpenShift (security, source­2­image) Video­Aufzeichnung der Testabläufe zur Fehlerdokumentation Web­UI für die Test­Suite­Verwaltung und Reporting Externe Test­Management­Systeme anbinden (HP QC, TestRail, ...) Darstellung von Testergebnissen in CI­Tools verbessern Selenium als Alternative zu Sahi ermöglichen
  13. Danke Software­QS­Tag! Tobias Schneck ConSol Software GmbH Franziskanerstraße 38 D­81669

    München Tel: +49­89­45841­100 Fax: +49­89­45841­111 tobias.schneck@consol. toschneck [email protected] www.consol.de ConSol