1 2 3 4 5 6 7 8 9 10

Inhaltsbox Beispieltext . Zweite Ebene - Dritte Ebene

Kundenlogoposition horizontal (hochformatige Logos weiter nach oben) 1 Kapitel 1

2 Kapitel 2 Version 1.29 12.08.2013 3 Kapitel 3 1 4 Kapitel 4

5 Kapitel 5 Kundenlogoposition vertikal 6 Kapitel 6

7 Kapitel 7

8 Kapitel 8 Qualitätssicherung in ADF Projekten der IKB Deutsche Industriebank AG 1 Kapitel 1 2 Kapitel 2 Torsten Kleiber, DOAG Development, 4.6.2014 3 Kapitel 3

4 Kapitel 4

5 Kapitel 5

6 Kapitel 6

7 Kapitel 7

8 Kapitel 8

Mezzanine Minderheitsbeteiligung Börsengang/Kapitalerhöhung Convertible Bond . [Text] . [Text] . [Text] . [Text] Beschreibung

. [Text] . [Text] . [Text] . [Text] Laufzeit

. [Text] . [Text] . [Text] . [Text] Investoren

. [Text] . [Text] . [Text] . [Text] Dokumentation

. [Text] . [Text] . [Text] . [Text] Marketing

. [Text] . [Text] . [Text] . [Text] EK-Stärkung

. [Text] . [Text] . [Text] . [Text] Gesetzl. Rahmen

. [Text] . [Text] . [Text] . [Text] Vorteile

. [Text] . [Text] . [Text] . [Text] Nachteile

Bsp.-Zeile mit . [Text] . 1. Hervorhebung von . [Text] . 2. Hervorhebung von Hervorhebungen Zelle/Spalte/Zeile Zelle/Spalte/Zeile

2010 2011 2012 2013E

NRW 1.234,00 1.234,00 1.234,00 1.234,00

Hessen 1.234,00 1.234,00 1.234,00 1.234,00

Bayern 1.234,00 1.234,00 1.234,00 1.234,00

Baden- 1.234,00 1.234,00 1.234,00 1.234,00 Württemberg

Sachsen 1.234,00 1.234,00 1.234,00 1.234,00

Niedersachsen 1.234,00 1.234,00 1.234,00 1.234,00

Rheinland-Pfalz 1.234,00 1.234,00 1.234,00 1.234,00

Thüringen 1.234,00 1.234,00 1.234,00 1.234,00

Berlin- 1.234,00 1.234,00 1.234,00 1.234,00 Brandenburg

Gesamt 1.234,00 1.234,00 1.234,00 1.234,00 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 IKB – Bank des Mittelstands 2

Blocktitel 6,6 12pt 5,8 IKB im Überblick Regionale Präsenz Block oben . Seit 90 Jahren Finanzierungspartner des Mittelstands . 2.500 Kunden in Deutschland und Europa1) . Aktionäre: Lone Star 91,5 %, Streubesitz 8,5 % . ca. 1.500 Mitarbeiter . Bilanzsumme: € 25,8 Mrd.2) London 2) Hamburg . Kernkapitalquote: 11,21 % Berlin Düsseldorf (HQ) 0,6 Frankfurt

Stuttgart Blocktitel 0,8 München 12pt 1,6 Leistungsspektrum Paris Block unten Kredit Capital Markets Advisory Mailand Bilaterale Debt M&A Finanzierung Capital Markets Equity Madrid Fördermittel Debt Advisory Capital Markets Konsortial- Derivate Corporate Finance finanzierung

Leasing Sales & Trading Risikomanagement 7,8

8,2 1) Zzgl. 18.000 Kunden im Leasing-Geschäft Fußnote 2) Stand: 30. September 2013 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Über mich 3

Blocktitel 6,6 Torsten Kleiber 12pt 5,8 Block Software Architekt, Entwickler oben Kreditplattform

15 Jahre IKB, 18 Jahre Oracle Erfahrung von .Designer / Forms / Reports .PL/SQL 0,6

Blocktitel 0,8 hin zu 12pt 1,6 Block .Architektur unten .Fusion Middleware .SOA Mediator .ADF .Development Tools .Development Lifecycle .Release Management 7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Agenda 4

