SlideShare a Scribd company logo
1 of 57
Download to read offline
Plugin Testing



Thursday, October 22, 2009
Plugin Testing



Thursday, October 22, 2009
Plugin Testing
                                            her stuff
                                  gins & ot
                              Plu




Thursday, October 22, 2009
Why Test?

                     • Correctness
                     • Performance
                     • Knowing Your Code
                     • Documentation

Thursday, October 22, 2009
Cost of Change
                                    Development   Feature Testing          Regression Testing
                             Time




                                       v1.0       v2.0              v3.0             v4.0



Thursday, October 22, 2009
Feedback Loops

                                 Development



                                JIRA    Testing




Thursday, October 22, 2009
Feedback Loops
                                     Development




                              JIRA             Testing



Thursday, October 22, 2009
Development
                              Feedback Loops




                             JIRA                 Testing



Thursday, October 22, 2009
Cost of Change
                                    Development     Writing Tests          Executing Tests
                             Time




                                      v1.0        v2.0              v3.0           v4.0



Thursday, October 22, 2009
Eat Your Vegetables
Thursday, October 22, 2009
Variety



http://www.flickr.com/photos/sharontroy/3606495880/
Thursday, October 22, 2009
Ingredients Matter



http://www.flickr.com/photos/sharontroy/3938831210/
Thursday, October 22, 2009
Ingredients + Technique
                           = Art


http://www.flickr.com/photos/sharontroy/3606264108/
Thursday, October 22, 2009
No Regrets
http://www.redflagdeals.com/forums/costco-west-deals-dove-nailer-lays-tuna-gain-pantene-734644/
Thursday, October 22, 2009
Test-Driven Development
http://www.agiledata.org/essays/tdd.html
Thursday, October 22, 2009
Types of Tests
                             Unit              Integration




Thursday, October 22, 2009
Unit Tests




Thursday, October 22, 2009
What is Unit Testing?

                     • Tests individual components
                     • Avoids state & external systems
                     • Runs in development environment


Thursday, October 22, 2009
Why Unit Test?

                     • Correctness
                     • Improve Design
                     • Design by Contract


Thursday, October 22, 2009
How to Unit Test

                     • Set up
                     • Execute
                     • Verify
                     • Clean up

Thursday, October 22, 2009
How to Unit Test an Atlassian Plugin

Thursday, October 22, 2009
Unit Testing Tools




Thursday, October 22, 2009
JUnit

  public class UriTest {
    @Test
    public void absoluteUriParamIsReturned() {
      URI absoluteUri =
        URI.create("http://www.example.com");
      URI resolvedUri = resolveUriAgainstBase(
        "http://localhost:8080", absoluteUri)
      assertEquals(absoluteUri, resolvedUri);
    }
  }

Thursday, October 22, 2009
JUnit

  @Test(expected=
    GadgetSpecUriNotAllowedException.class)
  public void blankLocationThrowsException() {
    urlBuilder.parseGadgetSpecUrl(
      BASE_GADGET_SPEC_PATH
      + PLUGIN_KEY
      + "/"
      + "");
  }


Thursday, October 22, 2009
Mockito
  Dashboard dashboard = mock(Dashboard.class);
  DashboardStore store =
    mock(DashboardStore.class);
  when(dashboard.getId())
    .thenReturn(DASHBOARD_ID);
  when(store.update(dashboard))
    .thenReturn(DashboardStore.SUCCESS);

  repository.save(dashboard);

  verify(store)
    .update(DASHBOARD_ID, dashboard);
  verifyNoMoreInteractions(store);
Thursday, October 22, 2009
Hamcrest

  Iterable<ColumnIndex> range =
    ColumnIndex.range(ColumnIndex.ZERO,
                      ColumnIndex.ONE);
  Iterator<ColumnIndex> columnIt =
    range.iterator();
  assertThat(columnIt.next(),
             is(equalTo(ColumnIndex.ZERO)));
  assertThat(columnIt.next(),
             is(equalTo(ColumnIndex.ONE)));
  assertFalse(columnIt.hasNext());

Thursday, October 22, 2009
Hamcrest
  assertThat(iterator.next().getState(),
    is(sameInstance(gadget.getState())));

  assertThat(store.entries(),
    hasItem(GADGET_SPEC_URI));

  assertThat(staticContentTab.asText(),
    containsString("Static Content"));

  assertThat(changesList.get(1),
    is(deeplyEqualTo(
      new RemoveGadgetChange(gadgetId))));
