SlideShare ist ein Scribd-Unternehmen logo
Testing mit
Aber das hat gestern noch funktioniert
Samuel Nitsche
@Der_Pesse
derpesse@gmail.com
http://cleandatabase.wordpress.com
Senior Software Entwickler
bei Smart Enterprise Solutions, Pforzheim
Maintainer utPLSQL, Oracle ACE
Live-Code Beispiele:
https://github.com/pesse/sith-demo-db/tree/
apexconn19/presentation_stages
Automatisierte Selbst-Tests
https://www.martinfowler.com/bliki/SelfTestingCode.html
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
Demo
https://github.com/pesse/sith-demo-
db/tree/apexconn19/presentation_stages/1_the_unexpected_menace.sql
Episode I:
The Unexpected Menace
Du bist Entwickler in der Imperialen
Armee, seit gestern zuständig für die
Datenbank, die die Einsatzkräfte der
dunklen Seite organisiert.
Ein mächtiger Sith-Lord hat sich
angekündigt und erwartet eine Last-
Minute-Änderung…
V_GROUPS
GROUP_NAME
1st Squad of 1st Platoon of
2nd Company of 5th Battalion
of 1st Brigade of 1st Division
Ehrung einer Soldaten-
Gruppe
Revan’s Ghosts
??
?
LEADER_NAME
LEADER_RANK_LABEL
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
Ein standardisierter
Test-Prozess
utPLSQL
Ultimate Testing
Framework For PL/SQL
• Frei
• Open-Source
• Aktive Weiterentwicklung
• Komplett in PL/SQL geschrieben
• Umfangreiches Tooling
• Installation:
http://utplsql.org/utPLSQL/latest/userguide/install.html
http://utplsql.org/utPLSQL/latest/userguide/expectations.html
ut.expect(aktuellerWert)
.to_equal(erwarteterWert)
.to_be_greater_than(value)
.to_be_between(min, max)
.to_be_like('%teilWert%')
.not_to_be_null()
.not_to_be_less_than(value)
…
Demo
https://github.com/pesse/sith-demo-
db/tree/apexconn19/presentation_stages/2_regression_hope.sql
Episode II:
Regression Hope
Nach der schrecklichen Erfahrung mit
Darth Ora machst Du Dich auf, das
sagenumwobene Artefakt utPLSQL zu
meistern und Deinen ersten Unit-Test
zu schreiben…
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
Vorteile
• Change-Detectors
• Transportabel
• Regression-Absicherung
• Anforderungs-Bestätigung
Jede Art von automatisiertem Test
Karol D, https://www.pexels.com/photo/blooming-blossom-blur-bright-409696/
Historisch gewachsen
Demo
https://github.com/pesse/sith-demo-
db/tree/apexconn19/presentation_stages/3_the_tdd_awakens.sql
Episode III:
The TDD Awakens
Obwohl der erste Unit-Test die
Bedrohung durch Regression-Fehler
vorerst zurückgeschlagen hat, lauern
überall Gefahren für die Funktionalität
der Applikation.
Doch Du spürst, wie die Macht des Test-
Driven-Development langsam in Dir
erwacht…
Assault
Group 1
Division
1
Brigade 1
Division
2
Brigade 1
Batallion
1
Batallion
2
Company
1
Platoon
1
Company
2
Platoon
1
Platoon
2
Brigade 2
Division
3
Brigade 1
1st Platoon of 2nd Company of 2nd Batallion of 1st
Brigade of 2nd Division of 1st Assault Group
Position innerhalb übergeordneter Gruppe: 1
Label Gruppentyp: Platoon
Ehrenname: Revan‘s Ghosts
Result = Revan‘s Ghosts
Position innerhalb übergeordneter Gruppe: 1
Label Gruppentyp: Platoon
Ehrenname: NULL
Result = 1st Platoon
GET_GROUP_NAME
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
Wie weit gehen mit
Tests?
Automate All the Things!
Automate the Right Things!
Welche
Tests lohnen
sich?
• Risiko
• Nutzen
• Kosteneffizienz
• Historie
• Änderungswahrscheinlichkeit
Angie Jones: Which Tests should we Automate?
@techgirl1908 https://www.youtube.com/watch?v=VL-_pnICmGY
Angie Jones‘ Kategorien
Risiko • Wie gravierend sind die
Folgen?
• Wie wahrscheinlich ist
es, dass ein bestimmter
(Fehler-)Fall auftritt?
Nutzen • Welche neuen
Informationen bietet
mein Test?
• Wie schnell würde ein
Fehler behoben werden?
Kosten-
effizienz
• Wie schnell kann ein Test
geschrieben werden?
• Wie einfach ist es, einen
Test zu schreiben?
Änderungs-
wahrscheinlichk
eit
• Wie oft wird sich der
Code zukünftig ändern?
• Wie selten wird sich die
Funktionalität zukünftig
ändern?
Demo
https://github.com/pesse/sith-demo-
db/tree/apexconn19/presentation_stages/4_attack_of_the_views.sql
Episode IV:
Attack of the Views
Ein Schritt Deiner Mission zu stabiler
Funktionalität ist erreicht, doch nun gilt
es, die alte Legacy-View endgültig los zu
werden.
Ein alter, beinahe vergessener
Bekannter kommt dabei zur Hilfe…
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
https://vignette.wikia.nocoo
kie.net/starwars/images/e/e
4/Artoo_modifications.jpg
Gute Gewohnheiten
Demo
https://github.com/pesse/sith-demo-
db/tree/apexconn19/presentation_stages/5_return_of_the_unit_test.sql
Episode V:
Return of the Unit-Test
Deine View erstrahlt in neu
refaktorisiertem Glanz und zum ersten
Mal seit langem ist die Aussicht auf
Wartbarkeit greifbar.
Nun ist es Zeit, sie vor zukünftigen
Angriffen zu schützen…
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
savepoint before_suite
setup_a_test_group
savepoint before_test
set_some_global_variables
update_group_without_honor_name
reset_some_global_variables
rollback before_test
savepoint before_test
set_some_global_variables
setup_honor_name
update_group_with_honor_name
you_can_just_do_this
reset_some_global_variables
rollback before_test
cleanup_non_transactional_stuff
rollback before_suite
--%suite(Change groupname)
--%beforeall
procedure setup_a_test_group;
--%beforeeach
procedure set_some_global_variables;
--%test(Update group without honor name will set one)
procedure update_group_withouth_honor_name;
--%test(Update group with honor name will change it)
--%beforetest(setup_honor_name)
--%aftertest(you_can_just_do_this)
procedure update_group_with_honor_name;
procedure setup_honor_name;
procedure you_can_just_do_this;
--%aftereach
procedure reset_some_global_variables;
--%afterall
procedure cleanup_non_transactional_stuff;
--%suite(Change groupname)
--%beforeall
procedure setup_a_test_group;
--%beforeeach
procedure set_some_global_variables;
--%test(Update group without honor name will set one)
procedure update_group_withouth_honor_name;
--%test(Update group with honor name will change it)
--%beforetest(setup_honor_name)
--%aftertest(you_can_just_do_this)
procedure update_group_with_honor_name;
procedure setup_honor_name;
procedure you_can_just_do_this;
--%aftereach
procedure reset_some_global_variables;
--%afterall
procedure cleanup_non_transactional_stuff;
Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3
https://de.freeimages.com/photo/steps-in-beach-1541067
Small Step
+ Small Step
+ Small Step
Big Results
• Neue Funktionen
• Gemeldete Fehler
Vorteile/Limit
s
Fehler/Bugs finden
Nachdenken überflüssig
• Change-Detectors
• Transportabel
• Regression-Absicherung
• Anforderungs-Bestätigung
Allgemeine Vorteile
Vorteile/Limit
s
Fehler/Bugs finden
Nachdenken überflüssig
• Perspektivwechsel
• Dokumentation
• Einfachheit
• Erkenntnisgewinn
Im Entwicklungsprozess
Voraussetzung für
Refactoring
utPLSQL
Weitere Features
• Sehr mächtiger Cursor-Vergleich
• Kontexte und hierarchische Suites
• Code Coverage
• Commandline Interface
• Maven-PlugIn
• Java-API
• SQL Developer PlugIn
https://github.com/utplsql
Demo: https://github.com/pesse/sith-demo-db/tree/apexconn19
utPLSQL: http://utplsql.org
Resources: http://utplsql.org/resources
Clean-Database Blog: https://cleandatabase.wordpress.com
utPLSQL Beispiele + Tipps: https://twitter.com/Der_Pesse
Come to the
dark side
…we have stickers.
Möge
die Macht
mit
Euch sein!