Blocktitel 6,6 12pt 5,8 Block ADF in der IKB Warum und wie wird ADF in der IKB eingeführt? oben Welche Ziele werden bei den QS unterstützenden Zielstellung QS Prozessen und Tools verfolgt? Warum wurden welche IDE und welcher CI Server Toolauswahl IDE / CI ausgewählt? Statische Welche Tools zur statischen Codeanalyse werden

0,6 Codeanalyse wie bei der IKB genutzt?

Blocktitel 0,8 12pt 1,6 Welche Tools für den automatischen Test werden wie Block Automatisierter Test unten bei der IKB genutzt? Wie ermittelt man, wieviel und welcher Code getestet Code Abdeckung ist? Evaluierung Welche Tools befinden sich noch in der Evaluierung? Fazit Der aktuelle Stand in den ADF Projekten.

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 ADF in der IKB 5

Blocktitel 6,6 12pt 5,8 .Ausgangspunkt: Migration Eigenentwicklung zur Kredit und Darlehensverwaltung Block oben .Forms & Reports  ADF & ??? .Entscheidung ADF hauptsächlich wegen Strategie bei Oracle Fusion Applications .> 500 Forms, > 60 Menüs, > 40 Bibliotheken, > 350 Reports .Ca. 50% der Module in englisch .Startpunkt 2012 Migration 1 Eigenentwicklung MS Access  ADF mit 6 Personen .Gleichzeitig Einführung agiler Methoden (Kanban) 0,6 .Aktuell 16 Entwickler + 2 Tester + 3 Coaches (Opitz Consulting, esentri) Blocktitel 0,8 12pt 1,6 .Entwicklung neuer User Stories wenn möglich in ADF (SEPA, FATCA, …) Block unten .Projekt zur Ablösung Forms & Reports über ca. 3 Jahre .Aktuell ADF Version 11.1.1.5, Migration nach 12c ist für August 2014 geplant .Internet Explorer als Browser gesetzt

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Zielstellung Qualitätssicherung 6

Blocktitel 6,6 12pt 5,8 .kontinuierliche qualitative Verbesserung der Code Basis – keine 100%! Block oben .Erlernen von Best Practices .Prüfen von Entscheidungen z.B. zu Architektur, Best Practices .Konfiguration von gegebenen Regeln .Erstellung von eigenen Regeln .Dokumentation bewusster Abweichungen von Regeln im Code und Unterbindung der weiteren Verletzung 0,6 .Integration der Regeln in die IDE des Entwicklers Blocktitel 0,8 12pt 1,6 .Integration der Regeln in den Continuous Integration Prozess Block unten .Konsequenzen im Delivery-Prozess bei Verletzung kritischer Regeln .automatischer Regressionstest im Backend und der GUI .Messung der Codeabdeckung durch Tests

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Toolauswahl – IDE und Continuous Integration Server 7

Blocktitel 6,6 12pt 5,8 .IDE Block oben - Standard ADF Stack (ADF BC, ADF Controller, ADF Faces) in der IKB, damit JDeveloper als IDE gesetzt. .Continuous Integration Server - zunächst Oracle als CI Server eingeführt - Spezielle Anforderungen an Jobs durch Hudson nicht lösbar - Support bzw. ausreichende Weiterentwicklung konnte nicht beobachtet werden 0,6 - ist ein Fork von Hudson nach der Übernahme von Sun durch Oracle Blocktitel 0,8 12pt 1,6 - Kostenlos, aber kostenpflichtiger Support möglich Block unten - Große Community - 600+ Plugins - Umstieg auf Jenkins nach Prüfung der Anforderungen in unter einem Tag

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Vorbereitungen 8

Blocktitel 6,6 12pt 5,8 .Zentrale versionierte Ablage aller Tools (außer Jenkins Block oben Plugins) wegen Upgrades .Kann sowohl für JDeveloper als auch Jenkins verwendet werden .Beispiel der Präsentations-Umgebung verfügbar auf: https://github.com/tkleiber/de.kleiber.ciroot.git

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse - Tools 9