Thursday, October 22, 2009
Clover




Thursday, October 22, 2009
Unit Testing Traps

                     • False Positives
                     • False Negatives
                     • Flapping


Thursday, October 22, 2009
Non-Test
                     • Doesn’t test what it appears to test
                     • No assertion
                     • Passes when code is broken
                     • Solutions:
                      • Test-Driven Development
                      • IDE inspections, PMD, FindBugs
Thursday, October 22, 2009
Missing Test
                     • Doesn’t test full range of inputs
                     • Boundary conditions, special cases
                     • Passes when code is broken
                     • Solutions:
                      • Clover
                      • JUnit Theories
Thursday, October 22, 2009
Coverage as a Crutch
                     • Over-reliance on Clover
                     • Misses code paths, boundary cases
                     • Passes when code is broken
                     • Solutions:
                      • Your brain
                      • Peer review
Thursday, October 22, 2009
Side-Effects
                     • Produces or relies on side-effects
                     • Maintains state between runs
                     • Fails inconsistently
                     • Solutions:
                      • Mock objects
                      • @Before/@After
Thursday, October 22, 2009
Over Constraint
                     • Tests implementation details
                     • Overuse of mocks
                     • Fails when code is not broken
                     • Solutions:
                      • Stubs/fakes
                      • Refactoring
Thursday, October 22, 2009
Unit Testing Traps

                     • False Positives   ←More tests
                     • False Negatives   ←Reduce coupling
                     • Flapping          ←Isolate


Thursday, October 22, 2009
Integration Tests




Thursday, October 22, 2009
What is Integration
                                 Testing?

                     • Tests full system
                     • Tests each supported configuration
                     • Runs in simulated production environment
                     • Many types: functional, load, stress, etc.

Thursday, October 22, 2009
Why Integration Test?

                     • Correctness
                     • Robustness
                     • Performance


Thursday, October 22, 2009
How to Integration Test

                     • Set up
                     • Execute
                     • Verify
                     • Clean up

Thursday, October 22, 2009
How to Integration Test
                      a Web Application
                     • Deploy your plugin or application
                     • Load data
                     • Simulate or script a web browser
                     • Parse the HTML to verify results
                     • Clean up

Thursday, October 22, 2009
How to Integration Test an
                                 Atlassian Plugin
Thursday, October 22, 2009
Integration Testing Tools




Thursday, October 22, 2009
JWebUnit

  beginAt("/home");
  clickLink("login");
  assertTitleEquals("Login");
  setTextField("username", "test");
  setTextField("password", "test123");
  submit();
  assertTitleEquals("Welcome, test!");



Thursday, October 22, 2009
HtmlUnit
  WebClient webClient = new WebClient();
  HtmlPage page =
    webClient.getPage("http://example.net");
  HtmlDivision div =
    page.getHtmlElementById("some_div_id");
  HtmlAnchor anchor =
    page.getAnchorByName("anchor_name");
  List<?> divs = page.getByXPath("//div");
  HtmlDivision div =
    page.getByXPath("//div[@name='John']")
        .get(0);

Thursday, October 22, 2009
JIRA/Confluence Test
                             Frameworks
  PageHelper helper = getPageHelper();

  helper.setSpaceKey(spaceKey);
  helper.setParentId(parentId);
  helper.setTitle(title);
  helper.setContent(content);
  helper.setCreationDate(new Date());
  helper.setLabels(labels);
  assertTrue(helper.create());


Thursday, October 22, 2009
JIRA/Confluence Test
                             Frameworks
  addUser("john.doe");
  addUserToGroup("john.doe", JIRA_DEV);
  activateTimeTracking();
  String issueKey =
    addIssue(TEST_PROJECT_NAME,
             TEST_PROJECT_KEY,
             "Bug", "First Bug", "Major", null,
             null, null, ADMIN_USERNAME, null,
             null, "1w", null, null);
  logWorkOnIssue(issueKey,"1d");
  gotoProjectBrowse(TEST_PROJECT_KEY);

Thursday, October 22, 2009
Atlassian Plugin SDK
                     $ atlas-unit-test
                     $ atlas-clover
                     $ atlas-integration-test
                             --version
                             --container
                             --product