Weitere ähnliche Inhalte

Ähnlich wie Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3

GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
Christian Mücke
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos Engineerings
QAware GmbH
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
s0enke
 
Dnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondDnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyond
Ulrich Krause
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
OPITZ CONSULTING Deutschland
 
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
.NET User Group Rhein-Neckar
 
Production-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenProduction-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 Wochen
André Goliath
 
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
LeanIX GmbH
 
Meet Magento - High performance magento
Meet Magento - High performance magentoMeet Magento - High performance magento
Meet Magento - High performance magento
AOE
 
Klappe auf! Was macht die JVM denn da? [Ger]
Klappe auf! Was macht die JVM denn da? [Ger]Klappe auf! Was macht die JVM denn da? [Ger]
Klappe auf! Was macht die JVM denn da? [Ger]
Tobias Frech
 
Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbook
Ulrich Krause
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
Sebastian Springer
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Christian Güdemann
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
Sebastian Springer
 
Enterprise JS
Enterprise JS Enterprise JS
Enterprise JS
Oliver Ochs
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Gregor Biswanger
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
Olaf Lewitz
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
Patrick Baumgartner
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
AOE
 
Dev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei TechnosoftDev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei Technosoft
Bart Zwager
 

Ähnlich wie Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3 (20)

GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
GitLab: CI-Pipelines | PHP Usergroup Hamburg 20.03.2018
 