Blocktitel 6,6 12pt 5,8 FindBugs PMD Checkstyle Block oben . Bugs . Potenzielle Probleme . Coding Standards . Bugs Sucht / Prüft . Nicht benötigten und suboptimalen Code . Überkomplizierte Ausdrücke . Duplizierten Code (CPD)  Nur Java Code Java, JSP, JSF, XML, XSL …  Nur Java Code  Schwer konfigurierbar Einfach konfigurierbar Einfach konfigurierbar  Schwer erweiterbar Einfach erweiterbar (Java, Einfach erweiterbar (Java) XPath) 0,6 Vor- / Nachteile Unterdrückung von Unterdrückung von Meldungen im Code möglich, Unterdrückung von Meldungen im Code möglich Blocktitel 0,8 aber komplex Meldungen im Code möglich 12pt 1,6 Block  Bytecode erforderlich unten Schnell Diverse IDE‘s Diverse IDE‘s Diverse IDE‘s  Nicht JDeveloper JDeveloper (rudimentär)  Nicht JDeveloper ANT ANT ANT Integrationen Maven Maven Maven Jenkins Jenkins Jenkins Hudson Hudson Hudson

Fazit: Die Tools decken verschieden Zwecke gut ab, sind im JDeveloper aber nur unzureichend integriert. 7,8 

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Anpassungen PMD 10 Blocktitel 6,6 .Aufgrund XML-Analyse und XPath-Regeln bot sich PMD für eigene Regeln an 12pt 5,8 Block oben .Anpassung für XML-Analyse von JDeveloper/ADF-Dateien in %pmd-src%\src\main\java\net\\pmd\lang\Language.java

XML("XML", null, "xml", XmlRuleChainVisitor.class, "xml"),  XML("XML", null, "xml", XmlRuleChainVisitor.class, "xml", "jws", "jpr", "cpx", "xcfg", "dcx", "jpx"), 0,6 Blocktitel 0,8 12pt 1,6 Block .PMD bauen (hier Windows) unten cd %pmd-src%\ set JDEV_HOME=:\Oracle\JDev111240 set JAVA_HOME=%JDEV_HOME%\jdk160_24 %JDEV_HOME%\\apache-maven-2.2.1\bin\mvn clean package

7,8 .Datei in %ciroot%\root\lib\pmd\lib mit der aus %pmd-src%\target ersetzen

8,2 Fußnote 8pt 9,2

12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Regeln (1) 11

Blocktitel 6,6 12pt 5,8 .Standardregeln Block oben - Checkstyle: sun_checks.xml wird mit ausgeliefert - PMD: Verzeichnis rulesets in Source src\main\resources oder in pmd-x.x.x.jar .Konfiguration, z.B. Checkstyle - Javadoc Tag Prüfung ist bei privaten Variablen nicht erforderlich, wenn dafür kein Javadoc erzeugt werden soll (und die Namen selbstdokumentierend sind)

0,6 Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Regeln (2) 12

Blocktitel 6,6 12pt 5,8 .Neue Regeln, PMD: Application Modules sollen auf JDBC Data Sources basieren Block oben 1

0,6

Blocktitel 0,8 12pt 1,6 Block unten 7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – 13

Blocktitel 6,6 12pt 5,8 .nur für PMD existiert für JDeveloper ein rudimentäres Plugin (gepflegt von mir) Block oben .Checkstyle, PMD, FindBugs, JDeveloper in Version 11.1.1.5 und Jenkins unterstützen Ant .Output in bestimmten Format ermöglicht Sprung zum im JDeveloper .Checkstyle und PMD erfüllen Format, für FindBugs wurde ein Request angelegt .Also: allgemeines Ant-Skripts mit folgenden Anforderungen - Welche Priorität der Regelverstöße soll angezeigt werden? 0,6 - Wo liegen die zu analysierenden Source-Verzeichnisse oder –Dateien? Blocktitel 0,8 12pt 1,6 - Wo ist das Middleware- und JDeveloper-Verzeichnis? Block unten - Relative Pfade für Wiederverwendbarkeit in JDeveloper und Jenkins - Einschränkung auf Java- und ADF-Dateien - Ausführung von FindBugs immer auf mindestens dem Projekt zur Datei wg. Vermeidung False Positives bezüglich Kopplungsregeln

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – JDeveloper External Tool 14

Blocktitel 6,6 12pt 5,8 .Tools  External Tools  New Block oben .Type: Apache Ant .Ant Buildfile: %ciroot%\root\check.xml .Selected Targets: all (Default) .Properties: - external.tool.sources.dir: ${file.dir} - external.tool.sources.file: ${file.name} 0,6 - external.tool.sources.file.extension: ${file.ext} Blocktitel 0,8 12pt 1,6 - external.tool.project.dirname: ${project.dirname} Block unten - external.tool.workspace.dir: ${workspace.dir} .Caption for Menu Items / ToolTip Text: Checkstyle, FindBugs and PMD this .Integration: Alle Checkboxes

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Unterdrückung von Verletzungen 15

