SlideShare una empresa de Scribd logo
1 de 191
Main sponsor




Every Rose Has Its Thorn
 Taming automated tests beast

       Wojciech Seliga
Every Rose Has Its
      Thorn




 Taming automated tests beast
About me
• 29 years coding
• Agile Practices (inc. TDD) since 2003
• Certified ScrumMaster, Agile Coach,
  Trainer, Speaker

• 4+ years with Atlassian (JIRA
  Development Team Lead)

• Co-founder of Spartez
The Story
Codebase
Almost 10 years old
From 2 to about 40
    engineers
Obsessed with Quality
Obsessed with
Automated Tests
... From the Begining
1.5M lines of code
1.5M lines of code
Cheating

1.5M lines of code
Mixture of
technologies
XStream
 OSGi    REST                      Velocity
                       Jersey
             Pico
Active             OfBiz EntityEngine Guava
Objects    LESS
                Java                OpenSocial
                       OS Workflow
    Quartz

Jackson
            Mixture of               Lucene


           technologies                JQuery
 Spring
           XML       Underscore              Soy
                                  Seraph
  OAuth            Maven2
           JSP             Webwork         JDBC
Javamail         Backbone.js    SpringDM
Lots of Dependencies
maven dependencies


mvn dependency:list -DincludeScope=compile -o | grep :jar | cut -c 11- | sed
            s/:provided// | sed s/:compile//| sort -u|wc -l
554
   maven dependencies


mvn dependency:list -DincludeScope=compile -o | grep :jar | cut -c 11- | sed
            s/:provided// | sed s/:compile//| sort -u|wc -l
Atlassian
maven dependencies
217
    Atlassian
maven dependencies
217
    Atlassian
maven dependencies

 Atlassian-patched
maven dependencies
217
    Atlassian
maven dependencies
         20
 Atlassian-patched
maven dependencies
65 modules in one IntelliJ project
65 modules in one IntelliJ project
65 modules in one IntelliJ project
13000 unit tests
Almost 1000
Selenium Tests
4000 Functional and
 Integration Tests
Atlassian JIRA
Our CI environment
Test frameworks
• JUnit 3 and 4
• JMock, Easymock, Mockito
• Powermock, Hamcrest
• QUnit, HtmlUnit
• JWebUnit, Selenium, WebDriver
• Custom runners, extensions, matchers
Test frameworks
• JUnit 3 and 4
• JMock, Easymock, Mockito
• Powermock, Hamcrest
• QUnit, HtmlUnit
• JWebUnit, Selenium, WebDriver
• Custom runners, extensions, matchers
Bamboo Setup


• Dedicated server with 70+ remote
  agents (including Amazon Elastic)
• Build engineers
• Bamboo devs
for each main branch
for each main branch
Run first
Run first



Run in parallel
  in batches
There
  is
Much
More
Type of Tests
• Unit
• Functional
• Selenium / WebDriver
• Integration
• Platform
• Performance
Platforms
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows
• Dimension - Java ver.: 1.5, 1.6, 1.7
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows
• Dimension - Java ver.: 1.5, 1.6, 1.7
• Dimension - CPU arch.: 32-bit, 64-bit
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows
• Dimension - Java ver.: 1.5, 1.6, 1.7
• Dimension - CPU arch.: 32-bit, 64-bit
• Dimension - Deployment Mode: Standalone,
  Tomcat, Websphere, Weblogic
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows
• Dimension - Java ver.: 1.5, 1.6, 1.7
• Dimension - CPU arch.: 32-bit, 64-bit
• Dimension - Deployment Mode: Standalone,
  Tomcat, Websphere, Weblogic

• Dimension - Browsers: IE 8+, FF, Chrome,
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows
• Dimension - Java ver.: 1.5, 1.6, 1.7
• Dimension - CPU arch.: 32-bit, 64-bit
• Dimension - Deployment Mode: Standalone,
  Tomcat, Websphere, Weblogic

• Dimension - Browsers: IE 8+, FF, Chrome,
Platforms
• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows          Coming
• Dimension - Java ver.: 1.5, 1.6, 1.7
• Dimension - CPU arch.: 32-bit, 64-bit
• Dimension - Deployment Mode: Standalone,
  Tomcat, Websphere, Weblogic

• Dimension - Browsers: IE 8+, FF, Chrome,
Run Nightly
              Platforms               or Before
                                       Release

• Dimension - DB: MySQL, PostgreSQL, MS
  SQL, Oracle

• Dimension - OS: Linux, Windows          Coming
• Dimension - Java ver.: 1.5, 1.6, 1.7
• Dimension - CPU arch.: 32-bit, 64-bit
• Dimension - Deployment Mode: Standalone,
  Tomcat, Websphere, Weblogic

• Dimension - Browsers: IE 8+, FF, Chrome,
Triggering Builds


• On Commit (hooks, polling)
• Dependent Builds
• Nightly Builds
• Manual Builds
But...
Slow unit test
Very slow functional tests
Builds Wait in The Queue
Builds Often Fail
Too Often...
It takes time to fix it...
Sometimes very long
You commit at 3 PM
You commit at 3 PM


You get “Unit Test Green” email at 4PM
You commit at 3 PM


You get “Unit Test Green” email at 4PM


         You happily go home
You commit at 3 PM


  You get “Unit Test Green” email at 4PM


            You happily go home


You get flood of “Red Test X” emails at 4 - 9PM
You commit at 3 PM


  You get “Unit Test Green” email at 4PM


            You happily go home


You get flood of “Red Test X” emails at 4 - 9PM


      Your colleagues on the
      other side of the globe
You commit at 3 PM


  You get “Unit Test Green” email at 4PM


            You happily go home


You get flood of “Red Test X” emails at 4 - 9PM


      Your colleagues on the
                                    You
      other side of the globe
“Slow CI loop and non-
  deterministic tests are
strong inhibitor of change
 instead of the catalyst”


                    by W. Seliga
“We probably spend more
time dealing with the JIRA
  test codebase than the
  production codebase”
Striving for Coverage
                     100



                     75




                           Test Coverage
                     50



                     25



   Effort Invested   0
Strange? Relationship
                                 100%


                                 75%




                                        Value
                                 50%


                                 25%



Investments in automated tests   0%
Outcomes

• Development slows down
• Devs are afraid of change
• Software difficult to release
• Significant amount of time spent on
  analysing test failures