Thursday, October 22, 2009
Selenium




Thursday, October 22, 2009
Integration Testing Traps

                     • False Positives
                     • False Negatives
                     • Flapping


Thursday, October 22, 2009
Incomplete
                     •       Doesn’t test the full system
                     •       JavaScript disabled, ignores browsers or app servers
                     •       Passes when code is broken
                     •       Solutions:
                             •   HtmlUnit
                             •   Selenium
                             •   Cargo
                             •   atlas-integration-test --container


Thursday, October 22, 2009
Entangled
                     •       Each test covers too much functionality
                     •       Requires lots of setup to test each feature
                     •       Bugs cause failures in tests for other features
                     •       Solutions:
                             •   Data loaders
                             •   Remote APIs
                             •   More specific test methods
                             •   Domain-driven test frameworks


Thursday, October 22, 2009
Fragile
                     • Tests break due to UI changes
                     • Screen-scraping, complicated XPath
                     • Fails when not broken
                     • Solutions:
                      • Semantic markup (class and id attributes)
                      • Domain-driven test frameworks
Thursday, October 22, 2009
Timing or State
                                   Dependencies
                     •       Inconsistent results from one test run to another
                     •       Concurrency bugs, no clean up, environment issues
                     •       Solutions:
                             •   @Before/@After
                             •   @BeforeClass/@AfterClass
                             •   Continuous Integration
                             •   Blood, sweat, and tears


Thursday, October 22, 2009
Slow
                     • Tests take too long to run
                     • Increases length of feedback loop
                     • Solutions:
                      • Clover test optimization
                      • Maven profiles
                      • Bamboo build trees
Thursday, October 22, 2009
Build Trees
                                         Clover-Optimized                 Faster


                                            Unit Tests

                             All Unit Tests              All Unit Tests
                                 Java 5                      Java 6       Slower



                            Integration                   Integration
                         Java 5/Tomcat 6               Java 6/Tomcat 6

           Integration               Integration   Integration    Integration
              Java 5                    Java 5        Java 6         Java 6
              JBoss                  Tomcat 5.5       JBoss       Tomcat 5.5
Thursday, October 22, 2009
Integration Testing Traps

                • False Positives   ←Test more
                • False Negatives   ←Framework
                • Flapping          ←Get to work


Thursday, October 22, 2009
Resources
                             http://j.mp/plugin-testing




Thursday, October 22, 2009

More Related Content

Similar to Plugin Testing

PHPUnit & Continuous Integration: An Introduction
PHPUnit & Continuous Integration: An IntroductionPHPUnit & Continuous Integration: An Introduction
PHPUnit & Continuous Integration: An Introductionalexmace
 
Plone Testing Tools And Techniques
Plone Testing Tools And TechniquesPlone Testing Tools And Techniques
Plone Testing Tools And TechniquesJordan Baker
 
Practical (J)Unit Testing (2009)
Practical (J)Unit Testing (2009)Practical (J)Unit Testing (2009)
Practical (J)Unit Testing (2009)Peter Kofler
 
Scaling with Postgres
Scaling with PostgresScaling with Postgres
Scaling with Postgreselliando dias
 
Mozilla: Continuous Deploment on SUMO
Mozilla: Continuous Deploment on SUMOMozilla: Continuous Deploment on SUMO
Mozilla: Continuous Deploment on SUMOMatt Brandt
 
Drizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and EcosystemDrizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and EcosystemRonald Bradford
 
Pitfalls of Continuous Deployment
Pitfalls of Continuous DeploymentPitfalls of Continuous Deployment
Pitfalls of Continuous Deploymentzeeg
 
Unit testing for Cocoa developers
Unit testing for Cocoa developersUnit testing for Cocoa developers
Unit testing for Cocoa developersGraham Lee
 
Introtoduction to cocos2d
Introtoduction to  cocos2dIntrotoduction to  cocos2d
Introtoduction to cocos2dJohn Wilker
 
iPhone Development Overview
iPhone Development OverviewiPhone Development Overview
iPhone Development OverviewTom Adams
 
PRDC11-tdd-common-mistakes
PRDC11-tdd-common-mistakesPRDC11-tdd-common-mistakes
PRDC11-tdd-common-mistakesAmir Barylko
 