Blocktitel 6,6 12pt 5,8 .Ziele Block oben - Dokumentierte Unterdrückung im Einzelfall - Bestimmte Dateimuster (z.B. generierte Dateien) von der Analyse filtern .Für die verschiedenen Tools gibt es verschiedene Arten der Unterdrückung, z.B.: - FindBugs: - Annotations (Hierzu muss FindBugs.jar in den Pfad genommen werden!): @edu.umd.cs.FindBugs.annotations.SuppressFBWarnings(value="", 0,6 justification="Begründung") Blocktitel 0,8 12pt 1,6 - Konfiguration: Filter Block unten - PMD: - Annotations: @SuppressWarnings("PMD.") - Kommentare: // NOPMD (konfigurierbar) - Regelkonfiguration: Violation Suppress Regex / Xpath - Checkstyle - Kommentare: Checkstyle\:ON / Checkstyle\:OFF

7,8 - Konfiguration: Filter (Regeln, Dateien, Zeilen)

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Offene Punkte / Tasks 16

Blocktitel 6,6 12pt 5,8 • Als Tasks werden bestimmte Tags bezeichnet, die der Kennzeichnung von Block oben unfertigem oder zu korrigierenden Code dienen • Workarounds für Fehler in Komponenten, von denen man abhängig ist, werden typischerweise so gekennzeichnet • Typische Tags sind • FIXME • TODO 0,6 • TASK Blocktitel 0,8 12pt 1,6 • Umfang des Codes mit solchen Tags sollte regelmäßig minimiert werden Block unten • Tasks werden in fast allen IDE‘s und CI Servern konfigurierbar unterstützt

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Offene Punkte / Tasks im JDeveloper 17

Blocktitel 6,6 12pt 5,8 .11.x: View  Tasks Block oben

0,6

Blocktitel 0,8 12pt 1,6 .12.x: Window  Block unten Issues  Live Issues .Bugs: - nur *.java Dateien - Marker fehlt - Issues Scope falsch

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Demo JDeveloper 18

Blocktitel 6,6 12pt 5,8 .Statische Codeanalyse im JDeveloper Block oben .Beseitigen einer kritischen Verletzung .Erneute Analyse, um Beseitigung der Verletzung nachzuweisen .Unterdrückung einer Verletzung .Erneute Analyse, um Unterdrückung der Verletzung nachzuweisen .Anzeige eines Tasks .Erledigen eines Tasks 0,6 .Commit Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Jobs & Plugins 19

Blocktitel 6,6 12pt 5,8 Block oben

.CI Root: stellt aktuelles %ciroot% Verzeichnis für alle anderen Jobs bereit .Summit – Build nach Commit: - Pollen VCS und Checkout bei Änderungen - Umgebung für Build konfigurieren (EnvInject Plugin) 0,6 - Build der Deploymentprofile der Applications Blocktitel 0,8 12pt 1,6 - Clone Jenkins Workspace für folgende Jobs (Clone Workspace SCM Plugin) Block unten .Summit – Statische Codeanalyse: - Jenkins Workspace aus Build nach Commit (Clone Workspace SCM Plugin) - Umgebung für Codeanalyse konfigurieren (EnvInject Plugin) - Ausführen der Codeanalyse - Veröffentlichen Ergebnisse (FindBugs, PMD, Checkstyle, Task Scanner Plugin) - Zusammenfassung der Einzelergebnisse (Analysis Collector Plugin) 7,8 8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Abbruch bei hochpriorisierten Regelverstößen 20

Blocktitel 6,6 12pt 5,8 .Regelverstöße, die zu potenziellen Fehler führen, brechen auch den Job in Block oben Jenkins .Beispiel: Application Modules sollen auf JDBC Datasourcen basieren (JDBC Url‘s verweisen immer auf dieselbe Datenbank, eine JDBC Datasource ist dagegen im Application Server für die entsprechende Umgebung konfiguriert) .Separates Target im Ant-Skript

0,6

Blocktitel 0,8 … 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Demo Jenkins 21