Der Status Quo des Chaos Engineerings
Der Status Quo des Chaos EngineeringsDer Status Quo des Chaos Engineerings
Der Status Quo des Chaos Engineerings
 
Einführung in Puppet und Vagrant
Einführung in Puppet und VagrantEinführung in Puppet und Vagrant
Einführung in Puppet und Vagrant
 
Dnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyondDnug35 ak-dev.071111-beyond
Dnug35 ak-dev.071111-beyond
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
30. Treffen der .NET User Group Rhein-Neckar mit Constantin Klein - „Bekommen...
 
Production-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 WochenProduction-ready Infrastruktur in 3 Wochen
Production-ready Infrastruktur in 3 Wochen
 
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
 
Meet Magento - High performance magento
Meet Magento - High performance magentoMeet Magento - High performance magento
Meet Magento - High performance magento
 
Klappe auf! Was macht die JVM denn da? [Ger]
Klappe auf! Was macht die JVM denn da? [Ger]Klappe auf! Was macht die JVM denn da? [Ger]
Klappe auf! Was macht die JVM denn da? [Ger]
 
Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbook
 
JavaScript Performance
JavaScript PerformanceJavaScript Performance
JavaScript Performance
 
Das funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPagesDas funktionierte doch schon einmal! - JUnit Testing in XPages
Das funktionierte doch schon einmal! - JUnit Testing in XPages
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 
Enterprise JS
Enterprise JS Enterprise JS
Enterprise JS
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
objectiF extrem
objectiF extremobjectiF extrem
objectiF extrem
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
Dev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei TechnosoftDev ops testautomatisierer bei Technosoft
Dev ops testautomatisierer bei Technosoft
 

Apex NRW Meetup 10/2019 - Testing mit utPLSQL v3

Hinweis der Redaktion

  1. Automatisierte Tests sind “change detectors”, die uns bei Änderung bestehender Funktionalität warnen (unabhängig davon, ob diese Änderung gewollt ist oder - wie in unserem Beispiel - ungewollt) Sie sind transportabel und beliebig oft (nahezu kostenlos) auf unterschiedlichen Systemen wiederholbar Falls sie implementiert wurden, um Bugfixes zu bestätigen, schließen sie einmal aufgetretene Fehler aus Sie können als Bestätigung dienen, dass vereinbarte Anforderungen an die Software erfüllt sind. Im agilen Umfeld können sie sehr hilfreich für die Definition of Done sein
  2. Tests kosten auch etwas: Initialer Aufwand (weit weniger als man denkt) Wartung und Pflege Build-Zeit Energie/Mental Load Gefahren: Zu viel Noise vs. Zu wenig Signal False Positives Langsameres Feedback
  3. Hilfreiche Fragen, um herauszufinden, welche Tests sich lohnen Risiko Wie gravierend sind die Folgen? Wie wahrscheinlich ist es, dass ein bestimmter (Fehler-)Fall auftritt? Nutzen Welche neuen Informationen bietet mein Test? Wie schnell würde ein Fehler behoben werden? Änderungswahrscheinlichkeit Wie oft wird sich der Code zukünftig ändern? Wie selten wird sich die Funktionalität zukünftig ändern? Kosteneffizienz Wie schwierig bzw. aufwändig ist es, einen Test zu schreiben? Wie schnell kann ein Test geschrieben werden?
  4. Die Erstellung von Tests kann helfen, den Fokus vom wie auf das was zu verlagern und eine Funktionalität aus unterschiedlichen Perspektiven zu betrachten Gut und verständlich geschriebene Tests können als Codebeispiel und Dokumentation dienen, wie eine Funktionalität zu verwenden ist Selbst-Tests regen dazu an, „einfachere“ Programmierkonstrukte zu verwenden, da sich diese leichter testen lassen – was wiederum positive Auswirkungen auf die Wartbarkeit des Codes hat Durch das Entwickeln von Tests erhöht sich in der Regel das Verständnis für das Problem, das man zu lösen versucht. Unit-Tests sind also auch eine sehr sinnvolle Methode, um sich einem Problem zu nähern und auszuprobieren.
  5. Der aus meiner Sicht jedoch wichtigste Vorteil, den eine solide, automatisierte Testbasis bietet, ist, dass sie die Voraussetzung für die Entwickler*innen schafft, stetig und selbstbewusst den eigenen Quellcode zu verbessern, also ständiges Refactoring zu betreiben.