www.ics.ug #icsug
Let the machines do their work
and have good night sleep
Martin Přádný, @mpradny
Martin Jinoch, @mjinoch
www.ics.ug #icsug
Agenda
• Introduction
• Testing and Domino
– Demo 1
• Build Automation
– Demo 2
• Discussion
www.ics.ug #icsug
About us
• Martin Jinoch
jinoch@gmail.com
@mjinoch
http://jinoch.cz
• Martin Přádný
pradny@pradny.com
@mpradny
http://pradny.com
www.ics.ug #icsug
Why building and testing matters?
• Code changes break existing features
• Developers step on each others code
• Infrastructure changes break apps
• Application works only for happy-path
scenarios
www.ics.ug #icsug
Testing
• Unit testing
• Integration testing
• UI testing
www.ics.ug #icsug
Domino Problems
• Tight data and code integration
• Unstructured code
• Dependency on Notes C runtime
• No light in-memory option
www.ics.ug #icsug
Solutions
• Write apps with testing in mind
• Separate code and data
• Source Control
• Build automation
www.ics.ug #icsug
Tools
• XPages with Junit
– org.openntf.junit.xsp
• JUnit/TestNG in your ODS project
– Easy test of non-XPages code
– Mock domino classes – EasyMock, PowerMock
• UI testing
– Selenium
www.ics.ug #icsug
Local testing setup
• Change ODP to Java project
– Maks Zhuk - http://mzhuk.blogspot.com/
– Manually edit .project file
– Add Code/Java as Source Folder
– Add Local directory
• Create Java project with tests
– Add mocking library (optional)
www.ics.ug #icsug
Local testing setup - details
• http://mzhuk.blogspot.com/2014/02/unit-tests-for-lotus-domino-
applications.html
• Snippet from .project
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
www.ics.ug #icsug
www.ics.ug #icsug
Demo 1 - scenario
• XPages application – fake CMS with articles
• Computation of article expiration date
– based on article type
– logic in Java
• 3 different types of definitions and tests
– Hard-coded in Java
– In a document
– In a view
www.ics.ug #icsug
Demo
www.ics.ug #icsug
Automation
• Maven, Ant, Gradle, ..
– Describe and run steps to get final deliverable
• Jenkins, Teamcity, Bamboo, …
– Continuous integration
– Check-out source code
– Run periodical builds and much more
www.ics.ug #icsug
Headless designer
• Command line invocation of Domino Designer
• Create NSF from On Disk Project
• Enable/Disable plugins
• New feature in 9.0.1
• http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Headless_Designer_Wiki
• notes.ini parameter - DESIGNER_AUTO_ENABLED=true
• ID without password
www.ics.ug #icsug
Headless designer invocation
• Manually
– Single command command line
• designer -RPARAMS -vmargs -
Dcom.ibm.designer.cmd=[clean],[exit],[file name],[job
name],[file path],[file name]
– Command file
• designer -RPARAMS -vmargs -
Dcom.ibm.designer.cmd.file=[path to command file]
www.ics.ug #icsug
Headless designer wrappers
• Maven – Christian Güdemann
– Included in public Maven repository
– Options to install Designer plugins
– https://github.com/OpenNTF/BuildAndTestPattern4Xpages
• Ant – Cameron Gregor
– Additional tasks for NSF manipulation
– Uses Java Native Interface
– https://github.com/camac/BuildXPages
• Gradle - Martin Pradny
– not maintained
– https://bitbucket.org/pradnik/gradledominoplugin
www.ics.ug #icsug
Headless designer - Maven
<packaging>domino-nsf</packaging>
<properties>
<ddehd.odpdirectory>${basedir}/on-disk-project</ddehd.odpdirectory>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.openntf.maven</groupId>
<artifactId>headlessdesigner-maven-plugin</artifactId>
<version>1.2.0</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
From:https://github.com/OpenNTF/BuildAndTestPattern4Xpages/blob/master/testpatterns/org.openntf.junit.xs
p.parent/org.openntf.junit.odp/pom.xml
www.ics.ug #icsug
Why Maven
• Standard in XPages community
• OSGi friendly with Tycho plugin
• IBM released Update Site on OpenNTF.org
– IBM Domino Update Site for Build Management
– http://openntf.org/main.nsf/project.xsp?r=project/IB
M%20Domino%20Update%20Site%20for%20Build%20
Management
• Allows building Extension Libraries
www.ics.ug #icsug
Jenkins (teamcity, bamboo,..)
• Continuous Integration
• Integrate with SCM (Git, SVN, …)
– Trigger build, push/pull, …
• Run build, Run tests
• Report errors
• Deploy to production
• Extensible with plugins
www.ics.ug #icsug
• Jenkins
– https://jenkins-ci.org/
• Bamboo
– https://www.atlassian.com/software/bamboo
• TeamCity
– https://www.jetbrains.com/teamcity/
www.ics.ug #icsug
Selenium
• Web browser automation (Firefox, Chrome, IE,…)
• Selenium IDE (Firefox)
– Record tests
– Replay tests
– Export (Java, C#, ruby, Python, ..)
• Selenium server, grid
– Run tests on remote machines
• http://www.seleniumhq.org
www.ics.ug #icsug
Demo 2 - scenario
• Same application as in Demo 1
• Maven driven build on Jenkins
– Compile and run tests using Tycho/OSGi
– Build NSF from ODP – Maven plugin
– Run Selenium tests
• Copy NSF to server – Ant task
• Load data – calling an Agent using URL
www.ics.ug #icsug
Demo 2 - Environment
www.ics.ug #icsug
Demo 2
www.ics.ug #icsug
Demo 2 - notes
• https://bitbucket.org/pradnik/ics.ug-demo
• mvn clean verify –P complete
• Jenkins running as a service
– Allow to interact with desktop
– SCM Poll since running as local VM (not optimal)
• Maven settings
– using Config File Provider plugin
– <notes-platform> for Domino Update Site
– <ddehd.notesdata> for Designer data directory
• Profile for just testing
• Some properties are hard coded in pom.xml
www.ics.ug #icsug
Demo 2 – settings.xml
<settings>
<pluginGroups>
<pluginGroup>org.openntf.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>main</id>
<properties>
<notes-platform>file:///Z:/Share/DominoUpdatsite</notes-platform>
<ddehd.notesdata>c:/IBM/Notes/Data/</ddehd.notesdata>
</properties>
</profile>
</profiles>
</settings>
www.ics.ug #icsug
Demo 2 – Jenkins configuration
www.ics.ug #icsug
Trade-offs
• What to automate
• Cost of test maintenance vs. manual execution
• False feeling of security
www.ics.ug #icsug
Conclusion
• Testing is good
• Test from very start
– Helps cleaner code
– Helps cleaner UI
• Path to Continuous Delivery
• Code quality automated analysis
– SonarQube - http://www.sonarqube.org/
www.ics.ug #icsug
Questions?
www.ics.ug #icsug
Thank you!

XPages build automation and testing

  • 1.
    www.ics.ug #icsug Let themachines do their work and have good night sleep Martin Přádný, @mpradny Martin Jinoch, @mjinoch
  • 2.
    www.ics.ug #icsug Agenda • Introduction •Testing and Domino – Demo 1 • Build Automation – Demo 2 • Discussion
  • 3.
    www.ics.ug #icsug About us •Martin Jinoch jinoch@gmail.com @mjinoch http://jinoch.cz • Martin Přádný pradny@pradny.com @mpradny http://pradny.com
  • 4.
    www.ics.ug #icsug Why buildingand testing matters? • Code changes break existing features • Developers step on each others code • Infrastructure changes break apps • Application works only for happy-path scenarios
  • 5.
    www.ics.ug #icsug Testing • Unittesting • Integration testing • UI testing
  • 6.
    www.ics.ug #icsug Domino Problems •Tight data and code integration • Unstructured code • Dependency on Notes C runtime • No light in-memory option
  • 7.
    www.ics.ug #icsug Solutions • Writeapps with testing in mind • Separate code and data • Source Control • Build automation
  • 8.
    www.ics.ug #icsug Tools • XPageswith Junit – org.openntf.junit.xsp • JUnit/TestNG in your ODS project – Easy test of non-XPages code – Mock domino classes – EasyMock, PowerMock • UI testing – Selenium
  • 9.
    www.ics.ug #icsug Local testingsetup • Change ODP to Java project – Maks Zhuk - http://mzhuk.blogspot.com/ – Manually edit .project file – Add Code/Java as Source Folder – Add Local directory • Create Java project with tests – Add mocking library (optional)
  • 10.
    www.ics.ug #icsug Local testingsetup - details • http://mzhuk.blogspot.com/2014/02/unit-tests-for-lotus-domino- applications.html • Snippet from .project <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures>
  • 11.
  • 12.
    www.ics.ug #icsug Demo 1- scenario • XPages application – fake CMS with articles • Computation of article expiration date – based on article type – logic in Java • 3 different types of definitions and tests – Hard-coded in Java – In a document – In a view
  • 13.
  • 14.
    www.ics.ug #icsug Automation • Maven,Ant, Gradle, .. – Describe and run steps to get final deliverable • Jenkins, Teamcity, Bamboo, … – Continuous integration – Check-out source code – Run periodical builds and much more
  • 15.
    www.ics.ug #icsug Headless designer •Command line invocation of Domino Designer • Create NSF from On Disk Project • Enable/Disable plugins • New feature in 9.0.1 • http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Headless_Designer_Wiki • notes.ini parameter - DESIGNER_AUTO_ENABLED=true • ID without password
  • 16.
    www.ics.ug #icsug Headless designerinvocation • Manually – Single command command line • designer -RPARAMS -vmargs - Dcom.ibm.designer.cmd=[clean],[exit],[file name],[job name],[file path],[file name] – Command file • designer -RPARAMS -vmargs - Dcom.ibm.designer.cmd.file=[path to command file]
  • 17.
    www.ics.ug #icsug Headless designerwrappers • Maven – Christian Güdemann – Included in public Maven repository – Options to install Designer plugins – https://github.com/OpenNTF/BuildAndTestPattern4Xpages • Ant – Cameron Gregor – Additional tasks for NSF manipulation – Uses Java Native Interface – https://github.com/camac/BuildXPages • Gradle - Martin Pradny – not maintained – https://bitbucket.org/pradnik/gradledominoplugin
  • 18.
    www.ics.ug #icsug Headless designer- Maven <packaging>domino-nsf</packaging> <properties> <ddehd.odpdirectory>${basedir}/on-disk-project</ddehd.odpdirectory> </properties> <build> <plugins> <plugin> <groupId>org.openntf.maven</groupId> <artifactId>headlessdesigner-maven-plugin</artifactId> <version>1.2.0</version> <extensions>true</extensions> </plugin> </plugins> </build> From:https://github.com/OpenNTF/BuildAndTestPattern4Xpages/blob/master/testpatterns/org.openntf.junit.xs p.parent/org.openntf.junit.odp/pom.xml
  • 19.
    www.ics.ug #icsug Why Maven •Standard in XPages community • OSGi friendly with Tycho plugin • IBM released Update Site on OpenNTF.org – IBM Domino Update Site for Build Management – http://openntf.org/main.nsf/project.xsp?r=project/IB M%20Domino%20Update%20Site%20for%20Build%20 Management • Allows building Extension Libraries
  • 20.
    www.ics.ug #icsug Jenkins (teamcity,bamboo,..) • Continuous Integration • Integrate with SCM (Git, SVN, …) – Trigger build, push/pull, … • Run build, Run tests • Report errors • Deploy to production • Extensible with plugins
  • 21.
    www.ics.ug #icsug • Jenkins –https://jenkins-ci.org/ • Bamboo – https://www.atlassian.com/software/bamboo • TeamCity – https://www.jetbrains.com/teamcity/
  • 22.
    www.ics.ug #icsug Selenium • Webbrowser automation (Firefox, Chrome, IE,…) • Selenium IDE (Firefox) – Record tests – Replay tests – Export (Java, C#, ruby, Python, ..) • Selenium server, grid – Run tests on remote machines • http://www.seleniumhq.org
  • 23.
    www.ics.ug #icsug Demo 2- scenario • Same application as in Demo 1 • Maven driven build on Jenkins – Compile and run tests using Tycho/OSGi – Build NSF from ODP – Maven plugin – Run Selenium tests • Copy NSF to server – Ant task • Load data – calling an Agent using URL
  • 24.
  • 25.
  • 26.
    www.ics.ug #icsug Demo 2- notes • https://bitbucket.org/pradnik/ics.ug-demo • mvn clean verify –P complete • Jenkins running as a service – Allow to interact with desktop – SCM Poll since running as local VM (not optimal) • Maven settings – using Config File Provider plugin – <notes-platform> for Domino Update Site – <ddehd.notesdata> for Designer data directory • Profile for just testing • Some properties are hard coded in pom.xml
  • 27.
    www.ics.ug #icsug Demo 2– settings.xml <settings> <pluginGroups> <pluginGroup>org.openntf.maven</pluginGroup> </pluginGroups> <profiles> <profile> <id>main</id> <properties> <notes-platform>file:///Z:/Share/DominoUpdatsite</notes-platform> <ddehd.notesdata>c:/IBM/Notes/Data/</ddehd.notesdata> </properties> </profile> </profiles> </settings>
  • 28.
    www.ics.ug #icsug Demo 2– Jenkins configuration
  • 29.
    www.ics.ug #icsug Trade-offs • Whatto automate • Cost of test maintenance vs. manual execution • False feeling of security
  • 30.
    www.ics.ug #icsug Conclusion • Testingis good • Test from very start – Helps cleaner code – Helps cleaner UI • Path to Continuous Delivery • Code quality automated analysis – SonarQube - http://www.sonarqube.org/
  • 31.
  • 32.

Editor's Notes

  • #9 PowerMock is a framework that extend other mock libraries such as EasyMock with more powerful capabilities. PowerMock uses a custom classloader and bytecode manipulation to enable mocking of static methods, constructors, final classes and methods, private methods, removal of static initializers and more.
  • #10 http://mzhuk.blogspot.com/2014/02/unit-tests-for-lotus-domino-applications.html <buildCommand>     <name>org.eclipse.jdt.core.javabuilder</name>     <arguments>     </arguments>   </buildCommand> </buildSpec> <natures>   <nature>org.eclipse.jdt.core.javanature</nature> </natures>
  • #14 Run SimpleArticle test Run DominoArticle test – explain mocking Run ViewArticle test – explain why failed
  • #18 Maven - https://github.com/OpenNTF/BuildAndTestPattern4Xpages Ant - https://github.com/camac/BuildXPages Gradle - https://bitbucket.org/pradnik/gradledominoplugin
  • #19 Taken from https://github.com/OpenNTF/BuildAndTestPattern4Xpages/blob/master/testpatterns/org.openntf.junit.xsp.parent/org.openntf.junit.odp/pom.xml
  • #20 http://openntf.org/main.nsf/project.xsp?r=project/IBM%20Domino%20Update%20Site%20for%20Build%20Management
  • #21 Jenkins https://jenkins-ci.org/ Bamboo https://www.atlassian.com/software/bamboo TeamCity https://www.jetbrains.com/teamcity/
  • #27 settings.xml: <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <pluginGroups> <pluginGroup>org.openntf.maven</pluginGroup> </pluginGroups> <profiles> <profile> <id>main</id> <properties> <notes-platform>file:///Z:/Share/DominoUpdatsite</notes-platform> <ddehd.notesdata>c:/IBM/Notes/Data/</ddehd.notesdata> </properties> </profile> </profiles> </settings>
  • #29 mvn clean verify –P complete