Blocktitel 6,6 12pt 5,8 .Job - Trends Block oben .Einzelergebnisse PMD -> PMD Warnungstypen .Statische Analyse Ergebnis (Zusammenfassung) .Job Instanz - Änderung Ergebnisse

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Trends 22

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Einzelergebnisse Offene Punkte 23

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Einzelergebnisse Checkstyle 24

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Einzelergebnisse FindBugs 25

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Einzelergebnisse PMD 26

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Jenkins Einzelergebnisse PMD Warnungstypen 27

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Statische Analyse Ergebnis (Zusammenfassung) 28

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Statische Codeanalyse – Änderung Ergebnisse 29

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - Tools 30

Blocktitel 6,6 Mockito / JUnit Selenium 12pt 5,8 Powermock Block oben . Framework zum Schreiben . Unterstützung der Isolation . Oberflächentest von Web- reproduzierbarer Tests und Vortäuschung von Anwendungen Ziel . Direkter Test oder Schnittstellen (Platzhalter) Ansteuerung anderer durch Inspektion der Klassen Frameworks . Unit Test in ADF BC

Assertions / Assumptions . Mockito: IDE für Aufzeichnung (Add- on) Fixtures Einfaches Mocken WebDdriver (FF, IE, Chrome, Suite / Parameterized / Gute Lesbarkeit  Categories Runners Safari, Android, …)  Finale Klassen / statische 0,6 Exception Testing Server (lokal, remote) Vor-/Nachteile Methoden etc. nicht mockbar Blocktitel 0,8 Matchers Grid (parallel mehrere Server) 12pt 1,6 . Powermock: Ignoring (nicht fertige Tests) AJAX nicht einfach Block Unterstützt Mockito-Style unten Timeout für Tests Nur Webanwendungen Konstruktoren / statische,  Code (nicht als Anforderung private, finale Methoden lesbar) Diverse IDE‘s über JUnit alle auch dort über JUnit alle auch dort JDeveloperANT genannten Integrationen genannten Integrationen Integration Maven Jenkins Hudson

Fazit: Über die Kombination der Tools lassen sich Backend- und Oberflächentest für ADF abbilden. 7,8 

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - Unit Test mit Mockito / Powermock 31

Blocktitel 6,6 12pt 5,8 .Mocking: Isolation von Tests durch Simulation des Verhalten verwendeter Objekte Block oben .Weniger Aufwand/Fehler als bei selbstgeschriebenen Stubs .Mockito - On the fly Erzeugung von Mock Objekten durch „Ausspähen“ - Nur erwartetes Verhalten wird überschrieben - Prüfung der korrekten Benutzung des verwendeten Objekts ist möglich - Plain Java Code (Code Completion) 0,6 - Refactoring Safe Blocktitel 0,8 12pt 1,6 - Type Safe Block unten - Wenig Code und gut lesbar .Powermock - erweitert andere Mock-Frameworks  PowerMockito für Mockito - Custom Classloader / ByteCode Manipulation für Mocking von statischen Methoden, Konstruktoren, finalen Klassen und Methoden, private Methoden etc.

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - Unit Test mit Mockito / Powermock: Beispiel Source 32

Blocktitel 6,6 12pt 5,8 package oracle.summit.base; Block oben import oracle.jbo.server.DBTransaction; import oracle.jbo.server.EntityImpl; import oracle.jbo.server.SequenceImpl;

public class SummitEntityImpl extends EntityImpl { public SummitEntityImpl() { super(); }

0,6 Blocktitel 0,8 public oracle.jbo.domain.Number nextValSequence(String sequenceName, DBTransaction db) { 12pt 1,6 Block SequenceImpl s = getSequenceImpl(sequenceName, db); unten return s.getSequenceNumber(); } Refactoring für Injizierung Mock

private SequenceImpl getSequenceImpl(String sequenceName, DBTransaction db) { return new SequenceImpl(sequenceName, db); } }

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - Unit Test mit Mockito / Powermock: Beispiel Test 33 Blocktitel 6,6 Runner Class (PowerMock) 12pt 5,8 @RunWith(PowerMockRunner.class) Block @PrepareForTest(SummitEntityImpl.class) oben public class SummitEntityImplTest { ByteCode Transformation (PowerMock) private SummitEntityImpl spy; private SequenceImpl sequenceImpl; private DBTransaction dBTransaction; private Number seqVal= new Number(1);

@Before public void prepareTest() throws Exception { spy = PowerMockito.spy(new SummitEntityImpl()); Mockobjekte 0,6 dBTransaction = Mockito.mock(DBTransaction.class); Blocktitel 0,8 sequenceImpl = Mockito.mock(SequenceImpl.class); 12pt 1,6 Block Mockito.when(sequenceImpl.getSequenceNumber()).thenReturn(seqVal); unten PowerMockito.doReturn(sequenceImpl).when(spy, "getSequenceImpl", "test", dBTransaction); } Test Erwartetes Testverhalten @Test public void testNextValSequence_test_db() throws Exception { assertEquals("Seq. not " + seqVal, seqVal, spy.nextValSequence("test", dBTransaction)); } }

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - GUI Test mit Selenium 34

