Spock und Geb (WebDriver) Wie können freie Werkzeuge zum strukturierten Testen von Web-Applicationen eingesetzt werden?



Ähnliche Dokumente
Spock und Geb: Übersichtlich und nachvollziehbar Testen für alle!

Robuste, lesbare Web-UI-Tests mit Page Object Pattern, Geb und Spock. Stephan Classen

Spock und Geb: Übersichtliche und nachvollziehbare Tests! Ralf D. Müller, Freelancer Tobias Kraft, exensio GmbH

ORM & OLAP. Object-oriented Enterprise Application Programming Model for In-Memory Databases. Sebastian Oergel

Grails. Weiterführende Themen zu Internet- und WWW-Technologien. Matthias Springer. 06. Juni 2011

Christian Meder inovex. Sauberes Grün QS für Android

Web-Anwendungen mit Arquillian testen

Moderne Web- Anwendungen mit

Entwicklung von effizienten UI-basierten Akzeptanztests für Webanwendungen

TESTEN. magazin AUTOMATISIERTES. Lassen Sie die Software für sich arbeiten. JAVA Mag. Logmanagement mit Graylog S. 26

XPages Good to know. Benjamin Stein & Pierre Hein Stuttgart 7. Mai 2015

Web 2. Gang. Python User Group Köln Christopher Arndt

Continuous Integration mit Jenkins

Prüfung Software Engineering II (IB)

Steffen Hofmann Freie Universität Berlin ZEDAT Identity and Customer Management (ICM) Aktueller Stand Shibboleth IdP3

Automatisches Exploratives Testen von Webanwendungen

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

Groovy und CouchDB. Ein traumhaftes Paar. Thomas Westphal

TDD. mit JUnit & Mockito. Tobias Trelle, codecentric

Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn. Testen. Tutorial im Rahmen des Software(technik)praktikums SS 2012

Nathan Burgener. Design by Contract. Modul SWE

Rails Ruby on Rails Ajax on Rails. Clemens H. Cap

Testen von graphischen Benutzeroberflächen. 24. Juni 2015

Groovy on Grails. Informatik-Seminar WS06/07. Alexander Treptow. Groovy on Grails Alexander Treptow (minf2622) 1

Programmiertechnik II

Einführung in die Informatik Tools

Einfaches Testen von Webapplikationen mit

miditech 4merge 4-fach MIDI Merger mit :

E-Commerce: IT-Werkzeuge. Web-Programmierung. Kapitel 6: Datenbankabfragen mit SQL und PHP. Stand: Übung WS 2014/2015

Continuous Delivery mit OpenShift, 2nd Edition

Algorithms & Datastructures Midterm Test 1

ES GIBT EIN LEBEN NACHCI!

Automatisierte Akzeptanztests für ios-apps. Sven Günther it-agile GmbH

Testen und Debuggen von Webanwendungen

Continuous Database Integration mit Flyway

Test-Driven Design: Ein einfaches Beispiel

Geister, Gurken und Halbmetalle. Tools für Web-UI-Acceptance-Tests. Malte Clasen

JavaScript in Drupal

07. November, Zürich-Oerlikon

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Praktikum Software Engineering

Echolot Qualitätssicherung mit Sonar

Exercise (Part XI) Anastasia Mochalova, Lehrstuhl für ABWL und Wirtschaftsinformatik, Kath. Universität Eichstätt-Ingolstadt 1

JGiven: Ein entwicklerfreundliches BDD-Framework für Java

DevOps bei den ID Build-Automatisierung statt Silo-Betrieb

nettrainment V3.0 - Login via BSH Intranet (One-Click)

Webtests und JMeter. Technologien: Überblick Funktionale Tests: Simplelenium Performance Messungen: JMeter Projekt Setup: Gradle, Jenkins

Struts 2 Das Imperium schlägt zurück?

Datenbank-Refactoring mit LiquiBase