Using The Page Object Pattern
Using The Page Object PatternUsing The Page Object Pattern
Using The Page Object PatternDante Briones
 
IT Depends: Custom vs Packaged Software
IT Depends: Custom vs Packaged SoftwareIT Depends: Custom vs Packaged Software
IT Depends: Custom vs Packaged Software★ Selcuk Atli
 
Ruby On Rails Presentation Barcamp Antwerp.Key
Ruby On Rails Presentation Barcamp Antwerp.KeyRuby On Rails Presentation Barcamp Antwerp.Key
Ruby On Rails Presentation Barcamp Antwerp.KeyBert Goethals
 
mvcconf-bdd-quality-driven
mvcconf-bdd-quality-drivenmvcconf-bdd-quality-driven
mvcconf-bdd-quality-drivenAmir Barylko
 
Introduction to unit testing
Introduction to unit testingIntroduction to unit testing
Introduction to unit testingGil Zilberfeld
 

Similar to Plugin Testing (20)

PHPUnit & Continuous Integration: An Introduction
PHPUnit & Continuous Integration: An IntroductionPHPUnit & Continuous Integration: An Introduction
PHPUnit & Continuous Integration: An Introduction
 
Plone Testing Tools And Techniques
Plone Testing Tools And TechniquesPlone Testing Tools And Techniques
Plone Testing Tools And Techniques
 
Practical (J)Unit Testing (2009)
Practical (J)Unit Testing (2009)Practical (J)Unit Testing (2009)
Practical (J)Unit Testing (2009)
 
All The Little Pieces
All The Little PiecesAll The Little Pieces
All The Little Pieces
 
Scaling with Postgres
Scaling with PostgresScaling with Postgres
Scaling with Postgres
 
Mozilla: Continuous Deploment on SUMO
Mozilla: Continuous Deploment on SUMOMozilla: Continuous Deploment on SUMO
Mozilla: Continuous Deploment on SUMO
 
Drizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and EcosystemDrizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and Ecosystem
 
Exceptable
ExceptableExceptable
Exceptable
 
Unit Testing Basics
Unit Testing BasicsUnit Testing Basics
Unit Testing Basics
 
Pitfalls of Continuous Deployment
Pitfalls of Continuous DeploymentPitfalls of Continuous Deployment
Pitfalls of Continuous Deployment
 
Unit testing for Cocoa developers
Unit testing for Cocoa developersUnit testing for Cocoa developers
Unit testing for Cocoa developers
 
Introtoduction to cocos2d
Introtoduction to  cocos2dIntrotoduction to  cocos2d
Introtoduction to cocos2d
 
iPhone Development Overview
iPhone Development OverviewiPhone Development Overview
iPhone Development Overview
 
PRDC11-tdd-common-mistakes
PRDC11-tdd-common-mistakesPRDC11-tdd-common-mistakes
PRDC11-tdd-common-mistakes
 
Using The Page Object Pattern
Using The Page Object PatternUsing The Page Object Pattern
Using The Page Object Pattern
 
IT Depends: Custom vs Packaged Software
IT Depends: Custom vs Packaged SoftwareIT Depends: Custom vs Packaged Software
IT Depends: Custom vs Packaged Software
 
Ruby On Rails Presentation Barcamp Antwerp.Key
Ruby On Rails Presentation Barcamp Antwerp.KeyRuby On Rails Presentation Barcamp Antwerp.Key
Ruby On Rails Presentation Barcamp Antwerp.Key
 
mvcconf-bdd-quality-driven
mvcconf-bdd-quality-drivenmvcconf-bdd-quality-driven
mvcconf-bdd-quality-driven
 
Introduction to unit testing
Introduction to unit testingIntroduction to unit testing
Introduction to unit testing
 
TestNG vs. JUnit4
TestNG vs. JUnit4TestNG vs. JUnit4
TestNG vs. JUnit4
 

Recently uploaded

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
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
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
🐬 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
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
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
 
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
 
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
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
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
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
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
 

Recently uploaded (20)

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
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
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
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
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
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
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
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...
 