Blocktitel 6,6 12pt 5,8 .Selenium IDE wird bei IKB nur selten zur Erstaufzeichnung von Tests genutzt Block oben .Selenium Grid für parallelen Test auf verschiedener Hardware / Browsern / OS … .Wrapper Bibliothek entwickelt für häufige Aufrufe, Testtreiber, Timeouts etc. .Page Object Design Pattern (Trennen von Seiten und Testcode  Refactoring besser möglich) .AJAX? - Asynchrone Änderungen schwer trackbar 0,6 - : Abfrage des Attributes Name oder Alt des Icons Blocktitel 0,8 12pt 1,6 .Wegen Unverträglichkeit mit XML Parsern der ADF Editoren müssen Tests in Block unten separatem Projekt liegen (auch wg. Deployment als ADF Library sinnvoll) .Derzeit Probleme mit Stabilität speziell des ersten Test nach Deployment

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - GUI Test mit Selenium – Page Object Index 35

Blocktitel 6,6 12pt 5,8 public class Index { Block public static final String ENV_TEST_CONTEXT_ROOT = System.getenv("TEST_CONTEXT_ROOT"); oben public static final String TEST_CONTEXT_ROOT = (ENV_TEST_CONTEXT_ROOT != null ? ENV_TEST_CONTEXT_ROOT : "SummitADF-ViewController-context-root/faces/index"); private static final String ID_TAB_WELCOME = "pt1:sdi1::disAcr"; private static final String ID_TAB_INVENTORY_CONTROL = "pt1:sdi3::disAcr"; private static final String XPATH_BUSY_ICON = "//span[@id='pt1:statInd']/img"; private static final String VALUE_BUSY_ICON_ALT = "Frei"; protected UITestDriver driverInstance;

public Index(final UITestDriver driverInstance) { this.driverInstance = driverInstance; 0,6 } Reiterkarte „Welcome“ öffnen Blocktitel 0,8 12pt 1,6 public void openTabWelcome() { Block unten driverInstance.clickById(ID_TAB_WELCOME); waitForAjaxCalls(); Reiterkarte „Inventory Control“ öffnen } public InventoryControl openTabInventoryControl() { driverInstance.clickById(ID_TAB_INVENTORY_CONTROL); waitForAjaxCalls(); return new InventoryControl(driverInstance); } public void waitForAjaxCalls() { Warten auf Abschluss von AJAX-Calls driverInstance.waitForAlt(By.xpath(XPATH_BUSY_ICON), VALUE_BUSY_ICON_ALT); }

7,8 }

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - GUI Test mit Selenium – Page Object InventoryControl 36

Blocktitel 6,6 12pt 5,8 public class InventoryControl extends Index { Block oben Ableitung der Masterseite private static final String XPATH_INVENTORY_CONTROL_HEADER = "//td[@id='pt1:r2:0:ph1::_afrTtxt']/div/h1"; XPath des Headers public InventoryControl(final UITestDriver driverInstance) { super(driverInstance);

0,6 } Ermitteln des Headertexts

Blocktitel 0,8 12pt 1,6 Block public String getInventoryControlHeaderText() { unten return driverInstance.getTextByXpath( XPATH_INVENTORY_CONTROL_HEADER); } }

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - GUI Test mit Selenium – Test 37

Blocktitel 6,6 12pt 5,8 public class IndexTest extends SeleniumTest { Block oben @Test public void testOpenTabWelcome() { driverInstance.getRelativeUrl(Index.TEST_CONTEXT_ROOT); final Index index = new Index(driverInstance); final InventoryControl inventoryControl=

0,6 index.openTabInventoryControl();

Blocktitel 0,8 assertEquals("Header is not correct", 12pt 1,6 Block inventoryControl.getInventoryControlHeaderText(), unten "Inventory Items (Low Stock)"); } }