DataTables LDAP Service usage Guide

Mocha. Ein Ruby Mocking und Stubbing Framework. von Thilo Utke. Werd ich drüber reden Erst was zu mit.

OERA OpenEdge Reference Architecture. Mike Fechner PUG Infotag 19. Mai 05 Frankfurt

Integration von KS-Hostmonitor in itop

Programmierschnittstelle API 2 für CMS Day Communiqué: Beispiele Standort

Aufbau einer Web 2.0 Community mit Grails. DOAG Konferenz + Ausstellung 2010 Nicole Hoock, esentri consulting GmbH

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

OSGi-basierte Webapplikationen Ein Erfahrungsbericht

Speaker. Sebastian Müller. Entwickler, Berater, Unternehmer PROLAN Datensysteme GmbH. Software Engineering war nie spannender.

Agile Software-Entwicklung im Kontext der EN50128 Wege zum Erfolg

MUSTAFA GERCEK. Bachelor of Science Wirtschaftsinformatik. Geburtsjahr 1992 Profil-Stand Oktober 2015

MOC Entwicklung von ASP.NET MVC 4 Webapplikationen

Es wird das Struts <html:option> Element erläutert und anhand von kleinen Beispielen der Umgang veranschaulicht.

Rene Schneider GEBIT Solutions GmbH. Integrity - ein innovatives Tool zur Acceptance-Test-Automatisierung

Requirements Management mit RequisitePro. Rational in der IBM Software Group. Der Rational Unified Process als Basis für die Projektarbeit

Testen und Testautomatisierung in agilen Projekten

Wann soll ich mocken? XP Days Germany David Völkel

Algorithmen und Programmieren II Einführung in Python

Preisliste für The Unscrambler X

Anleitung. Integration von Kentix Geräten in den OpManager

FIREPLACE EXPANDABLE BANNER v1.01

GEB UND GRAPHENE IM VERGLEICH. Stefan Hildebrandt

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Beispiel: DB-Mock (1/7)

Micro Focus Unit Testing Framework in Visual COBOL 3.0. Rolf Becking 29.August 2017

NoSQL mit Postgres 15. Juni 2015

NEWSLETTER. FileDirector Version 2.5 Novelties. Filing system designer. Filing system in WinClient

Entwicklung von qualitativ hochwertigen APEX Anwendungen. Sven Böttcher Consultant, Apps Associates GmbH

Exercise (Part VIII) Anastasia Mochalova, Lehrstuhl für ABWL und Wirtschaftsinformatik, Kath. Universität Eichstätt-Ingolstadt 1

SEARCH DRIVEN APPLICATIONS MIT DEM CONTENT SEARCH WEBPART

Ruhr.pm XML-Daten verarbeiten mit XML::LibXML Autor: Datum:

Copyright 2014, Oracle and/or its affiliates. All rights reserved.

MOBILE ON POWER MACHEN SIE IHRE ANWENDUNGEN MOBIL?!

Structr: Neues CMS auf Basis der Graphdatenbank Neo4j 48. Deutschland 9,80. Java 8 Streams. Seiteneffekte: verboten oder erlaubt?

JUnit - Test Driven Development. Bernhard Frey, Thorsten Stratmann, Jackson Takam, Michel Müller 1

Effizientes und effektives Testen von Embedded SW mit Google Test. Michael Bernhard

Open-Source-Werkzeugkasten für Software-QS :15-11:15 Uhr Zagrebsaal I

Indexing und Performance Tuning

Die freie Programmiersprache Python mit Beispielen für ihren praktischen Einsatz. Python User Group Köln

Refactoring Unit-Tests

Erfahrungen und Erkenntnisse. Klaus Richarz, HBT GmbH

Softwareentwicklung mit JAVA EE

Workflow, Business Process Management, 4.Teil

