javascript-apps moderner entwicklung testgetriebene · – externe webseiten nicht im test besuchen...

35
© chemmedia AG Testgetriebene Entwicklung moderner JavaScript-Apps Bettina Helgenlechner Martin Kutter

Upload: others

Post on 08-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

© chemmedia AG

Testgetriebene Entwicklung moderner JavaScript-AppsBettina HelgenlechnerMartin Kutter

Page 2: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

© chemmedia AG

Hallo.Schön, euch kennen zu lernen!

Portrait

Portrait

Portrait

Bettina HelgenlechnerSoftwareentwicklerin

Martin KutterSoftwaredesigner chemmedia AG

Experten für globalen Wissentransfer

[email protected]

Page 3: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

© chemmedia AG

Die chemmedia AG, Anbieter digitaler Kommunikations- und E-Learning-Lösungen in Deutschland. Wir bieten ein großes Portfolio an Beratungs-, Technologie- und Content-Services und sorgen mit eigenen Softwareprodukten seit 20 Jahren für maßgeschneiderte Lösungen im unternehmensweiten Wissens- und Kompetenzmanagement.

Über uns

Gründung 1997

Profitabel, inhabergeführt und unabhängig seit Gründung (kein Venture Capital)

Über 50 Mitarbeiter aus den BereichenEntwicklung, Consulting, Service & Support

370 Kunden mit über 9 Mio Lernern in 38 Ländern

Hauptsitz ChemnitzBüros in Dresden und Leipzig

Page 4: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Erstellung, Verteilung und Auswertung.

Knowledgeworker ist eine Software-Suite für überzeugende digitale Inhalte, mit denen Sie Mitarbeiter, Kunden und Partner weltweit erreichen.

So gestalten Sie nachhaltig die digitale Zukunft Ihrer Organisation. Wir stehen Ihnen dabei zur Seite.

Page 5: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Bild

– Computer findet Bugs

– Code wird besser strukturiert

– Mehr Vertrauen in den Code (“Testen statt hoffen”)

– Versicherung gegen zukünftige Bugs

Warum automatisierte Tests schreiben?

Page 6: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Arten von Tests

Static Unit Integration End-to-end

Page 7: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Testbare Aspekte

– Geschäftslogik: Unittests

– Präsentationslogik: Komponententests

– Features und Workflows: End-to-end Tests

Page 8: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

“Fertig, jetzt muss ich nur noch Tests schreiben.”

Page 9: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Testgetriebene Entwicklung

Test schreiben Test ausführen Code anpassen

pass

fail

Refactoring

Page 10: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

© chemmedia AG

Testgetriebene vs. nicht testgetriebene Entwicklung

Page 11: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Unit Testing

– Sicherstellen, dass sich jede Einheit verhält, wie erwartet

– Einheit: kleinster testbarer Teil der Software, z.B. eine einzelne Methode/Funktion

– Verwendung von Stubs, Mocks und Spies, um Einheiten zu isolieren

– Code muss in testbarer Weise geschrieben werden

Page 12: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

1. Zu testenden Zustand herstellen

2. Unit aufrufen/ausführen

3. Prüfen, dass der erwartete Zustand besteht

Page 13: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Jest

– Logik und Komponenten testen

– Node-Umgebung, nicht Browser

– Syntax:describe(‘foo’, () => {

it(‘should do the right thing’, () => {expect(foo()).toEqual(‘hello world’);

});});

– Gesamtes Test-Toolkit an einer Stelle, inkl. Coverage-Reports

– Kompatibel mit React, Angular, Vue, TypeScript, Babel, Node...

Page 14: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Unit Testing Best Practices

– Alles innerhalb des Tests definieren

– Jeder Test muss eigenständig sein

– Testdateien neben den zu testenden Dateien anlegen

– Code testbar machen:

– So wenig Geschäftslogik wie möglich innerhalb von Komponenten

– So viele pure Funktionen wie möglich

– Dependency Inversion

– Schwieriges Test-Setup indiziert schlechtes Code Design

– Tests müssen Teil von Code Review und CI Builds sein

Page 15: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Das Orakelproblem

Camillo Miola (Biacca) (Italian (Neapolitan), 1840 - 1919)The Oracle, 1880, Oil on canvas108 × 142.9 cm (42 1/2 × 56 1/4 in.), 72.PA.32The J. Paul Getty Museum, Los Angeles

http

s://m

ediu

m.co

m/y

ld-b

log/

the-

orac

le-p

robl

em-c

c02b

42a1

f44

Page 16: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Property-Based Testing

– Testfälle per Zufallsgenerator erstellen

– Anhand von allgemein gültigen Eigenschaften prüfen

– Knackpunkt: unveränderliche Eigenschaften ableiten