Abstrakte Beschreibung des Tests

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - JUnit im JDeveloper 38

Blocktitel 6,6 12pt 5,8 .JUnit selbst für Tests oder als Wrapper für Mockito / PowerMockito / Selenium Block oben .JUnit muss als Extension in den JDeveloper installiert werden .Testausführung direkt im JDeveloper (außer PowerMockito in 12c – in Prüfung)

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - JUnit in Jenkins (1) 39

Blocktitel 6,6 12pt 5,8 .Derzeit wird das JUnit Target in ANT verwendet, um die Tests auszuführen Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten .In Jenkins ist JUnit Reporting integriert, es muss nur ein Pattern zu den Ergebnissen angegeben werden

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Automatisierter Test - JUnit in Jenkins (2) 40

Blocktitel 6,6 12pt 5,8 .Trend Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten .Testergebnisse

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Testabdeckung - Jacoco 41

Blocktitel 6,6 12pt 5,8 .Ermittelt, wie der Sourcecode im Test abgedeckt wird Block oben .Messung erfolgt derzeit nur für Unit-Tests .on-the-fly instrumentation nicht nutzbar, da auch PowerMockito dynamic classfile transformation vornimmt und diese Testabdeckung dann nicht gemessen werden kann  offline intrumentation

0,6 Blocktitel 0,8 12pt 1,6 Block unten .Ausführung ist Bestandteil der Testjobs und wrapped Junit (ANT)

7,8 8,2 Fußnote 8pt 9,2

12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Testabdeckung – Jacoco im JDeveloper 42

Blocktitel 6,6 12pt 5,8 .für den Entwickler wird per ANT ein Report erzeugt Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Testabdeckung – Jacoco in Jenkins (1) 43

Blocktitel 6,6 12pt 5,8 .Im Jenkins kommt das JaCoCo Plugin zum Einsatz, Konfiguration: Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten .Reports

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Testabdeckung – Jacoco in Jenkins (2) 44

Blocktitel 6,6 12pt 5,8 .Reports (2) Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Evaluierung 45

Blocktitel 6,6 12pt 5,8 .ADF EMG Audit Rules (Implementierung der ADF Code Guidelines) Block oben - für 11.1.1.x seit kurzem verfügbar - in 11.1.1.x keine Meldungsunterdrückung möglich via Suppress Warnings Extension -  12c .Sonarcube - ADF EMG Audit Rules für Prüfung in JDeveloper 0,6 - SonarQube ojaudit plugin für Prüfung in Sonarcube via Jenkins Blocktitel 0,8 12pt 1,6 -  12c Block unten .Testparallelisierung (ab JUnit 4.8, JUnit 4.10 erst im Plugin für 12c enthalten) .ADF Task Flow Tester .Testabdeckung GUI-Tests .…

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Fazit 46

Blocktitel 6,6 12pt 5,8 .Erreichte Ziele Block oben - Es wurden diverse Voraussetzungen für die automatisierte QS geschaffen - Zusätzlich zum automatisierten Test erfolgt ein Pre-Test in IT und der Acceptance Test in der Fachabteilung - Erste automatisierte Tests wurden erstellt - Know How in diversen Tools wurde aufgebaut .Herausforderungen: 0,6 - Schulung der Entwickler auf allen Gebieten Blocktitel 0,8 12pt 1,6 - Aufwände in die agile Entwicklungsweise verankern für Block unten - Design und Automatisierung von Tests - Umsetzung der Ergebnisse der statischen Codeanalyse - Feinjustierung der Regeln

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Fragen & Antworten 47

Blocktitel 6,6 12pt 5,8 Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2 12,4 rot = 1/2-Layout grün = 1/3-Layout 5,0 4,0 0,6 0,6 4,0 5,0 12,4

Seitentitel 9,0 20pt

7,4 Referenzen 48

Blocktitel 6,6 12pt 5,8 .Markus Sprunck: Direct Comparison of FindBugs, PMD and Checkstyle Block oben

0,6

Blocktitel 0,8 12pt 1,6 Block unten

7,8

8,2 Fußnote 8pt 9,2