Share
Embed
Containerized End-2-End Testing - JUG Saxony Day
Bei der Konzeption von End-2-End-Tests ist eine der größten Probleme die Frage, wie die Testausführung robust, reproduzierbar und skalierbar gestaltet werden kann. Einen eleganten Ausweg bieten in Container verpackte Testumgebungen. Dadurch wird es möglich, einen definierten Systemstand reproduzierbar und performant zu testen. Anhand der Open-SourceTools „Sakuli“ und „Docker“ wird gezeigt, wie parallele GUI-Tests in nativen Umgebungen Web- und Rich-Client-Anwendungen performant testen.
toschneck
September 30, 2016
Transcript
27 slides
-
Agenda 1. Einordnung End2End Tests 2. Nutzen ContainerTechnologie 3. Überblick
Sakuli Framework 4. DEMO 5. Ausblick -
Besonderheiten bei End2End Tests Unterschiedliche Testarten: Regressionstests Funktionale Abnahmetests Parallele
Tests mit GUIs sind komplex! Stateful Tests: UserLogins, Sessions, verlaufsbasierte Daten Setup und Cleanup von Testdaten Manueller Aufwand > Aufwand für Automatisierung -
Vorteile der ContainerTechnologie Isolation von Umgebungen Repository für Versionierung und
Verteilung Reproduzierbarer Aufbau von Umgebungen Dockerfile, dockercompose.yml Start von Containern onthefly Optimiert für Parallelisierung Geteilter Linux Kernel (Speicherplatz, CPU, RAM) Cloudready (Kubernetes, OpenShift, Mesos) -
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 -
Was bietet ? Kategorie Web Tests via HTMLSelektoren Testen von
nativen GUI Inhalten (nicht HTMLInhalte, z. B. PDF's oder Plugins) Open Source & Java API HeadlessExecution Unterstützung bei Testerstellung (Recorder, ScreenshotFinder) Automatisierbarkeit & ErgebnisAufbereitung (CI, DB, Monitoring Systeme) -
Aktionsbereich: BrowserInhalte (HTMLSeiten, SinglePageApps) ObjektAdressierung über DOMElemente Erkennt, wenn Seiten/AJAXRequests
fertig geladen sind (keine waits) Guter Umgang mit modernen Web Frameworks Recorder / SelektorenUIAssistent Assert Funktionen Aktionsbereich: Bildschirm Inhalte (z.B. RichClients, BrowserPlugins) ObjektAdressierung über ImagePatterns (MiniScreenshots) OffBrowserTesting, sieht und steuert das, was der User sieht Flexible RegionPatterns für die Navigation innerhalb des Bildschirms OCRFeatures (experimental) Nutzt java.awt.Robot und openCV -
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 ( ) ; } -
Unterstützung für alle SahiFunktionen / / 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 ) ; -
Fluent API für UITesting / / 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 ) ; -
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 ( ) ; } -
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 -
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 -
What's next? HeadlessExecution Linux: VNC & Docker Windows: ?
Cloudready container für OpenShift (security, source2image) VideoAufzeichnung der Testabläufe zur Fehlerdokumentation WebUI für die TestSuiteVerwaltung und Reporting Externe TestManagementSysteme anbinden (HP QC, TestRail, ...) Darstellung von Testergebnissen in CITools verbessern Selenium als Alternative zu Sahi ermöglichen -
Danke JUG Saxony Day! Tobias Schneck ConSol Software GmbH Franziskanerstraße
38 D81669 München Tel: +498945841100 Fax: +498945841111 tobias.schneck@consol. toschneck [email protected] www.consol.de ConSol