• Morale goes down
Feedback
               Quality
 Speed
           `
Feedback Loop Speed

• Tiniest change triggers test avalanche
• Lack of responsibility syndrome
• Devs do not run tests locally (speed)
• Before you get the results you are at
  home
Quality

• Non-deterministic tests (races,
  timeouts)
• Catching up with UI changes
• 1 red test hides new failures
• Ignoring always red tests in
  dangerous ...
Broken window theory
Long time to fix
Decisions which do not
        scale
Decisions which do not
        scale
• All unit tests in one maven module
Decisions which do not
        scale
• All unit tests in one maven module
• All functional tests in one maven module
Decisions which do not
        scale
• All unit tests in one maven module
• All functional tests in one maven module
• All Selenium and web-driver tests in one
  module
Decisions which do not
        scale
• All unit tests in one maven module
• All functional tests in one maven module
• All Selenium and web-driver tests in one
  module

• Every commit triggers rebuild and re-test of
  everything
Decisions which do not
        scale
• All unit tests in one maven module
• All functional tests in one maven module
• All Selenium and web-driver tests in one
  module

• Every commit triggers rebuild and re-test of
  everything

• Monolithic test framework / utils
Decisions which do not
        scale
• All unit tests in one maven module
• All functional tests in one maven module
• All Selenium and web-driver tests in one
  module

• Every commit triggers rebuild and re-test of
  everything

• Monolithic test framework / utils
• Opaque fixtures
Strategies
Test Quality
Problem:
Catching up with UI
     changes
Problem:
Catching up with UI
     changes

     Solution:
Problem:
Catching up with UI
     changes

     Solution:
Page Objects Pattern
Page Objects Pattern
• Page Objects model UI elements (pages,
  components, dialogs, areas) your tests
  interact with

• Page Objects shield tests from changing
  internal structure of the page

• Page Objects generally do not make
  assertions

• Designed for chaining
Page Objects Example
public class AddUserPage extends AbstractJiraPage       @Override
{                                                         public TimedCondition isAt()
                                                          {
    private static final String URI =                         return and(username.timed().isPresent(),
         "/secure/admin/user/AddUser!default.jspa";   password.timed().isPresent(), fullName.timed().isPresent());
                                                          }
    @ElementBy(name = "username")
    private PageElement username;                         public AddUserPage addUser(final String username,
                                                               final String password, final String fullName, final
    @ElementBy(name = "password")                              String email, final boolean receiveEmail)
    private PageElement password;                         {
                                                              this.username.type(username);
    @ElementBy(name = "confirm")                              this.password.type(password);
    private PageElement passwordConfirmation;                 this.passwordConfirmation.type(password);
                                                              this.fullName.type(fullName);
    @ElementBy(name = "fullname")                             this.email.type(email);
    private PageElement fullName;                             if(receiveEmail) {
                                                                  this.sendEmail.select();
    @ElementBy(name = "email")                                }
    private PageElement email;                                return this;
                                                          }
    @ElementBy(name = "sendemail")
    private PageElement sendEmail;                        public ViewUserPage createUser()
                                                          {
    @ElementBy(id = "user-create-submit")                     return createUser(ViewUserPage.class);
    private PageElement submit;                           }

    @ElementBy (id = "user-create-cancel")
    private PageElement cancelButton;                     public <T extends Page> T createUser(Class<T> nextPage,
                                                      Object...args)
    @Override                                             {
    public String getUrl()                                    submit.click();
    {                                                         return pageBinder.bind(nextPage, args);
        return URI;                                       }
    }
                         ...
Using Page Objects
@Test
public void testServerError()
{
    jira.gotoLoginPage().loginAsSysAdmin(AddUserPage.class)
            .addUser("username", "mypassword", "My Name",
                     "sample@email.com", false)
            .createUser();
  // assertions here
}
Using Page Objects
@Test
public void testImportSampleProject() {
    final PivotalImporterSetupPage setupPage = getSetupPage();
    Assert.assertEquals("1. Connect", setupPage.getActiveTabText());

    final PivotalProjectsMappingsPage projectMappingPage = setupPage.next();
    Assert.assertEquals("2. Project Mapping", setupPage.getActiveTabText());
    Assert.assertTrue("Expecting all project to be selected by default",
        projectMappingPage.areAllProjectsSelected());
    projectMappingPage.setImportAllProjects(false);
    projectMappingPage.setProjectImported(sampleProject, true);
    projectMappingPage.createProject(sampleProject, sampleProject, "SAMPLE");

    final ImporterFinishedPage importerLogsPage =
        projectMappingPage.beginImport().waitUntilFinished();
    Assert.assertTrue(importerLogsPage.isSuccess());
    Assert.assertEquals(0, importerLogsPage.getGlobalErrors().size());
    Assert.assertEquals("1", importerLogsPage.getProjectsImported());

    // more assertions here
}
More on Page Objects

• Design for reusability
• Design for sharing - libraries of Page
  Objects

• Good support by WebDriver/Selenium 2
• Atlassian Selenium 2.0
Problem:
Opaque Test Fixtures
Problem:
Opaque Test Fixtures


     Solution:
Problem:
Opaque Test Fixtures


     Solution:
 REST-based Set-up
REST-based Setup
REST-based Setup
@Before
public void setUpTest() {
    restore("some-big-xml-file-with-everything-needed-inside.xml");
}
REST-based Setup
@Before
public void setUpTest() {
    restore("some-big-xml-file-with-everything-needed-inside.xml");
}




                              VS
REST-based Setup
@Before
public void setUpTest() {
    restore("some-big-xml-file-with-everything-needed-inside.xml");
}




                              VS
@Before
public void setUpTest() {
    restClient.restoreEmptyInstance();
    restClient.createProject(/* project params */);
    restClient.createUser(/* user params */);
    restClient.createUser(/* user params */);
    restClient.createSomethingElse(/* ... */);
}
Problem:
Flakey Tests
Problem:
Flakey Tests

 Solution:
Problem:
Flakey Tests

 Solution:
Quarantine
Problem:
 Flakey Tests

   Solution:
  Quarantine

Fix
Problem:
 Flakey Tests

   Solution:
  Quarantine

Fix    Eradicate
Quarantine




• @Ignore
• @Category
• Quarantine on CI server
• Recover or Die
Quarantine




• @Ignore
• @Category
• Quarantine on CI server
• Recover or Die
Problem:
Fixing Flakey Tests
Problem:
Fixing Flakey Tests

     Solution:
Problem:
Fixing Flakey Tests

   Solution:
Timed Conditions
Problem:
Fixing Flakey Tests

       Solution:
  Timed Conditions
Test-friendly Markup
Problem:
 Fixing Flakey Tests

       Solution:
  Timed Conditions
Test-friendly Markup
Mock Unreliable Deps
Timed Conditions
Test-friendly Markup
• Do not save on IDs
• Do not save on CSS classes
• XPath is fragile
• XPath is expensive
• XPath is not readable
• i18N
Mock Unreliable
 Dependencies
Speed
Aiming at 10 seconds build
Speed
Aiming at 10 seconds build
Splitting Codebase
 The easiest and most effective
         improvement
Splitting Codebase

• Tests closer to tested code
• Less to test
• Testing less frequently
• Increased team responsibility
• Restructuring CI hierarchy - more
  complicated picture
Less to Test
Less to Test   Commit
Less to Test   Commit
Less to Test   Commit
Less to Test   Commit
Less to Test
Less to Test




Most of commits happen here
Speed vs Control
  Workspace Dilemma


• Incubation
• Maturity
• Custom workspaces
Test Execution Time
Execution Time:
  Test Level
Execution Time:
  Test Level

     Unit Tests
Execution Time:
  Test Level

     Unit Tests

   REST API Tests
Execution Time:
  Test Level

       Unit Tests

    REST API Tests

JWebUnit/HTMLUnit Tests
Execution Time:
  Test Level

       Unit Tests

     REST API Tests

JWebUnit/HTMLUnit Tests

Selenium/WebDriver Tests
Execution Time:
  Test Level

       Unit Tests

     REST API Tests

JWebUnit/HTMLUnit Tests

Selenium/WebDriver Tests
Execution Time:
     Test Level
Speed

           Unit Tests

         REST API Tests

    JWebUnit/HTMLUnit Tests

    Selenium/WebDriver Tests
Execution Time:
     Test Level
Speed

           Unit Tests

         REST API Tests

    JWebUnit/HTMLUnit Tests

    Selenium/WebDriver Tests
Execution Time:
     Test Level
Speed                     Confidence

           Unit Tests

         REST API Tests

    JWebUnit/HTMLUnit Tests

    Selenium/WebDriver Tests
Execution time - Cont.

• Batching
• Several tests per single set-up
  (violation of test isolation)

• REST-based assertions
• Remove / merge overlapping tests
Execution time - Cont.
• IDs over CSS/JQuery Selectors over XPath
• JUnit tests running in the container
• In-process testing
• In-memory DBs
• Mocking web servers
• Reducing framework initialization time
• Test Optimization (Clover)
Waiting time

• More build agents
• Shorter and smaller tests
• No sleep()
• Avoiding long fixture setup (hot
  container, fragmented setup)
Preparation Time

• SCM performance
• Container set-up
• Compilation time (GWT...)
• Maven...
• Artifacts passing
So how about the
     goals?
Is 10 seconds build realistic?
Realistic Goals (for us*)
Realistic Goals (for us*)




              *My current personal dreams
Realistic Goals (for us*)

 Time                 Type

           for unit tests for 95% of the
 2 min
                     commits
          for base smoke functional tests
 5 min
               for 95% of the commits
           for ALL tests for 95% of the
 15 min
          commits on selected platform

 30 min   for ALL tests for ALL commits

                     *My current personal dreams
Realistic Goals (for us*)

 Time                 Type

           for unit tests for 95% of the
 2 min
                     commits
          for base smoke functional tests
 5 min
               for 95% of the commits
           for ALL tests for 95% of the
 15 min
          commits on selected platform

 30 min   for ALL tests for ALL commits

                     *My current personal dreams
Realistic Goals (for us*)

 Time                 Type

           for unit tests for 95% of the
 2 min
                     commits
          for base smoke functional tests
 5 min
               for 95% of the commits
           for ALL tests for 95% of the
 15 min
          commits on selected platform

 30 min   for ALL tests for ALL commits

                     *My current personal dreams
Realistic Goals (for us*)

 Time                 Type

           for unit tests for 95% of the
 2 min
                     commits
          for base smoke functional tests
 5 min
               for 95% of the commits
           for ALL tests for 95% of the
 15 min
          commits on selected platform

 30 min   for ALL tests for ALL commits

                     *My current personal dreams
Realistic Goals (for us*)

 Time                 Type

           for unit tests for 95% of the
 2 min
                     commits
          for base smoke functional tests
 5 min
               for 95% of the commits
           for ALL tests for 95% of the
 15 min
          commits on selected platform

 30 min   for ALL tests for ALL commits

                     *My current personal dreams
Realistic Goals (for us*) p.2
Realistic Goals (for us*) p.2




                *My current personal dreams
Realistic Goals (for us*) p.2

   Metric                 Type

   >98%              green unit tests

   >95%          green functional tests

   <20min      average time to fix unit test

    <2h     average time to fix functional test

                         *My current personal dreams
Realistic Goals (for us*) p.2

   Metric                 Type

   >98%              green unit tests

   >95%          green functional tests

   <20min      average time to fix unit test

    <2h     average time to fix functional test

                         *My current personal dreams
Realistic Goals (for us*) p.2

   Metric                 Type

   >98%              green unit tests

   >95%          green functional tests

   <20min      average time to fix unit test

    <2h     average time to fix functional test

                         *My current personal dreams
Realistic Goals (for us*) p.2

   Metric                 Type

   >98%              green unit tests

   >95%          green functional tests

   <20min      average time to fix unit test

    <2h     average time to fix functional test

                         *My current personal dreams
Realistic Goals (for us*) p.2

   Metric                 Type

   >98%              green unit tests

   >95%          green functional tests

   <20min      average time to fix unit test

    <2h     average time to fix functional test

                         *My current personal dreams
Our Possible Future
• Further splitting the code-base, incubation
  and maturity

• Finer-grained team responsibilities
• Merciless quarantine and purging of flakey
  tests

• More page objects, less old-school Selenium
• Refactoring/removal of slow tests
• More REST-driven test fixtures and assertions
Take-aways
Automated testing has
 cumulative benefits
Automated testing has
  cumulative benefits
...and cumulative cost
Splitting codebase is
 key aspect of short
 test feedback loop
Test Code is Not
     Trash
Respect



Test Code is Not
     Trash
Respect
Design


   Test Code is Not
        Trash
Respect
Design


   Test Code is Not
        Trash
               Maintain
Respect
Design


   Test Code is Not
        Trash
                Maintain
       Review
Respect
Design


   Test Code is Not
        Trash
Refactor
                Maintain
       Review
Respect    Restructure
Design


   Test Code is Not
        Trash
Refactor
                  Maintain
       Review
Respect    Restructure
Design            Share


   Test Code is Not
        Trash
Refactor
                  Maintain
       Review
Respect    Restructure
Design            Share


   Test Code is Not
        Trash
Refactor
                  Maintain
       Review
                Discuss
Respect   Restructure
Design           Share
         Prune

   Test Code is Not
        Trash
Refactor
                 Maintain
       Review
                Discuss
Optimum Balance
Optimum Balance




Isolation
Optimum Balance




Isolation Speed
Optimum Balance




Isolation Speed Coverage
Optimum Balance




Isolation Speed Coverage Level
Optimum Balance




Isolation Speed Coverage Level Structure
Optimum Balance




Isolation Speed Coverage Level Structure Effort
Dangerous to temper with
Dangerous to temper with




Quality / Determinism
Dangerous to temper with




Quality / Determinism   Maintainability
There are no universal
 rules - silver bullets
There are no universal
 rules - silver bullets
 We are expected to find
optimum balance for our
      specific case
There are no universal
 rules - silver bullets
 We are expected to find
optimum balance for our
      specific case
Definition of “optimum”
  constantly changes
Otherwise
Otherwise
Did I mention that
Page Objects pattern?
Credits

• Photos:
  • http://www.flickr.com/photos/toofarnorth/ - Dragon

  • http://www.flickr.com/photos/striatic - Frustration
  • http://www.flickr.com/photos/leeadlaf/ - Broken window

  • http://www.flickr.com/photos/johnloo/ - Lightbulb

• Dariusz Kordoński - for Test
  Improvements Leadership in JIRA
Thank You

Más contenido relacionado

La actualidad más candente

Apache Maven - eXo TN presentation
Apache Maven - eXo TN presentationApache Maven - eXo TN presentation
Apache Maven - eXo TN presentationArnaud Héritier
 
Elm - Could this be the Future of Web Dev?
Elm - Could this be the Future of Web Dev?Elm - Could this be the Future of Web Dev?
Elm - Could this be the Future of Web Dev?David Hoerster
 
Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)Jeremy Edberg
 
Lorraine JUG (1st June, 2010) - Maven
Lorraine JUG (1st June, 2010) - MavenLorraine JUG (1st June, 2010) - Maven
Lorraine JUG (1st June, 2010) - MavenArnaud Héritier
 
OSDC 2013 | Introduction into Chef by Andy Hawkins
OSDC 2013 | Introduction into Chef by Andy HawkinsOSDC 2013 | Introduction into Chef by Andy Hawkins
OSDC 2013 | Introduction into Chef by Andy HawkinsNETWAYS
 
Scala adoption by enterprises
Scala adoption by enterprisesScala adoption by enterprises
Scala adoption by enterprisesMike Slinn
 
Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014Ngoc Dao
 
DefCore: The Interoperability Standard for OpenStack
DefCore: The Interoperability Standard for OpenStackDefCore: The Interoperability Standard for OpenStack
DefCore: The Interoperability Standard for OpenStackMark Voelker
 
OpenStack: Toward a More Resilient Cloud
OpenStack: Toward a More Resilient CloudOpenStack: Toward a More Resilient Cloud
OpenStack: Toward a More Resilient CloudMark Voelker
 
The Economies of Scaling Software
The Economies of Scaling SoftwareThe Economies of Scaling Software
The Economies of Scaling SoftwareAbdelmonaim Remani
 
No Container: a Modern Java Stack with Bootique
No Container: a Modern Java Stack with BootiqueNo Container: a Modern Java Stack with Bootique
No Container: a Modern Java Stack with BootiqueAndrus Adamchik
 
System Integration with Akka and Apache Camel
System Integration with Akka and Apache CamelSystem Integration with Akka and Apache Camel
System Integration with Akka and Apache Camelkrasserm
 

La actualidad más candente (15)

Sonarjenkins ajip
Sonarjenkins ajipSonarjenkins ajip
Sonarjenkins ajip
 
Into The Box 2020 Keynote Day 1
Into The Box 2020 Keynote Day 1Into The Box 2020 Keynote Day 1
Into The Box 2020 Keynote Day 1
 
Apache Maven - eXo TN presentation
Apache Maven - eXo TN presentationApache Maven - eXo TN presentation
Apache Maven - eXo TN presentation
 
Elm - Could this be the Future of Web Dev?
Elm - Could this be the Future of Web Dev?Elm - Could this be the Future of Web Dev?
Elm - Could this be the Future of Web Dev?
 
Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)
 
Lorraine JUG (1st June, 2010) - Maven
Lorraine JUG (1st June, 2010) - MavenLorraine JUG (1st June, 2010) - Maven
Lorraine JUG (1st June, 2010) - Maven
 
OSDC 2013 | Introduction into Chef by Andy Hawkins
OSDC 2013 | Introduction into Chef by Andy HawkinsOSDC 2013 | Introduction into Chef by Andy Hawkins
OSDC 2013 | Introduction into Chef by Andy Hawkins
 
Scala adoption by enterprises
Scala adoption by enterprisesScala adoption by enterprises
Scala adoption by enterprises
 
Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014
 
Scalable Open Source
Scalable Open SourceScalable Open Source
Scalable Open Source
 
DefCore: The Interoperability Standard for OpenStack
DefCore: The Interoperability Standard for OpenStackDefCore: The Interoperability Standard for OpenStack
DefCore: The Interoperability Standard for OpenStack
 
OpenStack: Toward a More Resilient Cloud
OpenStack: Toward a More Resilient CloudOpenStack: Toward a More Resilient Cloud
OpenStack: Toward a More Resilient Cloud
 
The Economies of Scaling Software
The Economies of Scaling SoftwareThe Economies of Scaling Software
The Economies of Scaling Software
 
No Container: a Modern Java Stack with Bootique
No Container: a Modern Java Stack with BootiqueNo Container: a Modern Java Stack with Bootique
No Container: a Modern Java Stack with Bootique
 
System Integration with Akka and Apache Camel
System Integration with Akka and Apache CamelSystem Integration with Akka and Apache Camel
System Integration with Akka and Apache Camel
 

Destacado

La fusta introducció
La fusta introduccióLa fusta introducció
La fusta introduccióllorenpou
 
الإدارة الإلكترونية تحديات التحول
الإدارة الإلكترونية   تحديات التحولالإدارة الإلكترونية   تحديات التحول
الإدارة الإلكترونية تحديات التحولEihab Seoudi
 
Automatic
Automatic Automatic
Automatic kurakin
 
الإدارة الإلكترونية تحديات التحول
الإدارة الإلكترونية   تحديات التحولالإدارة الإلكترونية   تحديات التحول
الإدارة الإلكترونية تحديات التحولEihab Seoudi
 
C&b merchandising
C&b merchandisingC&b merchandising
C&b merchandisingshekarrc
 
Lustige Twitter Sprüche - #watsefack
Lustige Twitter Sprüche - #watsefackLustige Twitter Sprüche - #watsefack
Lustige Twitter Sprüche - #watsefackPiper Verlag
 
Zitate zum Jakobsweg
Zitate zum JakobswegZitate zum Jakobsweg
Zitate zum JakobswegPiper Verlag
 
Genxzine january-01-2013
Genxzine january-01-2013Genxzine january-01-2013
Genxzine january-01-2013Mohammad Khan
 

Destacado (14)

subkebudayaan bencana di sinabung
subkebudayaan bencana di sinabungsubkebudayaan bencana di sinabung
subkebudayaan bencana di sinabung
 
La fusta introducció
La fusta introduccióLa fusta introducció
La fusta introducció
 
الإدارة الإلكترونية تحديات التحول
الإدارة الإلكترونية   تحديات التحولالإدارة الإلكترونية   تحديات التحول
الإدارة الإلكترونية تحديات التحول
 
Presentation1
Presentation1Presentation1
Presentation1
 
중금속
중금속중금속
중금속
 
Automatic
Automatic Automatic
Automatic
 
الإدارة الإلكترونية تحديات التحول
الإدارة الإلكترونية   تحديات التحولالإدارة الإلكترونية   تحديات التحول
الإدارة الإلكترونية تحديات التحول
 
C&b merchandising
C&b merchandisingC&b merchandising
C&b merchandising
 
Anatomi perubahan teori sosial
Anatomi perubahan teori sosialAnatomi perubahan teori sosial
Anatomi perubahan teori sosial
 
Power point pondokan mahasiswa
Power point pondokan mahasiswaPower point pondokan mahasiswa
Power point pondokan mahasiswa
 
Lustige Twitter Sprüche - #watsefack
Lustige Twitter Sprüche - #watsefackLustige Twitter Sprüche - #watsefack
Lustige Twitter Sprüche - #watsefack
 
Zitate zum Jakobsweg
Zitate zum JakobswegZitate zum Jakobsweg
Zitate zum Jakobsweg
 
Genxzine january-01-2013
Genxzine january-01-2013Genxzine january-01-2013
Genxzine january-01-2013
 
Mohammad Hasan Khan
Mohammad Hasan KhanMohammad Hasan Khan
Mohammad Hasan Khan
 

Similar a 33rd degree

Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014Wojciech Seliga
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on RailsAvi Kedar
 
How to use selenium successfully
How to use selenium successfullyHow to use selenium successfully
How to use selenium successfullyTEST Huddle
 
QA Challenge Accepted 4.0 - Cypress vs. Selenium
QA Challenge Accepted 4.0 - Cypress vs. SeleniumQA Challenge Accepted 4.0 - Cypress vs. Selenium
QA Challenge Accepted 4.0 - Cypress vs. SeleniumLyudmil Latinov
 
MyHeritage - End 2 End testing Infra
MyHeritage - End 2 End testing InfraMyHeritage - End 2 End testing Infra
MyHeritage - End 2 End testing InfraMatanGoren
 
My Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is MagicMy Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is MagicApollo Clark
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptTroy Miles
 
Growing Trends of Open Source UI Frameworks
Growing Trends of Open Source UI FrameworksGrowing Trends of Open Source UI Frameworks
Growing Trends of Open Source UI FrameworksSmartBear
 
MyHeritage - QA Automations in a Continuous Deployment environment
MyHeritage -  QA Automations in a Continuous Deployment environmentMyHeritage -  QA Automations in a Continuous Deployment environment
MyHeritage - QA Automations in a Continuous Deployment environmentMatanGoren
 
Performance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle CoherencePerformance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle Coherencearagozin
 
Selenium Automation at Incapsula
Selenium Automation at IncapsulaSelenium Automation at Incapsula
Selenium Automation at Incapsulaadamcarmi
 
Getting Started with Serverless Architectures
Getting Started with Serverless ArchitecturesGetting Started with Serverless Architectures
Getting Started with Serverless ArchitecturesAmazon Web Services
 
Performance Testing using Real Browsers with JMeter & Webdriver
Performance Testing using Real Browsers with JMeter & WebdriverPerformance Testing using Real Browsers with JMeter & Webdriver
Performance Testing using Real Browsers with JMeter & WebdriverBlazeMeter
 
TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...
TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...
TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...Trójmiejska Grupa Testerska
 
Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Niels Frydenholm
 
Structured Functional Automated Web Service Testing
Structured Functional Automated Web Service TestingStructured Functional Automated Web Service Testing
Structured Functional Automated Web Service Testingrdekleijn
 
Mastering Test Automation: How to Use Selenium Successfully
Mastering Test Automation: How to Use Selenium Successfully Mastering Test Automation: How to Use Selenium Successfully
Mastering Test Automation: How to Use Selenium Successfully Applitools
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React AppAll Things Open
 

Similar a 33rd degree (20)

Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014
 
Web Development using Ruby on Rails
Web Development using Ruby on RailsWeb Development using Ruby on Rails
Web Development using Ruby on Rails
 
How to use selenium successfully
How to use selenium successfullyHow to use selenium successfully
How to use selenium successfully
 
QA Challenge Accepted 4.0 - Cypress vs. Selenium
QA Challenge Accepted 4.0 - Cypress vs. SeleniumQA Challenge Accepted 4.0 - Cypress vs. Selenium
QA Challenge Accepted 4.0 - Cypress vs. Selenium
 
MyHeritage - End 2 End testing Infra
MyHeritage - End 2 End testing InfraMyHeritage - End 2 End testing Infra
MyHeritage - End 2 End testing Infra
 
Selenium practical
Selenium practicalSelenium practical
Selenium practical
 
My Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is MagicMy Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is Magic
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScript
 
Growing Trends of Open Source UI Frameworks
Growing Trends of Open Source UI FrameworksGrowing Trends of Open Source UI Frameworks
Growing Trends of Open Source UI Frameworks
 
Building XWiki
Building XWikiBuilding XWiki
Building XWiki
 
MyHeritage - QA Automations in a Continuous Deployment environment
MyHeritage -  QA Automations in a Continuous Deployment environmentMyHeritage -  QA Automations in a Continuous Deployment environment
MyHeritage - QA Automations in a Continuous Deployment environment
 
Performance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle CoherencePerformance Test Driven Development with Oracle Coherence
Performance Test Driven Development with Oracle Coherence
 
Selenium Automation at Incapsula
Selenium Automation at IncapsulaSelenium Automation at Incapsula
Selenium Automation at Incapsula
 
Getting Started with Serverless Architectures
Getting Started with Serverless ArchitecturesGetting Started with Serverless Architectures
Getting Started with Serverless Architectures
 
Performance Testing using Real Browsers with JMeter & Webdriver
Performance Testing using Real Browsers with JMeter & WebdriverPerformance Testing using Real Browsers with JMeter & Webdriver
Performance Testing using Real Browsers with JMeter & Webdriver
 
TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...
TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...
TGT#13 - UI Tests Automation Framework in Evolve EDM – Case Study - Mateusz R...
 
Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...Getting your mobile test automation process in place - using Cucumber and Cal...
Getting your mobile test automation process in place - using Cucumber and Cal...
 
Structured Functional Automated Web Service Testing
Structured Functional Automated Web Service TestingStructured Functional Automated Web Service Testing
Structured Functional Automated Web Service Testing
 
Mastering Test Automation: How to Use Selenium Successfully
Mastering Test Automation: How to Use Selenium Successfully Mastering Test Automation: How to Use Selenium Successfully
Mastering Test Automation: How to Use Selenium Successfully
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
 

Último

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdfChristopherTHyatt
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 

Último (20)

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 

33rd degree

  • 1. Main sponsor Every Rose Has Its Thorn Taming automated tests beast Wojciech Seliga
  • 2. Every Rose Has Its Thorn Taming automated tests beast
  • 3. About me • 29 years coding • Agile Practices (inc. TDD) since 2003 • Certified ScrumMaster, Agile Coach, Trainer, Speaker • 4+ years with Atlassian (JIRA Development Team Lead) • Co-founder of Spartez
  • 6. From 2 to about 40 engineers
  • 9. ... From the Begining
  • 14. XStream OSGi REST Velocity Jersey Pico Active OfBiz EntityEngine Guava Objects LESS Java OpenSocial OS Workflow Quartz Jackson Mixture of Lucene technologies JQuery Spring XML Underscore Soy Seraph OAuth Maven2 JSP Webwork JDBC Javamail Backbone.js SpringDM
  • 16. maven dependencies mvn dependency:list -DincludeScope=compile -o | grep :jar | cut -c 11- | sed s/:provided// | sed s/:compile//| sort -u|wc -l
  • 17. 554 maven dependencies mvn dependency:list -DincludeScope=compile -o | grep :jar | cut -c 11- | sed s/:provided// | sed s/:compile//| sort -u|wc -l
  • 19. 217 Atlassian maven dependencies
  • 20. 217 Atlassian maven dependencies Atlassian-patched maven dependencies
  • 21. 217 Atlassian maven dependencies 20 Atlassian-patched maven dependencies
  • 22. 65 modules in one IntelliJ project
  • 23. 65 modules in one IntelliJ project
  • 24. 65 modules in one IntelliJ project
  • 25.
  • 28. 4000 Functional and Integration Tests
  • 29.
  • 32. Test frameworks • JUnit 3 and 4 • JMock, Easymock, Mockito • Powermock, Hamcrest • QUnit, HtmlUnit • JWebUnit, Selenium, WebDriver • Custom runners, extensions, matchers
  • 33. Test frameworks • JUnit 3 and 4 • JMock, Easymock, Mockito • Powermock, Hamcrest • QUnit, HtmlUnit • JWebUnit, Selenium, WebDriver • Custom runners, extensions, matchers
  • 34. Bamboo Setup • Dedicated server with 70+ remote agents (including Amazon Elastic) • Build engineers • Bamboo devs
  • 35.
  • 36. for each main branch
  • 37. for each main branch
  • 38.
  • 40. Run first Run in parallel in batches
  • 42. Type of Tests • Unit • Functional • Selenium / WebDriver • Integration • Platform • Performance
  • 44. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle
  • 45. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows
  • 46. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows • Dimension - Java ver.: 1.5, 1.6, 1.7
  • 47. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows • Dimension - Java ver.: 1.5, 1.6, 1.7 • Dimension - CPU arch.: 32-bit, 64-bit
  • 48. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows • Dimension - Java ver.: 1.5, 1.6, 1.7 • Dimension - CPU arch.: 32-bit, 64-bit • Dimension - Deployment Mode: Standalone, Tomcat, Websphere, Weblogic
  • 49. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows • Dimension - Java ver.: 1.5, 1.6, 1.7 • Dimension - CPU arch.: 32-bit, 64-bit • Dimension - Deployment Mode: Standalone, Tomcat, Websphere, Weblogic • Dimension - Browsers: IE 8+, FF, Chrome,
  • 50. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows • Dimension - Java ver.: 1.5, 1.6, 1.7 • Dimension - CPU arch.: 32-bit, 64-bit • Dimension - Deployment Mode: Standalone, Tomcat, Websphere, Weblogic • Dimension - Browsers: IE 8+, FF, Chrome,
  • 51. Platforms • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows Coming • Dimension - Java ver.: 1.5, 1.6, 1.7 • Dimension - CPU arch.: 32-bit, 64-bit • Dimension - Deployment Mode: Standalone, Tomcat, Websphere, Weblogic • Dimension - Browsers: IE 8+, FF, Chrome,
  • 52. Run Nightly Platforms or Before Release • Dimension - DB: MySQL, PostgreSQL, MS SQL, Oracle • Dimension - OS: Linux, Windows Coming • Dimension - Java ver.: 1.5, 1.6, 1.7 • Dimension - CPU arch.: 32-bit, 64-bit • Dimension - Deployment Mode: Standalone, Tomcat, Websphere, Weblogic • Dimension - Browsers: IE 8+, FF, Chrome,
  • 53. Triggering Builds • On Commit (hooks, polling) • Dependent Builds • Nightly Builds • Manual Builds
  • 57. Builds Wait in The Queue
  • 60. It takes time to fix it...
  • 63. You commit at 3 PM You get “Unit Test Green” email at 4PM
  • 64. You commit at 3 PM You get “Unit Test Green” email at 4PM You happily go home
  • 65. You commit at 3 PM You get “Unit Test Green” email at 4PM You happily go home You get flood of “Red Test X” emails at 4 - 9PM
  • 66. You commit at 3 PM You get “Unit Test Green” email at 4PM You happily go home You get flood of “Red Test X” emails at 4 - 9PM Your colleagues on the other side of the globe
  • 67. You commit at 3 PM You get “Unit Test Green” email at 4PM You happily go home You get flood of “Red Test X” emails at 4 - 9PM Your colleagues on the You other side of the globe
  • 68. “Slow CI loop and non- deterministic tests are strong inhibitor of change instead of the catalyst” by W. Seliga
  • 69. “We probably spend more time dealing with the JIRA test codebase than the production codebase”
  • 70. Striving for Coverage 100 75 Test Coverage 50 25 Effort Invested 0
  • 71. Strange? Relationship 100% 75% Value 50% 25% Investments in automated tests 0%
  • 72. Outcomes • Development slows down • Devs are afraid of change • Software difficult to release • Significant amount of time spent on analysing test failures • Morale goes down
  • 73. Feedback Quality Speed `
  • 74. Feedback Loop Speed • Tiniest change triggers test avalanche • Lack of responsibility syndrome • Devs do not run tests locally (speed) • Before you get the results you are at home
  • 75. Quality • Non-deterministic tests (races, timeouts) • Catching up with UI changes • 1 red test hides new failures • Ignoring always red tests in dangerous ...
  • 77. Long time to fix
  • 78. Decisions which do not scale
  • 79. Decisions which do not scale • All unit tests in one maven module
  • 80. Decisions which do not scale • All unit tests in one maven module • All functional tests in one maven module
  • 81. Decisions which do not scale • All unit tests in one maven module • All functional tests in one maven module • All Selenium and web-driver tests in one module
  • 82. Decisions which do not scale • All unit tests in one maven module • All functional tests in one maven module • All Selenium and web-driver tests in one module • Every commit triggers rebuild and re-test of everything
  • 83. Decisions which do not scale • All unit tests in one maven module • All functional tests in one maven module • All Selenium and web-driver tests in one module • Every commit triggers rebuild and re-test of everything • Monolithic test framework / utils
  • 84. Decisions which do not scale • All unit tests in one maven module • All functional tests in one maven module • All Selenium and web-driver tests in one module • Every commit triggers rebuild and re-test of everything • Monolithic test framework / utils • Opaque fixtures
  • 88. Problem: Catching up with UI changes Solution:
  • 89. Problem: Catching up with UI changes Solution: Page Objects Pattern
  • 90. Page Objects Pattern • Page Objects model UI elements (pages, components, dialogs, areas) your tests interact with • Page Objects shield tests from changing internal structure of the page • Page Objects generally do not make assertions • Designed for chaining
  • 91. Page Objects Example public class AddUserPage extends AbstractJiraPage @Override { public TimedCondition isAt() { private static final String URI = return and(username.timed().isPresent(), "/secure/admin/user/AddUser!default.jspa"; password.timed().isPresent(), fullName.timed().isPresent()); } @ElementBy(name = "username") private PageElement username; public AddUserPage addUser(final String username, final String password, final String fullName, final @ElementBy(name = "password") String email, final boolean receiveEmail) private PageElement password; { this.username.type(username); @ElementBy(name = "confirm") this.password.type(password); private PageElement passwordConfirmation; this.passwordConfirmation.type(password); this.fullName.type(fullName); @ElementBy(name = "fullname") this.email.type(email); private PageElement fullName; if(receiveEmail) { this.sendEmail.select(); @ElementBy(name = "email") } private PageElement email; return this; } @ElementBy(name = "sendemail") private PageElement sendEmail; public ViewUserPage createUser() { @ElementBy(id = "user-create-submit") return createUser(ViewUserPage.class); private PageElement submit; } @ElementBy (id = "user-create-cancel") private PageElement cancelButton; public <T extends Page> T createUser(Class<T> nextPage, Object...args) @Override { public String getUrl() submit.click(); { return pageBinder.bind(nextPage, args); return URI; } } ...
  • 92. Using Page Objects @Test public void testServerError() { jira.gotoLoginPage().loginAsSysAdmin(AddUserPage.class) .addUser("username", "mypassword", "My Name", "sample@email.com", false) .createUser(); // assertions here }
  • 93. Using Page Objects @Test public void testImportSampleProject() { final PivotalImporterSetupPage setupPage = getSetupPage(); Assert.assertEquals("1. Connect", setupPage.getActiveTabText()); final PivotalProjectsMappingsPage projectMappingPage = setupPage.next(); Assert.assertEquals("2. Project Mapping", setupPage.getActiveTabText()); Assert.assertTrue("Expecting all project to be selected by default", projectMappingPage.areAllProjectsSelected()); projectMappingPage.setImportAllProjects(false); projectMappingPage.setProjectImported(sampleProject, true); projectMappingPage.createProject(sampleProject, sampleProject, "SAMPLE"); final ImporterFinishedPage importerLogsPage = projectMappingPage.beginImport().waitUntilFinished(); Assert.assertTrue(importerLogsPage.isSuccess()); Assert.assertEquals(0, importerLogsPage.getGlobalErrors().size()); Assert.assertEquals("1", importerLogsPage.getProjectsImported()); // more assertions here }
  • 94. More on Page Objects • Design for reusability • Design for sharing - libraries of Page Objects • Good support by WebDriver/Selenium 2 • Atlassian Selenium 2.0
  • 97. Problem: Opaque Test Fixtures Solution: REST-based Set-up
  • 99. REST-based Setup @Before public void setUpTest() { restore("some-big-xml-file-with-everything-needed-inside.xml"); }
  • 100. REST-based Setup @Before public void setUpTest() { restore("some-big-xml-file-with-everything-needed-inside.xml"); } VS
  • 101. REST-based Setup @Before public void setUpTest() { restore("some-big-xml-file-with-everything-needed-inside.xml"); } VS @Before public void setUpTest() { restClient.restoreEmptyInstance(); restClient.createProject(/* project params */); restClient.createUser(/* user params */); restClient.createUser(/* user params */); restClient.createSomethingElse(/* ... */); }
  • 105. Problem: Flakey Tests Solution: Quarantine Fix
  • 106. Problem: Flakey Tests Solution: Quarantine Fix Eradicate
  • 107. Quarantine • @Ignore • @Category • Quarantine on CI server • Recover or Die
  • 108. Quarantine • @Ignore • @Category • Quarantine on CI server • Recover or Die
  • 111. Problem: Fixing Flakey Tests Solution: Timed Conditions
  • 112. Problem: Fixing Flakey Tests Solution: Timed Conditions Test-friendly Markup
  • 113. Problem: Fixing Flakey Tests Solution: Timed Conditions Test-friendly Markup Mock Unreliable Deps
  • 115. Test-friendly Markup • Do not save on IDs • Do not save on CSS classes • XPath is fragile • XPath is expensive • XPath is not readable • i18N
  • 117. Speed Aiming at 10 seconds build
  • 118. Speed Aiming at 10 seconds build
  • 119. Splitting Codebase The easiest and most effective improvement
  • 120. Splitting Codebase • Tests closer to tested code • Less to test • Testing less frequently • Increased team responsibility • Restructuring CI hierarchy - more complicated picture
  • 122. Less to Test Commit
  • 123. Less to Test Commit
  • 124. Less to Test Commit
  • 125. Less to Test Commit
  • 127. Less to Test Most of commits happen here
  • 128. Speed vs Control Workspace Dilemma • Incubation • Maturity • Custom workspaces
  • 130. Execution Time: Test Level
  • 131. Execution Time: Test Level Unit Tests
  • 132. Execution Time: Test Level Unit Tests REST API Tests
  • 133. Execution Time: Test Level Unit Tests REST API Tests JWebUnit/HTMLUnit Tests
  • 134. Execution Time: Test Level Unit Tests REST API Tests JWebUnit/HTMLUnit Tests Selenium/WebDriver Tests
  • 135. Execution Time: Test Level Unit Tests REST API Tests JWebUnit/HTMLUnit Tests Selenium/WebDriver Tests
  • 136. Execution Time: Test Level Speed Unit Tests REST API Tests JWebUnit/HTMLUnit Tests Selenium/WebDriver Tests
  • 137. Execution Time: Test Level Speed Unit Tests REST API Tests JWebUnit/HTMLUnit Tests Selenium/WebDriver Tests
  • 138. Execution Time: Test Level Speed Confidence Unit Tests REST API Tests JWebUnit/HTMLUnit Tests Selenium/WebDriver Tests
  • 139. Execution time - Cont. • Batching • Several tests per single set-up (violation of test isolation) • REST-based assertions • Remove / merge overlapping tests
  • 140. Execution time - Cont. • IDs over CSS/JQuery Selectors over XPath • JUnit tests running in the container • In-process testing • In-memory DBs • Mocking web servers • Reducing framework initialization time • Test Optimization (Clover)
  • 141. Waiting time • More build agents • Shorter and smaller tests • No sleep() • Avoiding long fixture setup (hot container, fragmented setup)
  • 142. Preparation Time • SCM performance • Container set-up • Compilation time (GWT...) • Maven... • Artifacts passing
  • 143. So how about the goals? Is 10 seconds build realistic?
  • 145. Realistic Goals (for us*) *My current personal dreams
  • 146. Realistic Goals (for us*) Time Type for unit tests for 95% of the 2 min commits for base smoke functional tests 5 min for 95% of the commits for ALL tests for 95% of the 15 min commits on selected platform 30 min for ALL tests for ALL commits *My current personal dreams
  • 147. Realistic Goals (for us*) Time Type for unit tests for 95% of the 2 min commits for base smoke functional tests 5 min for 95% of the commits for ALL tests for 95% of the 15 min commits on selected platform 30 min for ALL tests for ALL commits *My current personal dreams
  • 148. Realistic Goals (for us*) Time Type for unit tests for 95% of the 2 min commits for base smoke functional tests 5 min for 95% of the commits for ALL tests for 95% of the 15 min commits on selected platform 30 min for ALL tests for ALL commits *My current personal dreams
  • 149. Realistic Goals (for us*) Time Type for unit tests for 95% of the 2 min commits for base smoke functional tests 5 min for 95% of the commits for ALL tests for 95% of the 15 min commits on selected platform 30 min for ALL tests for ALL commits *My current personal dreams
  • 150. Realistic Goals (for us*) Time Type for unit tests for 95% of the 2 min commits for base smoke functional tests 5 min for 95% of the commits for ALL tests for 95% of the 15 min commits on selected platform 30 min for ALL tests for ALL commits *My current personal dreams
  • 151. Realistic Goals (for us*) p.2
  • 152. Realistic Goals (for us*) p.2 *My current personal dreams
  • 153. Realistic Goals (for us*) p.2 Metric Type >98% green unit tests >95% green functional tests <20min average time to fix unit test <2h average time to fix functional test *My current personal dreams
  • 154. Realistic Goals (for us*) p.2 Metric Type >98% green unit tests >95% green functional tests <20min average time to fix unit test <2h average time to fix functional test *My current personal dreams
  • 155. Realistic Goals (for us*) p.2 Metric Type >98% green unit tests >95% green functional tests <20min average time to fix unit test <2h average time to fix functional test *My current personal dreams
  • 156. Realistic Goals (for us*) p.2 Metric Type >98% green unit tests >95% green functional tests <20min average time to fix unit test <2h average time to fix functional test *My current personal dreams
  • 157. Realistic Goals (for us*) p.2 Metric Type >98% green unit tests >95% green functional tests <20min average time to fix unit test <2h average time to fix functional test *My current personal dreams
  • 158. Our Possible Future • Further splitting the code-base, incubation and maturity • Finer-grained team responsibilities • Merciless quarantine and purging of flakey tests • More page objects, less old-school Selenium • Refactoring/removal of slow tests • More REST-driven test fixtures and assertions
  • 160. Automated testing has cumulative benefits
  • 161. Automated testing has cumulative benefits ...and cumulative cost
  • 162. Splitting codebase is key aspect of short test feedback loop
  • 163. Test Code is Not Trash
  • 164. Respect Test Code is Not Trash
  • 165. Respect Design Test Code is Not Trash
  • 166. Respect Design Test Code is Not Trash Maintain
  • 167. Respect Design Test Code is Not Trash Maintain Review
  • 168. Respect Design Test Code is Not Trash Refactor Maintain Review
  • 169. Respect Restructure Design Test Code is Not Trash Refactor Maintain Review
  • 170. Respect Restructure Design Share Test Code is Not Trash Refactor Maintain Review
  • 171. Respect Restructure Design Share Test Code is Not Trash Refactor Maintain Review Discuss
  • 172. Respect Restructure Design Share Prune Test Code is Not Trash Refactor Maintain Review Discuss
  • 178. Optimum Balance Isolation Speed Coverage Level Structure
  • 179. Optimum Balance Isolation Speed Coverage Level Structure Effort
  • 181. Dangerous to temper with Quality / Determinism
  • 182. Dangerous to temper with Quality / Determinism Maintainability
  • 183.
  • 184. There are no universal rules - silver bullets
  • 185. There are no universal rules - silver bullets We are expected to find optimum balance for our specific case
  • 186. There are no universal rules - silver bullets We are expected to find optimum balance for our specific case Definition of “optimum” constantly changes
  • 189. Did I mention that Page Objects pattern?
  • 190. Credits • Photos: • http://www.flickr.com/photos/toofarnorth/ - Dragon • http://www.flickr.com/photos/striatic - Frustration • http://www.flickr.com/photos/leeadlaf/ - Broken window • http://www.flickr.com/photos/johnloo/ - Lightbulb • Dariusz Kordoński - for Test Improvements Leadership in JIRA

Notas del editor

  1. \n
  2. \n
  3. 2m\n
  4. Ask question: how many people write automated tests?\nToday? 1 year ago, 3 years ago? 5 years ago? 10 years ago?\n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. Joke: 1.2M Java -&gt; 100K Scala -&gt; 10K Perl\n
  11. Joke: 1.2M Java -&gt; 100K Scala -&gt; 10K Perl\n
  12. 2 min\n
  13. 2 min\n
  14. 2 min\n
  15. 2 min\n
  16. 2 min\n
  17. 2 min\n
  18. 2 min\n
  19. 2 min\n
  20. 2 min\n
  21. 2 min\n
  22. 2 min\n
  23. 2 min\n
  24. 2 min\n
  25. 2 min\n
  26. 2 min\n
  27. 2 min\n
  28. 2 min\n
  29. 2 min\n
  30. 2 min\n
  31. 2 min\n
  32. 2 min\n
  33. 2 min\n
  34. 2 min\n
  35. 2 min\n
  36. 2 min\n
  37. 2 min\n
  38. 2 min\n
  39. 2 min\n
  40. 2 min\n
  41. 2 min\n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. Note: batching helped us to reduce the time from several hours to about 1h\n
  60. Note: batching helped us to reduce the time from several hours to about 1h\n
  61. Note: batching helped us to reduce the time from several hours to about 1h\n
  62. Note: batching helped us to reduce the time from several hours to about 1h\n
  63. Note: batching helped us to reduce the time from several hours to about 1h\n
  64. Note: batching helped us to reduce the time from several hours to about 1h\n
  65. Note: batching helped us to reduce the time from several hours to about 1h\n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. Mention that Selenium would be to scary to show it :)\n
  87. \n
  88. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  89. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  90. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  91. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  92. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  93. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  94. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  95. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  96. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  97. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  98. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  99. Joke: and some extra failed builds in the morning next day (from nightly builds)\n
  100. \n
  101. Question: how many people has this problem?\n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. Joke\n
  111. Joke\n
  112. Joke\n
  113. Joke\n
  114. Joke\n
  115. Joke\n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. Encourages you to write good REST API, REST client\nTell about Backdoor\n
  128. Encourages you to write good REST API, REST client\nTell about Backdoor\n
  129. Encourages you to write good REST API, REST client\nTell about Backdoor\n
  130. \n
  131. \n
  132. \n
  133. \n
  134. Quarantine strategies - X days, Max. Y tests. Quarantine after healthy tests\n\n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. VIES example\n
  142. \n
  143. \n
  144. Important: less to test and less frequently -&gt; CI env faster throuput\n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. tutaj doda&amp;#x107; wag&amp;#x119; - obrazek\n
  160. \n
  161. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  162. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  163. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  164. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  165. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  166. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  167. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  168. e.g. QUnit vs Selenium\nTDD makes natural favouring Unit tests.\n
  169. \n
  170. \n
  171. Story with Sleep for 60 seconds just to see if something did not happen\n
  172. Story about GNU C++ compiler producing gigabytes of object files difficult to distribute to CI env (and much time spent on IO)\n
  173. \n
  174. \n
  175. \n
  176. \n
  177. \n
  178. \n
  179. \n
  180. \n
  181. \n
  182. \n
  183. \n
  184. \n
  185. \n
  186. \n
  187. \n
  188. \n
  189. \n
  190. \n
  191. \n
  192. \n
  193. \n
  194. \n
  195. \n
  196. \n
  197. \n
  198. \n
  199. Access - all code in one workspace, compiled together, easy to refactor, costly to compile\n
  200. Access - all code in one workspace, compiled together, easy to refactor, costly to compile\n
  201. Access - all code in one workspace, compiled together, easy to refactor, costly to compile\n
  202. Access - all code in one workspace, compiled together, easy to refactor, costly to compile\n
  203. Access - all code in one workspace, compiled together, easy to refactor, costly to compile\n
  204. Access - all code in one workspace, compiled together, easy to refactor, costly to compile\n
  205. \n
  206. \n
  207. \n
  208. \n
  209. \n
  210. \n
  211. \n
  212. \n
  213. \n
  214. \n