JUnit. HierarchicalContextRunner. Mehr Struktur. TDD. Clean Code. Verantwortung. Skills. Namics. Stefan Bechtold. Principal Software Engineer.

SAP SharePoint Integration. e1 Business Solutions GmbH

HP Adaptive Infrastructure

COSMOS-Portal - Benutzerhandbuch

Neuigkeiten bestehender Komponenten

Entwicklung von effizienten UI-basierten Akzeptanztests für Webanwendungen

Source Code Konverter Online: (VB.net <-> C#) Kommerzielle Produkte (VB, C#, C++, Java) Code Nachbearbeitung in der Praxis...

.NET. René Leupold. User Group Bern. Follow dnugbe on twitter

Transkript:

Stuttgarter Test-Tage 21. & 22. März 2013 Spock und Geb (WebDriver) Wie können freie Werkzeuge zum strukturierten Testen von Web-Applicationen eingesetzt werden? Christian Baranowski

Willkommen Christian Baranowski Software Qualitätssicherung @ SEITENBAU GmbH Konstanz (DE) Custom Software Solutions E-Government Solutions Identity Management and SSO Solutions www.seitenbau.de Vorstand OSGi Users' Forum Germany Co-lead (mit Jochen Hiller) German Enterprise Working Group. OSGi Code Camp

Werkzeuge Mockito Groovy Gradle Spock Geb WebDriver

Test Design Mockito Groovy Gradle Spock Geb WebDriver Test Daten Test Binding Test Logik

Warum Spock? Sehr einfaches BDD Werkzeug für die JVM, kann schnell erlernt werden Biete eine ausdrucksstarke DSL zur Spezifikation von Tests, insbesondere für Parametrisierte Tests (Data Driven Tests) Spock kann sowohl für Unit- wie Systemtests genutzt werden JUnit Kompatibel - Zur Ausführung wird JUnit genutzt, Integration in IDEs, Build-Tools (Ant, Maven, Gradle...) und CI (Jenkins) Spock vereint die besten Features aus bewährten Tools wie JUnit, JMock und RSpec

Spock Given When Then def "spock test with given when then block"() { given: "Array with one element" def data = ["Some Data"] when: "Pop a element from the array" data.pop() then: "Size of the array is zero" data.size() == 0

Blocks given: when: then: expect: and: setup: cleanup: Vorbedingung, Data Fixtures, Setup Zustand SUT wird verändert Assertions, Prüfung des neuen Zustands Kurzvariante für when & then Unterteilung in weitere Blöcke Alias für den given Block Cleanup innerhalb eines Tests

Blocks def "spock test with some blocks"() { given: def basar = mock(basar) when(basar.gettotal()).thenreturn(100l) when: def total = basar.gettotal() then: total == 100L and: def user = basar.finduserwithid(100) then: user == null cleanup: basar = null

Lifecycle class LifecycleSpec extends Specification { def setupspec() { println "01 - setup Spec" def setup() { println "02 - setup" def "simple spock test"() { expect: def data = [] data == [] def cleanup() { println "04 - cleanup" def cleanupspec() { println "04 - cleanup Spec"

Vier Phasen Test (Four-Phase Test) def setupspec() { def setup() { 1 Setup Fixure def "spock test"() { when: Exercise 2 then: Verify Teardown 3 4 SUT def cleanup() { def cleanupspec() {

Power Assertion def christian = new User(id: 1, name: "Christian") def martin = new User(id: 1, name: "Martin") assert christian.name == martin.name christian.name == martin.name Martin User{id=1, basarnumber='null', name='martin', email='null', lastname='null' false 5 differences (44% similarity) (Ch)r(is)ti(a)n (Ma)r(- - )ti(- )n Christian User{id=1, basarnumber='null', name='christian', email='null', lastname='null'

Helper Method def "use helper method in spock test"() { when: def user = new User(name: "Christian", lastname: "Baranowski") then: referentmatches(user) def referentmatches(user) { assert user.name == "Christian" assert user.lastname == "Baranowski"

Parameterized Test @Unroll def "edit seller '#basarnumber', '#name' and '#lastname'"() { when: def updateduser = updateuser(basarnumber, name, lastname) then: updateduser.basarnumber == basarnumber updateduser.name == name updateduser.lastname == lastname where: basarnumber name lastname "100" "Christian" "Baranowski" "ABC" "Christian" "Baranowski" "100" "" "Baranowski" "100" "Christian" ""

Parameterized Test @Unroll def "edit seller '#basarnumber', '#name' and '#lastname'"() {... where: basarnumber name lastname "100" "Christian" "Baranowski" "ABC" "Christian" "Baranowski" "100" "" "Baranowski" "100" "Christian" ""

Parameterized Test @Unroll def "create a #user"() { when: basar.saveuser(user) then: basar.finduserwithid(user.id) == user where: user << [new User(id: 1), new User(id: 2), new User(id: 3)]

Warum Geb? Geb bietet eine Abstraktion und Vereinfachung der WebDriver API für Groovy Dazu werden die dyamischen Sprachfunktionen von Groovy genutzt. JQuery like API für Selenium WebDriver Geb bietet einen Mechanismus zur Seitenabstraktion lesbare Oberflächentests Einfacher waitfor{ mir Groovy Closure für dynamische Web-Anwendungen Groovy GString bietet einfache JavaScript Integration in Tests

Geb JQuery like API // CSS 3 selectors $("div.some- class p:first[title='something']") // Find via index and/or attribute matching $("h1", 2, class: "heading") $("p", name: "description") $("ul.things li", 2) // 'text' is special attribute for the element text content $("h1", text: "All about Geb") // Use builtin matchers and regular expressions $("p", text: contains("geb")) $("input", value: ~/\d{3,- \d{3,- \d{3,/) // Chaining $("div").find(".b") $("div").filter(".c").parents() $("p.c").siblings()

Page Objects class BasarPage extends Page { static url = "static/basar.html" static at = { title == "Basar" static content = { basarform { $("form") addbutton { $("#addcartitem") to BasarPage at BasarPage basarform.with { basarnumber = number price = preis addbutton.click()

Top-Down Integration View View Controller Controller Business Logic Mock Data Top-Down Integration DB n-n Systemtest

Top-Down Integration @Autowired Basar basarmock def "create a new seller"() { given: def user = [basarnumber: "100", name: "Christian"] when(basarmock.findallusers()).thenreturn([]) when: go "$basarurl/static/sellers.html" waitfor { $("#newuser") $("#newuser").click() waitfor { $("#basarnumber") $("#basarnumber").value(user.basarnumber) $("#name").value(user.name) $("#saveuser").click() waitfor { $("#successfullcreated") then: ArgumentCaptor<User> userargumentcaptor = ArgumentCaptor.forClass(User) verify(basarmock).saveuser(userargumentcaptor.capture()) and: User newuser = userargumentcaptor.value newuser.basarnumber == user.basarnumber newuser.name == user.name

JavaScript Support in Geb def users = js.exec(''' var users = [] var rows = $("#usersbody tr") rows.each(function() { var cells = $(this).children().not(".rightcell") var user = { basarnumber: $(cells[0]).text(), vorname: $(cells[1]).text(), nachname: $(cells[2]).text(), email: $(cells[3]).text() users.push(user) ) return users ''') then: users == [[basarnumber:"100", vorname: "Christian", nachname: "", email: ""], [basarnumber:"101", vorname: "Martin", nachname: "", email: ""]] JS

Firebug Support def firebug = getclass().getresource("/firebug- 1.11.2- fx.xpi") def profile = new FirefoxProfile(); profile.addextension(new File(firebug.file)); browser.driver = new FirefoxDriver(profile)

Q&A Twitter @tux2323 Let s write some Groovy Spock Geb...