SlideShare a Scribd company logo
Implementing Quality
                         on Java projects




                           Vincent Massol
                           Committer XWiki
                             XWiki SAS

                             @vmassol
                                              27 au 29 mars 2013
Sunday, March 31, 13
Vincent Massol

            • Speaker Bio
               •       CTO XWiki SAS
            • Your Projects
               •       XWiki (community-driven open source project)
               •       Past: Maven, Apache Cargo, Apache Cactus, Pattern Testing
            • Other Credentials:
               •       LesCastCodeurs podcast
               •       Creator of OSSGTP open source group in Paris
               •       3 books: JUnit in Action, Maven: A Developer’s Notebook, BBWM

Sunday, March 31, 13
What is Quality?




Sunday, March 31, 13
The XWiki project in summary
      •      9 years old
      •      28 active
             committers
      •      7 committers
             do 80% of
             work
      •      700K NCLOC
      •      11 commits/
             day
      •      16 mails/day


Sunday, March 31, 13
Examples of Quality actions
            • Coding rules (Checkstyle, ...)    • Ensure API stability
            • Test coverage                     • Code reviews
            • Track bugs                        • License header checks
            • Don’t use Commons Lang 2.x        • Release with Java 6
            • Use SLF4J and don’t draw Log4J/   • Ensure javadoc exist
                   JCL in dependencies
                                                • Prevent JAR hell
            •      Automated build
                                                • Release often (every 2 weeks)
            •      Automated unit tests
                                                • Collaborative design
            •      Stable automated
                                                • Test on supported
                   functional tests               environments (DB & Browsers)
Sunday, March 31, 13
Quality Tip #1

                       API Stability




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                       Class Not Found or Method Not
                                   Found




Sunday, March 31, 13
API Stability - Deprecations

     /**
      * ...
      * @deprecated since 2.4M1 use {@link #transform(
      *             Block, TransformationContext)}
      */
     @Deprecated
     void transform(XDOM dom, Syntax syntax)
         throws TransformationException;




Sunday, March 31, 13
API Stability - CLIRR (1/2)
     <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>clirr-maven-plugin</artifactId>
       <configuration>
         <ignored>
           <difference>
              <differenceType>7006</differenceType>
              <className>org/xwiki/.../MetaDataBlock</className>
              <method>org.xwiki....block.Block clone()</method>
              <to>org.xwiki.rendering.block.MetaDataBlock</to>
              <justification>XDOM#clone() doesn't clone the meta
                data</justification>
           </difference>
     ...

Sunday, March 31, 13
API Stability - CLIRR (2/2)




        Example from XWiki 5.0M1 Release notes

Sunday, March 31, 13
API Stability - Internal Package
                       Javadoc
                       <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-javadoc-plugin
                         <configuration>
                           <excludePackageNames>*.internal.*
                             </excludePackageNames>


                       CLIRR
                       <plugin>
                         <groupId>org.codehaus.mojo</groupId>
                         <artifactId>clirr-maven-plugin</artifactId>
                         <excludes>
                           <exclude>**/internal/**</exclude>
                           <exclude>**/test/**</exclude>


Sunday, March 31, 13
API Stability - Legacy Module
                            Aspect Weaving

                             <plugin>
                               <groupId>org.codehaus.mojo</groupId>
                               <artifactId>aspectj-maven-plugin</...>
                             ...
                              <configuration>
                                 <weaveDependencies>
                                   <weaveDependency>
                                     <groupId>org.xwiki.rendering</...>
                                     <artifactId>xwiki-rendering-api</...>
                             ...


                       + “Legacy” Profile

Sunday, March 31, 13
API Stability - Young APIs

     /**
       * ...
       * @since 5.0M1
       */
     @Unstable(<optional explanation>)
     public EntityReference createEntityReference(String name,...)
     {
     ...
     }

     + max duration for keeping the annotation!


Sunday, March 31, 13
API Stability - Next steps

            • Annotation or package for SPI?
            • Better define when to use the @Unstable annotation
            • Not possible to add a new method to an existing Interface
               •       Java 8 and Virtual Extension/Defender methods
                   interface TestInterface {
                     public void testMe();
                     public void newMethod() default {
                       System.out.println("Default from interface");
                     }
                   }


Sunday, March 31, 13
Quality Tip #2

                         JAR Hell




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                       Class Not Found or Method Not
                        Found or not working feature




Sunday, March 31, 13
No duplicate classes @ runtime
     <plugin>
       <groupId>com.ning.maven.plugins</groupId>
       <artifactId>maven-duplicate-finder-plugin</artifactId>
       <executions>
         <execution>
           <phase>verify</phase>
           <goals>
              <goal>check</goal>
           </goals>
           <configuration>
              <failBuildInCaseOfConflict>true</...>
              <exceptions>
              ...