Plugin Testing

  • 3. Plugin Testing her stuff gins & ot Plu Thursday, October 22, 2009
  • 4. Why Test? • Correctness • Performance • Knowing Your Code • Documentation Thursday, October 22, 2009
  • 5. Cost of Change Development Feature Testing Regression Testing Time v1.0 v2.0 v3.0 v4.0 Thursday, October 22, 2009
  • 6. Feedback Loops Development JIRA Testing Thursday, October 22, 2009
  • 7. Feedback Loops Development JIRA Testing Thursday, October 22, 2009
  • 8. Development Feedback Loops JIRA Testing Thursday, October 22, 2009
  • 9. Cost of Change Development Writing Tests Executing Tests Time v1.0 v2.0 v3.0 v4.0 Thursday, October 22, 2009
  • 10. Eat Your Vegetables Thursday, October 22, 2009
  • 13. Ingredients + Technique = Art http://www.flickr.com/photos/sharontroy/3606264108/ Thursday, October 22, 2009
  • 16. Types of Tests Unit Integration Thursday, October 22, 2009
  • 18. What is Unit Testing? • Tests individual components • Avoids state & external systems • Runs in development environment Thursday, October 22, 2009
  • 19. Why Unit Test? • Correctness • Improve Design • Design by Contract Thursday, October 22, 2009
  • 20. How to Unit Test • Set up • Execute • Verify • Clean up Thursday, October 22, 2009
  • 21. How to Unit Test an Atlassian Plugin Thursday, October 22, 2009
  • 22. Unit Testing Tools Thursday, October 22, 2009
  • 23. JUnit public class UriTest { @Test public void absoluteUriParamIsReturned() { URI absoluteUri = URI.create("http://www.example.com"); URI resolvedUri = resolveUriAgainstBase( "http://localhost:8080", absoluteUri) assertEquals(absoluteUri, resolvedUri); } } Thursday, October 22, 2009
  • 24. JUnit @Test(expected= GadgetSpecUriNotAllowedException.class) public void blankLocationThrowsException() { urlBuilder.parseGadgetSpecUrl( BASE_GADGET_SPEC_PATH + PLUGIN_KEY + "/" + ""); } Thursday, October 22, 2009
  • 25. Mockito Dashboard dashboard = mock(Dashboard.class); DashboardStore store = mock(DashboardStore.class); when(dashboard.getId()) .thenReturn(DASHBOARD_ID); when(store.update(dashboard)) .thenReturn(DashboardStore.SUCCESS); repository.save(dashboard); verify(store) .update(DASHBOARD_ID, dashboard); verifyNoMoreInteractions(store); Thursday, October 22, 2009
  • 26. Hamcrest Iterable<ColumnIndex> range = ColumnIndex.range(ColumnIndex.ZERO, ColumnIndex.ONE); Iterator<ColumnIndex> columnIt = range.iterator(); assertThat(columnIt.next(), is(equalTo(ColumnIndex.ZERO))); assertThat(columnIt.next(), is(equalTo(ColumnIndex.ONE))); assertFalse(columnIt.hasNext()); Thursday, October 22, 2009
  • 27. Hamcrest assertThat(iterator.next().getState(), is(sameInstance(gadget.getState()))); assertThat(store.entries(), hasItem(GADGET_SPEC_URI)); assertThat(staticContentTab.asText(), containsString("Static Content")); assertThat(changesList.get(1), is(deeplyEqualTo( new RemoveGadgetChange(gadgetId)))); Thursday, October 22, 2009
  • 29. Unit Testing Traps • False Positives • False Negatives • Flapping Thursday, October 22, 2009
  • 30. Non-Test • Doesn’t test what it appears to test • No assertion • Passes when code is broken • Solutions: • Test-Driven Development • IDE inspections, PMD, FindBugs Thursday, October 22, 2009
  • 31. Missing Test • Doesn’t test full range of inputs • Boundary conditions, special cases • Passes when code is broken • Solutions: • Clover • JUnit Theories Thursday, October 22, 2009
  • 32. Coverage as a Crutch • Over-reliance on Clover • Misses code paths, boundary cases • Passes when code is broken • Solutions: • Your brain • Peer review Thursday, October 22, 2009
  • 33. Side-Effects • Produces or relies on side-effects • Maintains state between runs • Fails inconsistently • Solutions: • Mock objects • @Before/@After Thursday, October 22, 2009
  • 34. Over Constraint • Tests implementation details • Overuse of mocks • Fails when code is not broken • Solutions: • Stubs/fakes • Refactoring Thursday, October 22, 2009
  • 35. Unit Testing Traps • False Positives ←More tests • False Negatives ←Reduce coupling • Flapping ←Isolate Thursday, October 22, 2009
  • 37. What is Integration Testing? • Tests full system • Tests each supported configuration • Runs in simulated production environment • Many types: functional, load, stress, etc. Thursday, October 22, 2009
  • 38. Why Integration Test? • Correctness • Robustness • Performance Thursday, October 22, 2009
  • 39. How to Integration Test • Set up • Execute • Verify • Clean up Thursday, October 22, 2009
  • 40. How to Integration Test a Web Application • Deploy your plugin or application • Load data • Simulate or script a web browser • Parse the HTML to verify results • Clean up Thursday, October 22, 2009
  • 41. How to Integration Test an Atlassian Plugin Thursday, October 22, 2009
  • 43. JWebUnit beginAt("/home"); clickLink("login"); assertTitleEquals("Login"); setTextField("username", "test"); setTextField("password", "test123"); submit(); assertTitleEquals("Welcome, test!"); Thursday, October 22, 2009
  • 44. HtmlUnit WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage("http://example.net"); HtmlDivision div = page.getHtmlElementById("some_div_id"); HtmlAnchor anchor = page.getAnchorByName("anchor_name"); List<?> divs = page.getByXPath("//div"); HtmlDivision div = page.getByXPath("//div[@name='John']") .get(0); Thursday, October 22, 2009
  • 45. JIRA/Confluence Test Frameworks PageHelper helper = getPageHelper(); helper.setSpaceKey(spaceKey); helper.setParentId(parentId); helper.setTitle(title); helper.setContent(content); helper.setCreationDate(new Date()); helper.setLabels(labels); assertTrue(helper.create()); Thursday, October 22, 2009
  • 46. JIRA/Confluence Test Frameworks addUser("john.doe"); addUserToGroup("john.doe", JIRA_DEV); activateTimeTracking(); String issueKey = addIssue(TEST_PROJECT_NAME, TEST_PROJECT_KEY, "Bug", "First Bug", "Major", null, null, null, ADMIN_USERNAME, null, null, "1w", null, null); logWorkOnIssue(issueKey,"1d"); gotoProjectBrowse(TEST_PROJECT_KEY); Thursday, October 22, 2009
  • 47. Atlassian Plugin SDK $ atlas-unit-test $ atlas-clover $ atlas-integration-test --version --container --product Thursday, October 22, 2009
  • 49. Integration Testing Traps • False Positives • False Negatives • Flapping Thursday, October 22, 2009
  • 50. Incomplete • Doesn’t test the full system • JavaScript disabled, ignores browsers or app servers • Passes when code is broken • Solutions: • HtmlUnit • Selenium • Cargo • atlas-integration-test --container Thursday, October 22, 2009
  • 51. Entangled • Each test covers too much functionality • Requires lots of setup to test each feature • Bugs cause failures in tests for other features • Solutions: • Data loaders • Remote APIs • More specific test methods • Domain-driven test frameworks Thursday, October 22, 2009
  • 52. Fragile • Tests break due to UI changes • Screen-scraping, complicated XPath • Fails when not broken • Solutions: • Semantic markup (class and id attributes) • Domain-driven test frameworks Thursday, October 22, 2009
  • 53. Timing or State Dependencies • Inconsistent results from one test run to another • Concurrency bugs, no clean up, environment issues • Solutions: • @Before/@After • @BeforeClass/@AfterClass • Continuous Integration • Blood, sweat, and tears Thursday, October 22, 2009
  • 54. Slow • Tests take too long to run • Increases length of feedback loop • Solutions: • Clover test optimization • Maven profiles • Bamboo build trees Thursday, October 22, 2009
  • 55. Build Trees Clover-Optimized Faster Unit Tests All Unit Tests All Unit Tests Java 5 Java 6 Slower Integration Integration Java 5/Tomcat 6 Java 6/Tomcat 6 Integration Integration Integration Integration Java 5 Java 5 Java 6 Java 6 JBoss Tomcat 5.5 JBoss Tomcat 5.5 Thursday, October 22, 2009
  • 56. Integration Testing Traps • False Positives ←Test more • False Negatives ←Framework • Flapping ←Get to work Thursday, October 22, 2009
  • 57. Resources http://j.mp/plugin-testing Thursday, October 22, 2009