Beispiel: Zahlenarray aufsteigend sortieren

Page 17: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Code Coverage

– Prüfen, ob ein Pull Request die Coverage verbessert oder verschlechtert

– Sicherstellen, dass Tests tatsächlich die ganze Funktionalität abdecken

Page 18: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Istanbul.js

Page 19: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –
Page 20: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Component Testing

Page 21: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Jest Snapshots

Page 22: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Enzyme

– Test-Utility, mit der man den Output von Komponenten untersuchen, manipulieren und durchqueren kann

– Nur kompatibel mit React

– Kann mit verschiedenen Test Runners verwendet werden (z.B. Jest)

– Kann

– Klick-Events etc. simulieren

– Komponentenfehler simulieren

– Lifecycle-Events auslösen

– Props, State und Context verändern

Page 23: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Storybook

– UI-Entwicklungs- und Testumgebung

– Komponenten isoliert darstellen und mit ihnen interagieren

– Stories beschreiben die jeweiligen Use Cases der Komponenten

– Ökosystem mit vielfältigen Add-Ons

– Demo: https://storybooks-official.netlify.com/?path=/story/ui-notifications-item--simple

Page 24: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Component Testing Best Practices

– Brüchige Selektoren vermeiden

– Tests für Textinhalte nur schreiben, wenn es wichtig ist, dass sich der Text nicht ändert

Page 25: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

End-to-EndTesting

Page 26: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Cypress

– Test Runner für E2E-Tests

– Wie ein Nutzer mit der App interagieren

– Framework-agnostisch (React, Angular, Vue…)

– Unterstützt (vorerst) nur Chrome

– Basiert nicht auf Selenium

– Tests werden ausschließlich in JavaScript geschrieben

Page 27: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Selenium

– “Selenium automates browsers.”

– Chrome, Firefox, IE7+, Edge, Safari, Opera

– Browser Testing mit Browserstack

Page 28: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

E2E-Testing Best Practices

– Externe Webseiten nicht im Test besuchen (OAuth, Email…)

– Besser mehrere Assertions in einem Test zusammenfassen

– Anwendungsstatus vor statt nach dem Ausführen eines Tests wiederherstellen

Page 29: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Visual Regression Testing

– Unerwartete Änderungen in der UI entdecken und überprüfen

– Responsive Tests

– Cross-Browser Tests

– z.B. mit percy.io

Page 30: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

http

s://b

log.

perc

y.io/

rede

signi

ng-w

ith-c

onfid

ence

-d117

9984

5ecb

Page 31: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Zusammenfassung

– Unit Tests

– Jest

– Property-based testing mit testcheck

– Component Tests

– Jest Snapshots

– Enzyme

– Storybook

– End-to-end Tests

– Cypress

– Selenium

Page 32: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Und nu?

– Tests für behobene Bugs

– Tests für Änderungen/neue Features

Page 33: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

© chemmedia AG

Fragen?

Was habt ihr für euch mitgenommen?

Werdet ihr zukünftig etwas anders machen?

Page 34: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

Literatur– Jest

– https://jestjs.io/docs/en/getting-started– https://facebook.github.io/create-react-app/docs/running-tests– https://jestjs.io/docs/en/next/architecture– https://medium.com/yld-blog/the-oracle-problem-cc02b42a1f44– http://www0.cs.ucl.ac.uk/staff/m.harman/tse-oracle.pdf

– Property-based testing– http://leebyron.com/testcheck-js/– http://jsverify.github.io/– https://www.propertesting.com/book_what_is_a_property.html

– Snapshot testing– https://jestjs.io/docs/en/snapshot-testing– https://benmccormick.org/2016/09/19/testing-with-jest-snapshots-first-impressions/

– Enzyme– https://airbnb.io/enzyme/– https://jestjs.io/docs/en/tutorial-react#enzyme

– Storybook– https://storybook.js.org/– https://github.com/storybooks/storybook/tree/master/addons/storyshots/storyshots-core– https://github.com/mthuret/storybook-addon-specifications

– Cypress– https://www.cypress.io/– https://youtu.be/Fj4Vm9m95Io?t=6087

Page 35: JavaScript-Apps moderner Entwicklung Testgetriebene · – Externe Webseiten nicht im Test besuchen (OAuth, Email…) – Besser mehrere Assertions in einem Test zusammenfassen –

© chemmedia AG

Vielen Dank für eure Aufmerksamkeit.

chemmedia AGParkstraße 35D-09120 Chemnitz

Vorstandsvorsitzender Dipl.-Wirt.-Inf. Lars Faßmann

Vorsitzende des Aufsichtsrates: Sandra Deyringer

Telefon: +49 371 49370 0Fax: +49 371 49370 201E-Mail: [email protected]