Sunday, March 31, 13
Surprising results...
            • Commons Beanutils bundles some classes from Commons
                   Collections, apparently to avoid drawing a dependency to it...
            •      Xalan bundles a lot of other projects (org/apache/xml/**, org/apache/
                   bcel/**, JLex/**, java_cup/**, org/apache/regexp/**). In addition, it even
                   has these jars in its source tree without any indication about their
                   versions...
            •      stax-api, geronimo-stax-api_1.0_spec and xml-apis all draw
                   javax.xml.stream.* classes
            •      xmlbeans and xml-apis draw incompatible versions of org.w3c.dom.*
                   classes
                                          14 exceptions in total!
Sunday, March 31, 13
Maven: dependency version issue
     <dependencies>
       <dependency>                                Will run logback 0.9.9
         <groupId>org.slf4j</groupId>               with slf4J-api 1.4.0
         <artifactId>slf4j-api</artifactId>          instead of 1.5.0!
         <version>1.4.0</version>
       </dependency>
       <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
         <version>0.9.9</version>
         <!-- Depends on org.slf4j:slf4j-api:1.5.0 -->
       </dependency>
     </dependencies>

Sunday, March 31, 13
Maven: ensure correct version
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-enforcer-plugin</artifactId>
       <executions>
         <execution>
           <id>enforce-version-compatibility</id>
           <phase>verify</phase>
           <goals>
              <goal>enforce</goal>
           </goals>
           <configuration>
              <rules>
                <requireUpperBoundDeps/>
              </rules>

Sunday, March 31, 13
Quality Tip #3

                       Test Coverage




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                       More bugs reported, overall quality
                        goes down and harder to debug
                                   software




Sunday, March 31, 13
Use Jacoco to fail the build
     <plugin>
       <groupId>org.jacoco</groupId>
       <artifactId>jacoco-maven-plugin</artifactId>
       <executions>
         <execution><id>jacoco-prepare</id>
           <goals><goal>prepare-agent</goal></goals>
         </execution>
         <execution><id>jacoco-check</id>
           <goals><goal>check</goal></goals>
         </execution>
       </executions>
       <configuration>
         <check>
           <instructionRatio>${xwiki.jacoco.instructionRatio}</...>
         </check>}

Sunday, March 31, 13
Strategy

            • When devs add code (and thus tests),
                   increase the TPC percentage
            •      Put the Jacoco check in “Quality” Maven
                   Profile
            •      Have a CI job to execute that profile
                   regularly
               •       About 15% overhead compared to build
                       without checks
            • “Cheat mode”: Add easier-to-write test
Sunday, March 31, 13
Quizz Time!
    Step 1: Building on my local machine gives the following:

     [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check)
     [INFO] All coverage checks have been met.


    Step 2: Building on the CI machine gave:

     [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check)
     [WARNING] Insufficient code coverage for INSTRUCTION: 75.52% < 75.53%


                                Non determinism! Why?
Sunday, March 31, 13
Quizz Answer
    ... because the JVM is non deterministic!
     private Map componentEntries = new ConcurrentHashMap();
     ...
     for (Map.Entry entry : componentEntries.entrySet())
     {
       if (entry.getValue().instance == component) {
         key = entry.getKey();
         oldDescriptor = entry.getValue().descriptor;
         break;
       }
     }



Sunday, March 31, 13
Quality Tip #4

                       Functional Testing Stability
                             (with Jenkins)




                                                      27 au 29 mars 2013
Sunday, March 31, 13
The Problem



                        Too many false positives leading to
                       developers not paying attention to CI
                         emails anymore... leading to failing
                                    software




Sunday, March 31, 13
False positives examples

         • The JVM has crashed
         • VNC is down (we run Selenium tests)
         • Browser crash (we run Selenium tests)
         • Git connection issue
         • Machine slowness (if XWiki cannot start under 2 minutes then it
                means the machine has some problems)
         •      Nexus is down (we deploy our artifacts to a Nexus repository)
         •      Connection issue (Read time out)

Sunday, March 31, 13
Step 1: Groovy PostBuild Plugin (1/2)
     def messages = [
       [".*A fatal error has been detected by the Java Runtime Environment.*",
         "JVM Crash", "A JVM crash happened!"],
       [".*Error: cannot open display: :1.0.*",
         "VNC not running", "VNC connection issue!"],
       ...
     ]
     def shouldSendEmail = true
     messages.each { message ->
       if (manager.logContains(message.get(0))) {
          manager.addWarningBadge(message.get(1))
          manager.createSummary("warning.gif").appendText(...)
          manager.buildUnstable()
          shouldSendEmail = false
       }
     }

Sunday, March 31, 13
Step 1: Groovy PostBuild Plugin (2/2)


     ... continued from previous slide...

     if (!shouldSendEmail) {
       def pa = new ParametersAction([
          new BooleanParameterValue("noEmail", true)
       ])
       manager.build.addAction(pa)
     }




Sunday, March 31, 13
Step 2: Mail Ext Plugin

    Pre-send Script
     import hudson.model.*

     build.actions.each { action ->
       if (action instanceof ParametersAction) {
         if (action.getParameter("noEmail")) {
           cancel = true
         }
       }
     }




Sunday, March 31, 13
Results




             + use the Scriptler plugin to automate configuration for all jobs
Sunday, March 31, 13
Quality Tip #5

                       Bug Fixing Day




                                        27 au 29 mars 2013
Sunday, March 31, 13
The Problem

                        Bugs increasing, even simple to fix
                       ones, devs focusing too much on new
                        features (i.e. scope creep) vs fixing   Bugs created vs closed
                                     what exists




Sunday, March 31, 13
Bug Fixing Day

         • Every Thursday
         • Goal is to close the max number of bugs
         • Triaging: Can be closed with Won’t fix, Duplicate,
                Cannot Reproduce, etc
         •      Close low hanging fruits in priority
         •      Started with last 365 days then with last 547 days
                and currently with last 730 days (we need to catch
                up with 40 bugs!)


Sunday, March 31, 13
Results




Sunday, March 31, 13
Conclusion




                                    27 au 29 mars 2013
Sunday, March 31, 13
Parting words

            • Slowly add new quality check over time
            • Everyone must be on board
            • Favor Active Quality (i.e. make the build fail) over Passive checks
            • Be ready to adapt/remove checks if found not useful enough
            • Quality brings some risks:
               •       Potentially less committers for your project (especially open source)
               •       Project seen as “less fun”




Sunday, March 31, 13
Be proud of your Quality!

                          “I have offended God and
                       mankind because my work didn't
                       reach the quality it should have.”

                                       Leonardo da Vinci, on his death bed




Sunday, March 31, 13
Ad

More Related Content

What's hot (20)

Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
JUG Lausanne
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentation
Richard North
 
The world of gradle - an introduction for developers
The world of gradle  - an introduction for developersThe world of gradle  - an introduction for developers
The world of gradle - an introduction for developers
Tricode (part of Dept)
 
Ant, Maven and Jenkins
Ant, Maven and JenkinsAnt, Maven and Jenkins
Ant, Maven and Jenkins
Kenu, GwangNam Heo
 
An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java Developers
Kostas Saidis
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
Joe Kutner
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010
Tomek Kaczanowski
 
OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14
Ivan Krylov
 
Hands on the Gradle
Hands on the GradleHands on the Gradle
Hands on the Gradle
Matthias Käppler
 
Getting started with sbt
Getting started with sbtGetting started with sbt
Getting started with sbt
ikenna4u
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Rajmahendra Hegde
 
Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012
Hazem Saleh
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradle
Liviu Tudor
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方
Kiyotaka Oku
 
Gradle como alternativa a maven
Gradle como alternativa a mavenGradle como alternativa a maven
Gradle como alternativa a maven
David Gómez García
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
Roberto Franchini
 
First adoption hackathon at BGJUG
First adoption hackathon at BGJUGFirst adoption hackathon at BGJUG
First adoption hackathon at BGJUG
Ivan Ivanov
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
ZeroTurnaround
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparison
Manav Prasad
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainers
Naresha K
 
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
Java EE 6 & GlassFish V3 - Alexis Moussine-Pouchkine - May 2010
JUG Lausanne
 
Testcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentationTestcontainers - Geekout EE 2017 presentation
Testcontainers - Geekout EE 2017 presentation
Richard North
 
The world of gradle - an introduction for developers
The world of gradle  - an introduction for developersThe world of gradle  - an introduction for developers
The world of gradle - an introduction for developers
Tricode (part of Dept)
 
An Introduction to Gradle for Java Developers
An Introduction to Gradle for Java DevelopersAn Introduction to Gradle for Java Developers
An Introduction to Gradle for Java Developers
Kostas Saidis
 
Deploying JHipster Microservices
Deploying JHipster MicroservicesDeploying JHipster Microservices
Deploying JHipster Microservices
Joe Kutner
 
Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010Gradle talk, Javarsovia 2010
Gradle talk, Javarsovia 2010
Tomek Kaczanowski
 
OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14OpenJDK-Zulu talk at JEEConf'14
OpenJDK-Zulu talk at JEEConf'14
Ivan Krylov
 
Getting started with sbt
Getting started with sbtGetting started with sbt
Getting started with sbt
ikenna4u
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Rajmahendra Hegde
 
Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012Efficient JavaScript Unit Testing, May 2012
Efficient JavaScript Unit Testing, May 2012
Hazem Saleh
 
Managing dependencies with gradle
Managing dependencies with gradleManaging dependencies with gradle
Managing dependencies with gradle
Liviu Tudor
 
Jenkinsプラグインの作り方
Jenkinsプラグインの作り方Jenkinsプラグインの作り方
Jenkinsプラグインの作り方
Kiyotaka Oku
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
Roberto Franchini
 
First adoption hackathon at BGJUG
First adoption hackathon at BGJUGFirst adoption hackathon at BGJUG
First adoption hackathon at BGJUG
Ivan Ivanov
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
ZeroTurnaround
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparison
Manav Prasad
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainers
Naresha K
 

Viewers also liked (17)

Adding Integers
Adding IntegersAdding Integers
Adding Integers
jhochdorfer
 
Grenville Castings New Brochure
Grenville Castings New BrochureGrenville Castings New Brochure
Grenville Castings New Brochure
Joe Clements
 
Empathize and define
Empathize and defineEmpathize and define
Empathize and define
Lola Garín
 
Evaluation Question 5
Evaluation Question 5Evaluation Question 5
Evaluation Question 5
heatherlarkin1
 
Group 51 presentation
Group 51 presentationGroup 51 presentation
Group 51 presentation
reigatemedia
 
nhận làm video quảng cáo 3d
nhận làm video quảng cáo 3dnhận làm video quảng cáo 3d
nhận làm video quảng cáo 3d
theo757
 
Epic research malaysia daily klse report for 21st march 2016
Epic research malaysia   daily klse report for 21st march 2016Epic research malaysia   daily klse report for 21st march 2016
Epic research malaysia daily klse report for 21st march 2016
Epic Research Pte. Ltd.
 
Cognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension controlCognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension control
Alexander Decker
 
financial statement 2004
financial statement  2004financial statement  2004
financial statement 2004
traoman
 
book review by Vladimir Pyavka
book review by Vladimir Pyavkabook review by Vladimir Pyavka
book review by Vladimir Pyavka
Julia Birhova
 
GGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_PatsGGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_Pats
Georgia Gilbert
 
Escuela inteligente
Escuela inteligenteEscuela inteligente
Escuela inteligente
MauriciOo ChaTto
 
IMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the FutureIMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the Future
tkonnerth
 
Costume ideas
Costume ideas Costume ideas
Costume ideas
Kaitlyn Moody
 
Customer Success Story: Slimband
Customer Success Story: SlimbandCustomer Success Story: Slimband
Customer Success Story: Slimband
Marketo
 
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
psvayy
 
Grenville Castings New Brochure
Grenville Castings New BrochureGrenville Castings New Brochure
Grenville Castings New Brochure
Joe Clements
 
Empathize and define
Empathize and defineEmpathize and define
Empathize and define
Lola Garín
 
Group 51 presentation
Group 51 presentationGroup 51 presentation
Group 51 presentation
reigatemedia
 
nhận làm video quảng cáo 3d
nhận làm video quảng cáo 3dnhận làm video quảng cáo 3d
nhận làm video quảng cáo 3d
theo757
 
Epic research malaysia daily klse report for 21st march 2016
Epic research malaysia   daily klse report for 21st march 2016Epic research malaysia   daily klse report for 21st march 2016
Epic research malaysia daily klse report for 21st march 2016
Epic Research Pte. Ltd.
 
Cognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension controlCognitive neuro fuzzy expert system for hypotension control
Cognitive neuro fuzzy expert system for hypotension control
Alexander Decker
 
financial statement 2004
financial statement  2004financial statement  2004
financial statement 2004
traoman
 
book review by Vladimir Pyavka
book review by Vladimir Pyavkabook review by Vladimir Pyavka
book review by Vladimir Pyavka
Julia Birhova
 
GGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_PatsGGilbert_Three_Images_of_Konstantin_Pats
GGilbert_Three_Images_of_Konstantin_Pats
Georgia Gilbert
 
IMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the FutureIMARK NOW Summer LEDs and the Future
IMARK NOW Summer LEDs and the Future
tkonnerth
 
Customer Success Story: Slimband
Customer Success Story: SlimbandCustomer Success Story: Slimband
Customer Success Story: Slimband
Marketo
 
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с832  русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
832 русский язык. 11кл. мурина л.а. и др.-минск, 2010 -280с
psvayy
 
Ad

Similar to Implementing Quality on Java projects (20)

Implementing Quality on a Java Project
Implementing Quality on a Java ProjectImplementing Quality on a Java Project
Implementing Quality on a Java Project
Vincent Massol
 
The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9
jClarity
 
Maven advanced
Maven advancedMaven advanced
Maven advanced
Smita Prasad
 
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecampIasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Codecamp Romania
 
Arquillian in a nutshell
Arquillian in a nutshellArquillian in a nutshell
Arquillian in a nutshell
Brockhaus Consulting GmbH
 
Automation Frame works Instruction Sheet
Automation Frame works Instruction SheetAutomation Frame works Instruction Sheet
Automation Frame works Instruction Sheet
vodQA
 
Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!
cyrilpicat
 
Soft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developmentsSoft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developments
rfelden
 
Apache Maven basics
Apache Maven basicsApache Maven basics
Apache Maven basics
Volodymyr Ostapiv
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with Maven
Sid Anand
 
Apache Maven
Apache MavenApache Maven
Apache Maven
venkatraghavang
 
Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)
Robert Scholte
 
Tuscany : Applying OSGi After The Fact
Tuscany : Applying  OSGi After The FactTuscany : Applying  OSGi After The Fact
Tuscany : Applying OSGi After The Fact
Luciano Resende
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
Fabio Fumarola
 
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorialsSpring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
Raghavan Mohan
 
Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)
Vincent Massol
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous Integration
Nicolas Fränkel
 
How to create a skeleton of a Java console application
How to create a skeleton of a Java console applicationHow to create a skeleton of a Java console application
How to create a skeleton of a Java console application
Dmitri Pisarenko
 
Maven and j unit introduction
Maven and j unit introductionMaven and j unit introduction
Maven and j unit introduction
Sergii Fesenko
 
Maven2交流
Maven2交流Maven2交流
Maven2交流
ChangQi Lin
 
Implementing Quality on a Java Project
Implementing Quality on a Java ProjectImplementing Quality on a Java Project
Implementing Quality on a Java Project
Vincent Massol
 
The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9The Diabolical Developer's Guide to Surviving Java 9
The Diabolical Developer's Guide to Surviving Java 9
jClarity
 
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecampIasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Iasi code camp 20 april 2013 implement-quality-java-massol-codecamp
Codecamp Romania
 
Automation Frame works Instruction Sheet
Automation Frame works Instruction SheetAutomation Frame works Instruction Sheet
Automation Frame works Instruction Sheet
vodQA
 
Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!Make use of Sonar for your mobile developments - It's easy and useful!
Make use of Sonar for your mobile developments - It's easy and useful!
cyrilpicat
 
Soft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developmentsSoft shake 2013 - make use of sonar on your mobile developments
Soft shake 2013 - make use of sonar on your mobile developments
rfelden
 
Hands On with Maven
Hands On with MavenHands On with Maven
Hands On with Maven
Sid Anand
 
Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)Apache Maven supports all Java (JokerConf 2018)
Apache Maven supports all Java (JokerConf 2018)
Robert Scholte
 
Tuscany : Applying OSGi After The Fact
Tuscany : Applying  OSGi After The FactTuscany : Applying  OSGi After The Fact
Tuscany : Applying OSGi After The Fact
Luciano Resende
 
An introduction to maven gradle and sbt
An introduction to maven gradle and sbtAn introduction to maven gradle and sbt
An introduction to maven gradle and sbt
Fabio Fumarola
 
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorialsSpring Web Service, Spring JMS, Eclipse & Maven tutorials
Spring Web Service, Spring JMS, Eclipse & Maven tutorials
Raghavan Mohan
 
Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)Implementing Quality on Java projects (Short version)
Implementing Quality on Java projects (Short version)
Vincent Massol
 
Riga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous IntegrationRiga Dev Day - Automated Android Continuous Integration
Riga Dev Day - Automated Android Continuous Integration
Nicolas Fränkel
 
How to create a skeleton of a Java console application
How to create a skeleton of a Java console applicationHow to create a skeleton of a Java console application
How to create a skeleton of a Java console application
Dmitri Pisarenko
 
Maven and j unit introduction
Maven and j unit introductionMaven and j unit introduction
Maven and j unit introduction
Sergii Fesenko
 
Ad

More from Vincent Massol (20)

XWiki Testing with TestContainers
XWiki Testing with TestContainersXWiki Testing with TestContainers
XWiki Testing with TestContainers
Vincent Massol
 
XWiki: The best wiki for developers
XWiki: The best wiki for developersXWiki: The best wiki for developers
XWiki: The best wiki for developers
Vincent Massol
 
Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019
Vincent Massol
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projects
Vincent Massol
 
Configuration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainersConfiguration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainers
Vincent Massol
 
Building XWiki
Building XWikiBuilding XWiki
Building XWiki
Vincent Massol
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projects
Vincent Massol
 
What's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.xWhat's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.x
Vincent Massol
 
QDashboard 1.2
QDashboard 1.2QDashboard 1.2
QDashboard 1.2
Vincent Massol
 
Advanced Java Testing
Advanced Java TestingAdvanced Java Testing
Advanced Java Testing
Vincent Massol
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality Dashboard
Vincent Massol
 
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and SharepointXWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
Vincent Massol
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality Dashboard
Vincent Massol
 
XWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army KnifeXWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army Knife
Vincent Massol
 
Leading a Community-Driven Open Source Project
Leading a Community-Driven Open Source ProjectLeading a Community-Driven Open Source Project
Leading a Community-Driven Open Source Project
Vincent Massol
 
Developing XWiki
Developing XWikiDeveloping XWiki
Developing XWiki
Vincent Massol
 
XWiki Status - July 2015
XWiki Status - July 2015XWiki Status - July 2015
XWiki Status - July 2015
Vincent Massol
 
XWiki SAS development practices
XWiki SAS development practicesXWiki SAS development practices
XWiki SAS development practices
Vincent Massol
 
XWiki SAS: An open source company
XWiki SAS: An open source companyXWiki SAS: An open source company
XWiki SAS: An open source company
Vincent Massol
 
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
Vincent Massol
 
XWiki Testing with TestContainers
XWiki Testing with TestContainersXWiki Testing with TestContainers
XWiki Testing with TestContainers
Vincent Massol
 
XWiki: The best wiki for developers
XWiki: The best wiki for developersXWiki: The best wiki for developers
XWiki: The best wiki for developers
Vincent Massol
 
Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019Advanced Java Testing @ POSS 2019
Advanced Java Testing @ POSS 2019
Vincent Massol
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projects
Vincent Massol
 
Configuration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainersConfiguration Testing with Docker & TestContainers
Configuration Testing with Docker & TestContainers
Vincent Massol
 
New types of tests for Java projects
New types of tests for Java projectsNew types of tests for Java projects
New types of tests for Java projects
Vincent Massol
 
What's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.xWhat's new in XWiki 9.x and 10.x
What's new in XWiki 9.x and 10.x
Vincent Massol
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality Dashboard
Vincent Massol
 
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and SharepointXWiki: wiki collaboration as an alternative to Confluence and Sharepoint
XWiki: wiki collaboration as an alternative to Confluence and Sharepoint
Vincent Massol
 
Creating your own project's Quality Dashboard
Creating your own project's Quality DashboardCreating your own project's Quality Dashboard
Creating your own project's Quality Dashboard
Vincent Massol
 
XWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army KnifeXWiki: The web's Swiss Army Knife
XWiki: The web's Swiss Army Knife
Vincent Massol
 
Leading a Community-Driven Open Source Project
Leading a Community-Driven Open Source ProjectLeading a Community-Driven Open Source Project
Leading a Community-Driven Open Source Project
Vincent Massol
 
XWiki Status - July 2015
XWiki Status - July 2015XWiki Status - July 2015
XWiki Status - July 2015
Vincent Massol
 
XWiki SAS development practices
XWiki SAS development practicesXWiki SAS development practices
XWiki SAS development practices
Vincent Massol
 
XWiki SAS: An open source company
XWiki SAS: An open source companyXWiki SAS: An open source company
XWiki SAS: An open source company
Vincent Massol
 
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
XWiki: A web dev runtime for writing web apps @ FOSDEM 2014
Vincent Massol
 

Recently uploaded (20)

How to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabberHow to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabber
eGrabber
 
Build With AI - In Person Session Slides.pdf
Build With AI - In Person Session Slides.pdfBuild With AI - In Person Session Slides.pdf
Build With AI - In Person Session Slides.pdf
Google Developer Group - Harare
 
Cybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and MitigationCybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and Mitigation
VICTOR MAESTRE RAMIREZ
 
Slack like a pro: strategies for 10x engineering teams
Slack like a pro: strategies for 10x engineering teamsSlack like a pro: strategies for 10x engineering teams
Slack like a pro: strategies for 10x engineering teams
Nacho Cougil
 
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptxSmart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Seasia Infotech
 
Bepents tech services - a premier cybersecurity consulting firm
Bepents tech services - a premier cybersecurity consulting firmBepents tech services - a premier cybersecurity consulting firm
Bepents tech services - a premier cybersecurity consulting firm
Benard76
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Raffi Khatchadourian
 
Artificial_Intelligence_in_Everyday_Life.pptx
Artificial_Intelligence_in_Everyday_Life.pptxArtificial_Intelligence_in_Everyday_Life.pptx
Artificial_Intelligence_in_Everyday_Life.pptx
03ANMOLCHAURASIYA
 
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Markus Eisele
 
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
James Anderson
 
AI Agents at Work: UiPath, Maestro & the Future of Documents
AI Agents at Work: UiPath, Maestro & the Future of DocumentsAI Agents at Work: UiPath, Maestro & the Future of Documents
AI Agents at Work: UiPath, Maestro & the Future of Documents
UiPathCommunity
 
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdfKit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Wonjun Hwang
 
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
Ivano Malavolta
 
IT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information TechnologyIT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information Technology
SHEHABALYAMANI
 
Zilliz Cloud Monthly Technical Review: May 2025
Zilliz Cloud Monthly Technical Review: May 2025Zilliz Cloud Monthly Technical Review: May 2025
Zilliz Cloud Monthly Technical Review: May 2025
Zilliz
 
Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?
Eric Torreborre
 
Mastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B LandscapeMastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B Landscape
marketing943205
 
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptxTop 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
mkubeusa
 
Q1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor PresentationQ1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor Presentation
Dropbox
 
Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...
Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...
Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...
Maarten Verwaest
 
How to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabberHow to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabber
eGrabber
 
Cybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and MitigationCybersecurity Threat Vectors and Mitigation
Cybersecurity Threat Vectors and Mitigation
VICTOR MAESTRE RAMIREZ
 
Slack like a pro: strategies for 10x engineering teams
Slack like a pro: strategies for 10x engineering teamsSlack like a pro: strategies for 10x engineering teams
Slack like a pro: strategies for 10x engineering teams
Nacho Cougil
 
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptxSmart Investments Leveraging Agentic AI for Real Estate Success.pptx
Smart Investments Leveraging Agentic AI for Real Estate Success.pptx
Seasia Infotech
 
Bepents tech services - a premier cybersecurity consulting firm
Bepents tech services - a premier cybersecurity consulting firmBepents tech services - a premier cybersecurity consulting firm
Bepents tech services - a premier cybersecurity consulting firm
Benard76
 
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Challenges in Migrating Imperative Deep Learning Programs to Graph Execution:...
Raffi Khatchadourian
 
Artificial_Intelligence_in_Everyday_Life.pptx
Artificial_Intelligence_in_Everyday_Life.pptxArtificial_Intelligence_in_Everyday_Life.pptx
Artificial_Intelligence_in_Everyday_Life.pptx
03ANMOLCHAURASIYA
 
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Enterprise Integration Is Dead! Long Live AI-Driven Integration with Apache C...
Markus Eisele
 
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
James Anderson
 
AI Agents at Work: UiPath, Maestro & the Future of Documents
AI Agents at Work: UiPath, Maestro & the Future of DocumentsAI Agents at Work: UiPath, Maestro & the Future of Documents
AI Agents at Work: UiPath, Maestro & the Future of Documents
UiPathCommunity
 
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdfKit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Kit-Works Team Study_팀스터디_김한솔_nuqs_20250509.pdf
Wonjun Hwang
 
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
On-Device or Remote? On the Energy Efficiency of Fetching LLM-Generated Conte...
Ivano Malavolta
 
IT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information TechnologyIT488 Wireless Sensor Networks_Information Technology
IT488 Wireless Sensor Networks_Information Technology
SHEHABALYAMANI
 
Zilliz Cloud Monthly Technical Review: May 2025
Zilliz Cloud Monthly Technical Review: May 2025Zilliz Cloud Monthly Technical Review: May 2025
Zilliz Cloud Monthly Technical Review: May 2025
Zilliz
 
Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?Shoehorning dependency injection into a FP language, what does it take?
Shoehorning dependency injection into a FP language, what does it take?
Eric Torreborre
 
Mastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B LandscapeMastering Testing in the Modern F&B Landscape
Mastering Testing in the Modern F&B Landscape
marketing943205
 
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptxTop 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
Top 5 Benefits of Using Molybdenum Rods in Industrial Applications.pptx
mkubeusa
 
Q1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor PresentationQ1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor Presentation
Dropbox
 
Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...
Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...
Limecraft Webinar - 2025.3 release, featuring Content Delivery, Graphic Conte...
Maarten Verwaest
 

Implementing Quality on Java projects

  • 1. Implementing Quality on Java projects Vincent Massol Committer XWiki XWiki SAS @vmassol 27 au 29 mars 2013 Sunday, March 31, 13
  • 2. Vincent Massol • Speaker Bio • CTO XWiki SAS • Your Projects • XWiki (community-driven open source project) • Past: Maven, Apache Cargo, Apache Cactus, Pattern Testing • Other Credentials: • LesCastCodeurs podcast • Creator of OSSGTP open source group in Paris • 3 books: JUnit in Action, Maven: A Developer’s Notebook, BBWM Sunday, March 31, 13
  • 4. The XWiki project in summary • 9 years old • 28 active committers • 7 committers do 80% of work • 700K NCLOC • 11 commits/ day • 16 mails/day Sunday, March 31, 13
  • 5. Examples of Quality actions • Coding rules (Checkstyle, ...) • Ensure API stability • Test coverage • Code reviews • Track bugs • License header checks • Don’t use Commons Lang 2.x • Release with Java 6 • Use SLF4J and don’t draw Log4J/ • Ensure javadoc exist JCL in dependencies • Prevent JAR hell • Automated build • Release often (every 2 weeks) • Automated unit tests • Collaborative design • Stable automated • Test on supported functional tests environments (DB & Browsers) Sunday, March 31, 13
  • 6. Quality Tip #1 API Stability 27 au 29 mars 2013 Sunday, March 31, 13
  • 7. The Problem Class Not Found or Method Not Found Sunday, March 31, 13
  • 8. API Stability - Deprecations /** * ... * @deprecated since 2.4M1 use {@link #transform( * Block, TransformationContext)} */ @Deprecated void transform(XDOM dom, Syntax syntax) throws TransformationException; Sunday, March 31, 13
  • 9. API Stability - CLIRR (1/2) <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>clirr-maven-plugin</artifactId> <configuration> <ignored> <difference> <differenceType>7006</differenceType> <className>org/xwiki/.../MetaDataBlock</className> <method>org.xwiki....block.Block clone()</method> <to>org.xwiki.rendering.block.MetaDataBlock</to> <justification>XDOM#clone() doesn't clone the meta data</justification> </difference> ... Sunday, March 31, 13
  • 10. API Stability - CLIRR (2/2) Example from XWiki 5.0M1 Release notes Sunday, March 31, 13
  • 11. API Stability - Internal Package Javadoc <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin <configuration> <excludePackageNames>*.internal.* </excludePackageNames> CLIRR <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>clirr-maven-plugin</artifactId> <excludes> <exclude>**/internal/**</exclude> <exclude>**/test/**</exclude> Sunday, March 31, 13
  • 12. API Stability - Legacy Module Aspect Weaving <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</...> ... <configuration> <weaveDependencies> <weaveDependency> <groupId>org.xwiki.rendering</...> <artifactId>xwiki-rendering-api</...> ... + “Legacy” Profile Sunday, March 31, 13
  • 13. API Stability - Young APIs /** * ... * @since 5.0M1 */ @Unstable(<optional explanation>) public EntityReference createEntityReference(String name,...) { ... } + max duration for keeping the annotation! Sunday, March 31, 13
  • 14. API Stability - Next steps • Annotation or package for SPI? • Better define when to use the @Unstable annotation • Not possible to add a new method to an existing Interface • Java 8 and Virtual Extension/Defender methods interface TestInterface {   public void testMe();   public void newMethod() default {     System.out.println("Default from interface");   } } Sunday, March 31, 13
  • 15. Quality Tip #2 JAR Hell 27 au 29 mars 2013 Sunday, March 31, 13
  • 16. The Problem Class Not Found or Method Not Found or not working feature Sunday, March 31, 13
  • 17. No duplicate classes @ runtime <plugin> <groupId>com.ning.maven.plugins</groupId> <artifactId>maven-duplicate-finder-plugin</artifactId> <executions> <execution> <phase>verify</phase> <goals> <goal>check</goal> </goals> <configuration> <failBuildInCaseOfConflict>true</...> <exceptions> ... Sunday, March 31, 13
  • 18. Surprising results... • Commons Beanutils bundles some classes from Commons Collections, apparently to avoid drawing a dependency to it... • Xalan bundles a lot of other projects (org/apache/xml/**, org/apache/ bcel/**, JLex/**, java_cup/**, org/apache/regexp/**). In addition, it even has these jars in its source tree without any indication about their versions... • stax-api, geronimo-stax-api_1.0_spec and xml-apis all draw javax.xml.stream.* classes • xmlbeans and xml-apis draw incompatible versions of org.w3c.dom.* classes 14 exceptions in total! Sunday, March 31, 13
  • 19. Maven: dependency version issue <dependencies> <dependency> Will run logback 0.9.9 <groupId>org.slf4j</groupId> with slf4J-api 1.4.0 <artifactId>slf4j-api</artifactId> instead of 1.5.0! <version>1.4.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>0.9.9</version> <!-- Depends on org.slf4j:slf4j-api:1.5.0 --> </dependency> </dependencies> Sunday, March 31, 13
  • 20. Maven: ensure correct version <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <executions> <execution> <id>enforce-version-compatibility</id> <phase>verify</phase> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <requireUpperBoundDeps/> </rules> Sunday, March 31, 13
  • 21. Quality Tip #3 Test Coverage 27 au 29 mars 2013 Sunday, March 31, 13
  • 22. The Problem More bugs reported, overall quality goes down and harder to debug software Sunday, March 31, 13
  • 23. Use Jacoco to fail the build <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution><id>jacoco-prepare</id> <goals><goal>prepare-agent</goal></goals> </execution> <execution><id>jacoco-check</id> <goals><goal>check</goal></goals> </execution> </executions> <configuration> <check> <instructionRatio>${xwiki.jacoco.instructionRatio}</...> </check>} Sunday, March 31, 13
  • 24. Strategy • When devs add code (and thus tests), increase the TPC percentage • Put the Jacoco check in “Quality” Maven Profile • Have a CI job to execute that profile regularly • About 15% overhead compared to build without checks • “Cheat mode”: Add easier-to-write test Sunday, March 31, 13
  • 25. Quizz Time! Step 1: Building on my local machine gives the following: [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check) [INFO] All coverage checks have been met. Step 2: Building on the CI machine gave: [INFO] --- jacoco-maven-plugin:0.6.2.201302030002:check (jacoco-check) [WARNING] Insufficient code coverage for INSTRUCTION: 75.52% < 75.53% Non determinism! Why? Sunday, March 31, 13
  • 26. Quizz Answer ... because the JVM is non deterministic! private Map componentEntries = new ConcurrentHashMap(); ... for (Map.Entry entry : componentEntries.entrySet()) { if (entry.getValue().instance == component) {   key = entry.getKey();     oldDescriptor = entry.getValue().descriptor;     break;   } } Sunday, March 31, 13
  • 27. Quality Tip #4 Functional Testing Stability (with Jenkins) 27 au 29 mars 2013 Sunday, March 31, 13
  • 28. The Problem Too many false positives leading to developers not paying attention to CI emails anymore... leading to failing software Sunday, March 31, 13
  • 29. False positives examples • The JVM has crashed • VNC is down (we run Selenium tests) • Browser crash (we run Selenium tests) • Git connection issue • Machine slowness (if XWiki cannot start under 2 minutes then it means the machine has some problems) • Nexus is down (we deploy our artifacts to a Nexus repository) • Connection issue (Read time out) Sunday, March 31, 13
  • 30. Step 1: Groovy PostBuild Plugin (1/2) def messages = [ [".*A fatal error has been detected by the Java Runtime Environment.*", "JVM Crash", "A JVM crash happened!"], [".*Error: cannot open display: :1.0.*", "VNC not running", "VNC connection issue!"], ... ] def shouldSendEmail = true messages.each { message -> if (manager.logContains(message.get(0))) { manager.addWarningBadge(message.get(1)) manager.createSummary("warning.gif").appendText(...) manager.buildUnstable() shouldSendEmail = false } } Sunday, March 31, 13
  • 31. Step 1: Groovy PostBuild Plugin (2/2) ... continued from previous slide... if (!shouldSendEmail) { def pa = new ParametersAction([ new BooleanParameterValue("noEmail", true) ]) manager.build.addAction(pa) } Sunday, March 31, 13
  • 32. Step 2: Mail Ext Plugin Pre-send Script import hudson.model.* build.actions.each { action -> if (action instanceof ParametersAction) { if (action.getParameter("noEmail")) { cancel = true } } } Sunday, March 31, 13
  • 33. Results + use the Scriptler plugin to automate configuration for all jobs Sunday, March 31, 13
  • 34. Quality Tip #5 Bug Fixing Day 27 au 29 mars 2013 Sunday, March 31, 13
  • 35. The Problem Bugs increasing, even simple to fix ones, devs focusing too much on new features (i.e. scope creep) vs fixing Bugs created vs closed what exists Sunday, March 31, 13
  • 36. Bug Fixing Day • Every Thursday • Goal is to close the max number of bugs • Triaging: Can be closed with Won’t fix, Duplicate, Cannot Reproduce, etc • Close low hanging fruits in priority • Started with last 365 days then with last 547 days and currently with last 730 days (we need to catch up with 40 bugs!) Sunday, March 31, 13
  • 38. Conclusion 27 au 29 mars 2013 Sunday, March 31, 13
  • 39. Parting words • Slowly add new quality check over time • Everyone must be on board • Favor Active Quality (i.e. make the build fail) over Passive checks • Be ready to adapt/remove checks if found not useful enough • Quality brings some risks: • Potentially less committers for your project (especially open source) • Project seen as “less fun” Sunday, March 31, 13
  • 40. Be proud of your Quality! “I have offended God and mankind because my work didn't reach the quality it should have.” Leonardo da Vinci, on his death bed Sunday, March 31, 13
  翻译: