SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
Fitnesse and Continuous Integration

      Jennifer Wong | Staff SQE Engineer | twitter: @jenlwong




                       Proprietary and Confidential
Overview

►Intro
► What is FitNesse (Not an exercise program!)
► The Details
► Integration: putting the pieces together
► Lessons Learned




                       Proprietary and Confidential
Intro
• Who:
  – Jennifer Wong
  – Scrum Master for Tools Team, Staff SQE Engineer
• Where:
  – Ingenuity Systems: A leading provider of information
    and analytics solutions for life science researchers
• What:
  – FitNesse as a key element of Continuous Integration
    workflow
• Why:
  – Follow up to last year’s presentation
    (http://www.slideshare.net/jenlwong/ingenuity-svcc-ci-presentation-20111007 )


                                     Proprietary and Confidential
FitNesse
(Not an exercise program!)




        Proprietary and Confidential
FitNesse
• FitNesse is a wiki-based web server test tool
   – Helps abstract test definition from technical implementation
   – Provides visual reporting and result history tracking




                         Proprietary and Confidential
Test Types: FitNesse
• We use it for:
   –   Integration tests
   –   Acceptance and Functional tests
   –   UI Tests (com.jbergin.HtmlFixture, webtest)
   –   DB Tests (dbfit)
   –   Backward Compatibility tests
• What is it good for?
   – Framework and visibility
   – accessibility to non-technical people
• What is it bad for?
   – Unit tests
   – Complicated ui tests
   – Extensive performance testing
                          Proprietary and Confidential
FitNesse: The Details




     Proprietary and Confidential
Downloading and Installing FitNesse
• Get the jar file and run it
  – http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad
  – java –jar fitnesse.jar
• Or use the demo package:
     • Get the file: on the svcc web site, attached to the session, or
       on Github
     • unzip the file and cd to lib dir
     • start the fitnesse server: java -jar fitnesse.jar -p 8080
     • open web browser and access http://localhost:8080
     • click the link at the top for "CodeCampDemoPage“
     • click the test button




                          Proprietary and Confidential
Setting your classpath
• Classpath statements
   – Fitnesse needs to know where to find your fixture code
• This kind of error :




• Means you need to add this kind of statement: !path
  – You should usually have this kind of stuff:
       !contents
       !path fitnesse.jar
       !path C:/eclipse/fit_demo/eclipse-bin
       !define TEST_SYSTEM {slim}



                              Proprietary and Confidential
Some Basic Test Tables
• Script table
   – Good for procedural/workflow tests
   – Flexible
   – Use syntax: check, reject, ensure, show
• Decision table
   – Good for data-driven tests
   – Specific workflow
      • Input methods  execute()  output methods
   – Special method name interpretation
   – Automatically calls reset() and execute() methods
• Query table
   – Good for validating lists or tables of data



                           Proprietary and Confidential
Variable Usage
• Defining a static variable
   – !define ROOT_URL {http://myserver.com}
   – !define TESTUSER {testuser1@something.com}
• Storing a value in a variable on the fly
   – Store variable: $X=
   – Use variable: $X
• Using a variable
   – To use this variable, enclose the variable name in ${ }
   – Example:
       • this: ${URL_ROOT}/context/index.html
       • Will resolve to this: http://myserver.com/context/index.html



                            Proprietary and Confidential
Naming and Parameter passing
              (Methods)
• (Un) Graceful Naming
  – Automatically concatenates space-separated
    words
    • isHalloween  isHalloween()
    • Is Halloween  isHalloween()
    • is halloween  isHalloween()
    • Is halloWeen  error
  – When using methods with multiple
    parameters, tries to intersperse method
    name and paremeters

                   Proprietary and Confidential
Parameter passing (cont)
• Multi-parameter methods: isHalloween(int,            String)
  – |ensure|is|31|Halloween|October|
  – |ensure|is Halloween|31||October|
• Single parameter: setCostume(String)
  – |set costume|Clark Kent|
  – |set|Clark Kent|costume|
• Constructors with parameters
  – This constructor:
     • public Halloween(String month, int day, String costume)

  – Translates to this usage in a fitnesse table:
  |Halloween|October|31|Cat|
  |isHalloween?|get surprise?|


                        Proprietary and Confidential
UI Test Fixtures
• com.jbergin.HtmlFixture
   – an adapter between FitNesse and HtmlUnit for use in
     testing web applications
   – Need to use !define TEST_SYSTEM {fit}
   – http://htmlfixture.sourceforge.net/
   – http://uebuild5:8084/FrontPage.UmaFitNesse.IngsecuritySuite.ConcurrentUserS
     essionTest.AcceptanceTests

• webtest selenium
   – an extension to FIT/FitNesse that uses Selenium Remote
     Control. WebTest runs inside FitNesse.
   – http://www.fitnesse.info/webtest
   – http://uebuild5:8084/FrontPage.ReportsFitNesse.IsoformView.IsoformVi
     ewWebTestSuite.IsoformViewWebTests


                               Proprietary and Confidential
Real world usage is more complex
• What it looks like in the real (ie, complicated)world
   – Session handling
      • http://uebuild5.ingenuity.com:8084/FrontPage.UmaFitNesse.IngsecuritySuite.Concurren
        tUserSessionTest.AcceptanceTests

   – Static objects to provide data access
      •   http://uebuild5.ingenuity.com:8084/FrontPage.ContentserviceFitNesse.TestSuiteForCurrentContent.Ec
          sMappingDataProviderTestSuite.P1Tests

   – Complex checking of validity
      • Unmarshaling JSON to check special conditions in a non
        order dependent way
             – http://uebuild5.ingenuity.com:8084/FrontPage.FaFitNesse.Test
               SuiteForBaselineContentSpecific.FaProviderTestSuite.Execute
               FaQuery.LfaQueryTestSuite.AcceptanceTests




                                       Proprietary and Confidential
Fixture code can get complicated
                   very quickly
public static boolean matchGFAResult(JSONObject jsonResult, GFAResult actualResult, boolean allowSubset,
boolean allowPvalueVerification,boolean geneCountVerification ,boolean allowZscoreVerification, boolean allowGeneEffectVerification) throws
       JSONException {
JSONArray jsonItems = jsonResult.getJSONArray("items");
logger.info("expected item size = " + jsonItems.length());
logger.info("actual item size = " + actualResult.getFAResultItems().size());
if (jsonItems.length() > actualResult.getFAResultItems().size()) {
return false;
}

Map<String, GFAResultItem> itemMap = buildGFAResult(jsonItems);
if (allowSubset) {
for (Map.Entry<String, GFAResultItem> entry : itemMap.entrySet()) {
logger.info("Look for " + entry.getKey() + " in actual result");
GFAResultItem item = entry.getValue();
if (!containsItem(item, actualResult.getFAResultItems(), allowSubset, allowPvalueVerification,
geneCountVerification,allowZscoreVerification, allowGeneEffectVerification)) {
logger.info(item.getId().getAsString() + " is expected but couldn't be found in actual result");
return false;
}
}
} else {
return equalGFAItems(itemMap, actualResult.getFAResultItems(), allowSubset,allowPvalueVerification,
geneCountVerification,allowZscoreVerification, allowGeneEffectVerification);
}

return true;
}

private static boolean equalGFAItems(Map<String, GFAResultItem> itemMap,
Collection<GFAResultItem> actualResultItems, boolean allowSubset,
boolean allowPvalueVerification,boolean geneCountVerification ,boolean allowZscoreVerification, boolean allowGeneEffectVerification) {
if (itemMap.size() != actualResultItems.size()) {
return false;
}



                                                        Proprietary and Confidential
Tips and tricks
• Search in your FitNesse wiki
• Use Includes
   – Use includes as templates
   – http://uebuild5.ingenuity.com:8084/FrontPage.IngtestFitNesse.StableSui
     te.FaStableCompat
   – http://uebuild5.ingenuity.com:8084/FrontPage.IngtestFitNesse.StableSui
     te.ContentserviceStableCompat
• Comments
• Escaping special characters
   – Start tables with ! to avoid unwanted interpretation of
     graceful names, etc
   – Surround special chars with !- -!
       • Example: !-gobbledeygook ~!@#$%^&*(){}| as plain string-!


                             Proprietary and Confidential
Fancy fixtures and other nifty stuff
• JSON
   –   http://uebuild5:8084/FrontPage.MgFitNesse.TestSuiteForBaselineContentSpecific.GraphProviderTestSuite.GetNeighb
       orhoodGraph.P1Tests

• Javascript validation
   –   http://localhost:8080/FrontPage.AutocompFitNesse.FunctionalTests.FitTests.GeneralTests.P1Tests
         EVAL {
         void execute(Parse row, JSONFixture fixture) {
                     Parse textCell = row.parts.more;// row.parts.more;
                                 String evalText = textCell.text();
                     String text = fixture.page.getWebResponse().getContentAsString();
                     try {
                                      jsEngine.eval("result = " + text + ";");
                                      Object evaluationResult = jsEngine.eval(evalText);
                                      if (evaluationResult instanceof Boolean) {
                                                  if ((Boolean)evaluationResult){ fixture.right(textCell);}
                                                  else {fixture.wrong(textCell); }


• Running tests based on tag
  • Include:            http://<host>:<port>/<suite path and test name>?responder=suite&suiteFilter=smoke,critical

  • Exclude:             http://<host>:<port>/<suite path and test name>?responder=suite&excludeSuiteFilter=NotRunningOnHudson




                                               Proprietary and Confidential
Test Variations
• What we’ve done with it that is different
  – Use as execution framework for more
    complex tests
  – Extension of fitnesse server for data-driven
    tests
  – json fixture – pass in javascript
  – Execution of Selenium tests
  – Backwards Compatibility tests



                    Proprietary and Confidential
Best practices
•   Test robustness
•   Test organization
•   Test readability
•   Fixture design
    – Tradeoff between flexibility and readability,
      usability




                      Proprietary and Confidential
Integration: putting the pieces together




               Proprietary and Confidential
Our Environment
• Multiple products (3 external, plus internal tools)
• Services-based
• Builds:
   – Produce multiple artifacts, including a fitnesse package
   – Example: A build of contentservice produces:
       •   contentservice-1.2.179886.clover.tar.gz
       •   contentservice-1.2.179886.tar.gz
       •   contentservicedb-1.2.179886.tar.gz
       •   contentservice_fitnesse-1.2.179886.tar.gz
   – Fitnesse package contains wiki page tests, libs, config files




                            Proprietary and Confidential
FitNesse as part of our
           Continuous Integration Workflow
                                  Application                Deploy
                                   Bundle                   Application
                                                                                   Run Fitnesse
Nightly    Run Junit,                                                                  Tests
 Build     Javascript                                                              (Nightly suite)
(Clover)     Tests                Fitnesse                     Deploy
                                   Bundle                     Fitnesse
               publish




                                                                                       publish
                         Hudson Dashboard                                      Fitnesse Wiki
                                                                     Link     (Test history, Details,
           (JUnit, Fitnesse summary, Code Coverage)
                                                                            Test Case Management)



                                                         Commit
 SVN                                                  (Test Cases)




                                   Proprietary and Confidential
Integration with Hudson/Jenkins servers


• Fitnesse plugin:




                     Proprietary and Confidential
Lessons learned
• Adds a lot of value for our team
   – Visibility into results and test history
   – Accessible to non-technical people
   – FitNesse is very good for visibility and straightforward
     verification of data
• Not good for everything
   – Easy to do it wrong
   – Requires maintenance
   – Not as flexible
• To do more, you have to get creative
• Fixture and test ownership needs to be a shared
  responsibility
                           Proprietary and Confidential
•   Demo files will be posted to github under jwong-github
•   Slides are on slideshare
•   Demo and slides are attached to session
•   Q&A




                         Proprietary and Confidential
The “As Seen By” Matrix




       Proprietary and Confidential

Más contenido relacionado

La actualidad más candente

Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...
Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...
Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...Yavor Nikolov
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummiesHarry Potter
 
Testing and Mocking Object - The Art of Mocking.
Testing and Mocking Object - The Art of Mocking.Testing and Mocking Object - The Art of Mocking.
Testing and Mocking Object - The Art of Mocking.Deepak Singhvi
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit TestingMike Lively
 
Unit testing php-unit - phing - selenium_v2
Unit testing   php-unit - phing - selenium_v2Unit testing   php-unit - phing - selenium_v2
Unit testing php-unit - phing - selenium_v2Tricode (part of Dept)
 
Automated cceptance testing using Fitnesse & Selenium
Automated cceptance testing using Fitnesse & SeleniumAutomated cceptance testing using Fitnesse & Selenium
Automated cceptance testing using Fitnesse & Seleniummayurairon
 
Principles and patterns for test driven development
Principles and patterns for test driven developmentPrinciples and patterns for test driven development
Principles and patterns for test driven developmentStephen Fuqua
 
Keyword-driven Test Automation Framework
Keyword-driven Test Automation FrameworkKeyword-driven Test Automation Framework
Keyword-driven Test Automation FrameworkMikhail Subach
 
Qtp Basics
Qtp BasicsQtp Basics
Qtp Basicsmehramit
 
Writing good unit test
Writing good unit testWriting good unit test
Writing good unit testLucy Lu
 
How to test models using php unit testing framework?
How to test models using php unit testing framework?How to test models using php unit testing framework?
How to test models using php unit testing framework?satejsahu
 
Refactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test AutomationRefactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test AutomationStephen Fuqua
 
QTP Training by INFOTECH
QTP Training by INFOTECHQTP Training by INFOTECH
QTP Training by INFOTECHPravinsinh
 
Unit & integration testing
Unit & integration testingUnit & integration testing
Unit & integration testingPavlo Hodysh
 

La actualidad más candente (20)

Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...
Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...
Test-Driven Development with DbFit and Oracle database, BGOUG Conference, 201...
 
Testing In Java
Testing In JavaTesting In Java
Testing In Java
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Testing and Mocking Object - The Art of Mocking.
Testing and Mocking Object - The Art of Mocking.Testing and Mocking Object - The Art of Mocking.
Testing and Mocking Object - The Art of Mocking.
 
Automated Unit Testing
Automated Unit TestingAutomated Unit Testing
Automated Unit Testing
 
Unit testing php-unit - phing - selenium_v2
Unit testing   php-unit - phing - selenium_v2Unit testing   php-unit - phing - selenium_v2
Unit testing php-unit - phing - selenium_v2
 
Automated cceptance testing using Fitnesse & Selenium
Automated cceptance testing using Fitnesse & SeleniumAutomated cceptance testing using Fitnesse & Selenium
Automated cceptance testing using Fitnesse & Selenium
 
Tdd & unit test
Tdd & unit testTdd & unit test
Tdd & unit test
 
Principles and patterns for test driven development
Principles and patterns for test driven developmentPrinciples and patterns for test driven development
Principles and patterns for test driven development
 
Keyword-driven Test Automation Framework
Keyword-driven Test Automation FrameworkKeyword-driven Test Automation Framework
Keyword-driven Test Automation Framework
 
Qtp Basics
Qtp BasicsQtp Basics
Qtp Basics
 
Writing good unit test
Writing good unit testWriting good unit test
Writing good unit test
 
Unit testing, principles
Unit testing, principlesUnit testing, principles
Unit testing, principles
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Testing in TFS
Testing in TFSTesting in TFS
Testing in TFS
 
Unit test
Unit testUnit test
Unit test
 
How to test models using php unit testing framework?
How to test models using php unit testing framework?How to test models using php unit testing framework?
How to test models using php unit testing framework?
 
Refactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test AutomationRefactoring Legacy Web Forms for Test Automation
Refactoring Legacy Web Forms for Test Automation
 
QTP Training by INFOTECH
QTP Training by INFOTECHQTP Training by INFOTECH
QTP Training by INFOTECH
 
Unit & integration testing
Unit & integration testingUnit & integration testing
Unit & integration testing
 

Destacado

Moving from Ad Hoc Testing to Continuous Test Data with FitNesse
Moving from Ad Hoc Testing to Continuous Test Data with FitNesseMoving from Ad Hoc Testing to Continuous Test Data with FitNesse
Moving from Ad Hoc Testing to Continuous Test Data with FitNesseJoris Meerts
 
Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...
Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...
Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...Jen Wong
 
TestWorks Conf 2015 Beefing up FitNesse - Arjan Molenaar
TestWorks Conf 2015 Beefing up FitNesse - Arjan MolenaarTestWorks Conf 2015 Beefing up FitNesse - Arjan Molenaar
TestWorks Conf 2015 Beefing up FitNesse - Arjan MolenaarXebia Nederland BV
 
Fitnesse user acceptance test - Presentation
Fitnesse   user acceptance test - PresentationFitnesse   user acceptance test - Presentation
Fitnesse user acceptance test - PresentationSunil Kumar Gunasekaran
 
JavaLand: Quantified Social - Fitness-Geräte und -Portale mit Agorava
JavaLand: Quantified Social - Fitness-Geräte und -Portale mit AgoravaJavaLand: Quantified Social - Fitness-Geräte und -Portale mit Agorava
JavaLand: Quantified Social - Fitness-Geräte und -Portale mit AgoravaWerner Keil
 
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...mfrancis
 
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)Peter Kofler
 
FitNesse With Scala
FitNesse With ScalaFitNesse With Scala
FitNesse With ScalaKnoldus Inc.
 
Automatic web ui testing
Automatic web ui testingAutomatic web ui testing
Automatic web ui testingAlex van Assem
 
Integration and Acceptance Testing
Integration and Acceptance TestingIntegration and Acceptance Testing
Integration and Acceptance TestingAlan Hecht
 
Introduction To Jira
Introduction To JiraIntroduction To Jira
Introduction To JiraHua Soon Sim
 
Introduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project ManagementIntroduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project ManagementDan Chuparkoff
 

Destacado (15)

Moving from Ad Hoc Testing to Continuous Test Data with FitNesse
Moving from Ad Hoc Testing to Continuous Test Data with FitNesseMoving from Ad Hoc Testing to Continuous Test Data with FitNesse
Moving from Ad Hoc Testing to Continuous Test Data with FitNesse
 
Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...
Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...
Continuous Integration using Hudson and Fitnesse at Ingenuity Systems (Silico...
 
Fitnesse, Watir and Ruby Based Test Automation System
Fitnesse, Watir and Ruby Based Test Automation SystemFitnesse, Watir and Ruby Based Test Automation System
Fitnesse, Watir and Ruby Based Test Automation System
 
TestWorks Conf 2015 Beefing up FitNesse - Arjan Molenaar
TestWorks Conf 2015 Beefing up FitNesse - Arjan MolenaarTestWorks Conf 2015 Beefing up FitNesse - Arjan Molenaar
TestWorks Conf 2015 Beefing up FitNesse - Arjan Molenaar
 
Fitnesse user acceptance test - Presentation
Fitnesse   user acceptance test - PresentationFitnesse   user acceptance test - Presentation
Fitnesse user acceptance test - Presentation
 
JavaLand: Quantified Social - Fitness-Geräte und -Portale mit Agorava
JavaLand: Quantified Social - Fitness-Geräte und -Portale mit AgoravaJavaLand: Quantified Social - Fitness-Geräte und -Portale mit Agorava
JavaLand: Quantified Social - Fitness-Geräte und -Portale mit Agorava
 
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
Methodologies for Test-Driven Development of OSGi enabled Embedded Devices - ...
 
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
Coding Dojo for Testers/Testing Dojo: Designing Test Cases with FitNesse (2014)
 
FitNesse With Scala
FitNesse With ScalaFitNesse With Scala
FitNesse With Scala
 
Automatic web ui testing
Automatic web ui testingAutomatic web ui testing
Automatic web ui testing
 
Integration and Acceptance Testing
Integration and Acceptance TestingIntegration and Acceptance Testing
Integration and Acceptance Testing
 
Acceptance Test Driven Development
Acceptance Test Driven DevelopmentAcceptance Test Driven Development
Acceptance Test Driven Development
 
Jira fundamentals
Jira fundamentalsJira fundamentals
Jira fundamentals
 
Introduction To Jira
Introduction To JiraIntroduction To Jira
Introduction To Jira
 
Introduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project ManagementIntroduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project Management
 

Similar a More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)

Developer testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing FanaticDeveloper testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing FanaticLB Denker
 
Unit Testing in SharePoint 2010
Unit Testing in SharePoint 2010Unit Testing in SharePoint 2010
Unit Testing in SharePoint 2010Chris Weldon
 
Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Mark Niebergall
 
Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022Mark Niebergall
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFXHendrik Ebbers
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Michelangelo van Dam
 
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014FalafelSoftware
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingSteven Smith
 
Examiness hints and tips from the trenches
Examiness hints and tips from the trenchesExaminess hints and tips from the trenches
Examiness hints and tips from the trenchesIsmail Mayat
 
Test in action week 4
Test in action   week 4Test in action   week 4
Test in action week 4Yi-Huan Chan
 
Getting Started with Test-Driven Development at Midwest PHP 2021
Getting Started with Test-Driven Development at Midwest PHP 2021Getting Started with Test-Driven Development at Midwest PHP 2021
Getting Started with Test-Driven Development at Midwest PHP 2021Scott Keck-Warren
 
Test in action – week 1
Test in action – week 1Test in action – week 1
Test in action – week 1Yi-Huan Chan
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Michelangelo van Dam
 
Test Driven Development with PHPUnit
Test Driven Development with PHPUnitTest Driven Development with PHPUnit
Test Driven Development with PHPUnitMindfire Solutions
 
Test in action week 2
Test in action   week 2Test in action   week 2
Test in action week 2Yi-Huan Chan
 
Testing basics for developers
Testing basics for developersTesting basics for developers
Testing basics for developersAnton Udovychenko
 
May: Automated Developer Testing: Achievements and Challenges
May: Automated Developer Testing: Achievements and ChallengesMay: Automated Developer Testing: Achievements and Challenges
May: Automated Developer Testing: Achievements and ChallengesTriTAUG
 
Android Automated Testing
Android Automated TestingAndroid Automated Testing
Android Automated Testingroisagiv
 

Similar a More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012) (20)

Developer testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing FanaticDeveloper testing 101: Become a Testing Fanatic
Developer testing 101: Become a Testing Fanatic
 
Unit Testing in SharePoint 2010
Unit Testing in SharePoint 2010Unit Testing in SharePoint 2010
Unit Testing in SharePoint 2010
 
Junit_.pptx
Junit_.pptxJunit_.pptx
Junit_.pptx
 
Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023Leveling Up With Unit Testing - php[tek] 2023
Leveling Up With Unit Testing - php[tek] 2023
 
Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022Leveling Up With Unit Testing - LonghornPHP 2022
Leveling Up With Unit Testing - LonghornPHP 2022
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
Breaking Dependencies To Allow Unit Testing - Steve Smith | FalafelCON 2014
 
Breaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit TestingBreaking Dependencies to Allow Unit Testing
Breaking Dependencies to Allow Unit Testing
 
Examiness hints and tips from the trenches
Examiness hints and tips from the trenchesExaminess hints and tips from the trenches
Examiness hints and tips from the trenches
 
Test in action week 4
Test in action   week 4Test in action   week 4
Test in action week 4
 
Getting Started with Test-Driven Development at Midwest PHP 2021
Getting Started with Test-Driven Development at Midwest PHP 2021Getting Started with Test-Driven Development at Midwest PHP 2021
Getting Started with Test-Driven Development at Midwest PHP 2021
 
Defensive Apex Programming
Defensive Apex ProgrammingDefensive Apex Programming
Defensive Apex Programming
 
Test in action – week 1
Test in action – week 1Test in action – week 1
Test in action – week 1
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
Test Driven Development with PHPUnit
Test Driven Development with PHPUnitTest Driven Development with PHPUnit
Test Driven Development with PHPUnit
 
Test in action week 2
Test in action   week 2Test in action   week 2
Test in action week 2
 
Testing basics for developers
Testing basics for developersTesting basics for developers
Testing basics for developers
 
May: Automated Developer Testing: Achievements and Challenges
May: Automated Developer Testing: Achievements and ChallengesMay: Automated Developer Testing: Achievements and Challenges
May: Automated Developer Testing: Achievements and Challenges
 
Android Automated Testing
Android Automated TestingAndroid Automated Testing
Android Automated Testing
 

Último

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFMichael Gough
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesManik S Magar
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...itnewsafrica
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integrationmarketing932765
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...Karmanjay Verma
 

Último (20)

[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
All These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDFAll These Sophisticated Attacks, Can We Really Detect Them - PDF
All These Sophisticated Attacks, Can We Really Detect Them - PDF
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotesMuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
MuleSoft Online Meetup Group - B2B Crash Course: Release SparkNotes
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...Zeshan Sattar- Assessing the skill requirements and industry expectations for...
Zeshan Sattar- Assessing the skill requirements and industry expectations for...
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS:  6 Ways to Automate Your Data IntegrationBridging Between CAD & GIS:  6 Ways to Automate Your Data Integration
Bridging Between CAD & GIS: 6 Ways to Automate Your Data Integration
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
 

More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)

  • 1. Fitnesse and Continuous Integration Jennifer Wong | Staff SQE Engineer | twitter: @jenlwong Proprietary and Confidential
  • 2. Overview ►Intro ► What is FitNesse (Not an exercise program!) ► The Details ► Integration: putting the pieces together ► Lessons Learned Proprietary and Confidential
  • 3. Intro • Who: – Jennifer Wong – Scrum Master for Tools Team, Staff SQE Engineer • Where: – Ingenuity Systems: A leading provider of information and analytics solutions for life science researchers • What: – FitNesse as a key element of Continuous Integration workflow • Why: – Follow up to last year’s presentation (http://www.slideshare.net/jenlwong/ingenuity-svcc-ci-presentation-20111007 ) Proprietary and Confidential
  • 4. FitNesse (Not an exercise program!) Proprietary and Confidential
  • 5. FitNesse • FitNesse is a wiki-based web server test tool – Helps abstract test definition from technical implementation – Provides visual reporting and result history tracking Proprietary and Confidential
  • 6. Test Types: FitNesse • We use it for: – Integration tests – Acceptance and Functional tests – UI Tests (com.jbergin.HtmlFixture, webtest) – DB Tests (dbfit) – Backward Compatibility tests • What is it good for? – Framework and visibility – accessibility to non-technical people • What is it bad for? – Unit tests – Complicated ui tests – Extensive performance testing Proprietary and Confidential
  • 7. FitNesse: The Details Proprietary and Confidential
  • 8. Downloading and Installing FitNesse • Get the jar file and run it – http://fitnesse.org/FrontPage.FitNesseDevelopment.DownLoad – java –jar fitnesse.jar • Or use the demo package: • Get the file: on the svcc web site, attached to the session, or on Github • unzip the file and cd to lib dir • start the fitnesse server: java -jar fitnesse.jar -p 8080 • open web browser and access http://localhost:8080 • click the link at the top for "CodeCampDemoPage“ • click the test button Proprietary and Confidential
  • 9. Setting your classpath • Classpath statements – Fitnesse needs to know where to find your fixture code • This kind of error : • Means you need to add this kind of statement: !path – You should usually have this kind of stuff: !contents !path fitnesse.jar !path C:/eclipse/fit_demo/eclipse-bin !define TEST_SYSTEM {slim} Proprietary and Confidential
  • 10. Some Basic Test Tables • Script table – Good for procedural/workflow tests – Flexible – Use syntax: check, reject, ensure, show • Decision table – Good for data-driven tests – Specific workflow • Input methods  execute()  output methods – Special method name interpretation – Automatically calls reset() and execute() methods • Query table – Good for validating lists or tables of data Proprietary and Confidential
  • 11. Variable Usage • Defining a static variable – !define ROOT_URL {http://myserver.com} – !define TESTUSER {testuser1@something.com} • Storing a value in a variable on the fly – Store variable: $X= – Use variable: $X • Using a variable – To use this variable, enclose the variable name in ${ } – Example: • this: ${URL_ROOT}/context/index.html • Will resolve to this: http://myserver.com/context/index.html Proprietary and Confidential
  • 12. Naming and Parameter passing (Methods) • (Un) Graceful Naming – Automatically concatenates space-separated words • isHalloween  isHalloween() • Is Halloween  isHalloween() • is halloween  isHalloween() • Is halloWeen  error – When using methods with multiple parameters, tries to intersperse method name and paremeters Proprietary and Confidential
  • 13. Parameter passing (cont) • Multi-parameter methods: isHalloween(int, String) – |ensure|is|31|Halloween|October| – |ensure|is Halloween|31||October| • Single parameter: setCostume(String) – |set costume|Clark Kent| – |set|Clark Kent|costume| • Constructors with parameters – This constructor: • public Halloween(String month, int day, String costume) – Translates to this usage in a fitnesse table: |Halloween|October|31|Cat| |isHalloween?|get surprise?| Proprietary and Confidential
  • 14. UI Test Fixtures • com.jbergin.HtmlFixture – an adapter between FitNesse and HtmlUnit for use in testing web applications – Need to use !define TEST_SYSTEM {fit} – http://htmlfixture.sourceforge.net/ – http://uebuild5:8084/FrontPage.UmaFitNesse.IngsecuritySuite.ConcurrentUserS essionTest.AcceptanceTests • webtest selenium – an extension to FIT/FitNesse that uses Selenium Remote Control. WebTest runs inside FitNesse. – http://www.fitnesse.info/webtest – http://uebuild5:8084/FrontPage.ReportsFitNesse.IsoformView.IsoformVi ewWebTestSuite.IsoformViewWebTests Proprietary and Confidential
  • 15. Real world usage is more complex • What it looks like in the real (ie, complicated)world – Session handling • http://uebuild5.ingenuity.com:8084/FrontPage.UmaFitNesse.IngsecuritySuite.Concurren tUserSessionTest.AcceptanceTests – Static objects to provide data access • http://uebuild5.ingenuity.com:8084/FrontPage.ContentserviceFitNesse.TestSuiteForCurrentContent.Ec sMappingDataProviderTestSuite.P1Tests – Complex checking of validity • Unmarshaling JSON to check special conditions in a non order dependent way – http://uebuild5.ingenuity.com:8084/FrontPage.FaFitNesse.Test SuiteForBaselineContentSpecific.FaProviderTestSuite.Execute FaQuery.LfaQueryTestSuite.AcceptanceTests Proprietary and Confidential
  • 16. Fixture code can get complicated very quickly public static boolean matchGFAResult(JSONObject jsonResult, GFAResult actualResult, boolean allowSubset, boolean allowPvalueVerification,boolean geneCountVerification ,boolean allowZscoreVerification, boolean allowGeneEffectVerification) throws JSONException { JSONArray jsonItems = jsonResult.getJSONArray("items"); logger.info("expected item size = " + jsonItems.length()); logger.info("actual item size = " + actualResult.getFAResultItems().size()); if (jsonItems.length() > actualResult.getFAResultItems().size()) { return false; } Map<String, GFAResultItem> itemMap = buildGFAResult(jsonItems); if (allowSubset) { for (Map.Entry<String, GFAResultItem> entry : itemMap.entrySet()) { logger.info("Look for " + entry.getKey() + " in actual result"); GFAResultItem item = entry.getValue(); if (!containsItem(item, actualResult.getFAResultItems(), allowSubset, allowPvalueVerification, geneCountVerification,allowZscoreVerification, allowGeneEffectVerification)) { logger.info(item.getId().getAsString() + " is expected but couldn't be found in actual result"); return false; } } } else { return equalGFAItems(itemMap, actualResult.getFAResultItems(), allowSubset,allowPvalueVerification, geneCountVerification,allowZscoreVerification, allowGeneEffectVerification); } return true; } private static boolean equalGFAItems(Map<String, GFAResultItem> itemMap, Collection<GFAResultItem> actualResultItems, boolean allowSubset, boolean allowPvalueVerification,boolean geneCountVerification ,boolean allowZscoreVerification, boolean allowGeneEffectVerification) { if (itemMap.size() != actualResultItems.size()) { return false; } Proprietary and Confidential
  • 17. Tips and tricks • Search in your FitNesse wiki • Use Includes – Use includes as templates – http://uebuild5.ingenuity.com:8084/FrontPage.IngtestFitNesse.StableSui te.FaStableCompat – http://uebuild5.ingenuity.com:8084/FrontPage.IngtestFitNesse.StableSui te.ContentserviceStableCompat • Comments • Escaping special characters – Start tables with ! to avoid unwanted interpretation of graceful names, etc – Surround special chars with !- -! • Example: !-gobbledeygook ~!@#$%^&*(){}| as plain string-! Proprietary and Confidential
  • 18. Fancy fixtures and other nifty stuff • JSON – http://uebuild5:8084/FrontPage.MgFitNesse.TestSuiteForBaselineContentSpecific.GraphProviderTestSuite.GetNeighb orhoodGraph.P1Tests • Javascript validation – http://localhost:8080/FrontPage.AutocompFitNesse.FunctionalTests.FitTests.GeneralTests.P1Tests EVAL { void execute(Parse row, JSONFixture fixture) { Parse textCell = row.parts.more;// row.parts.more; String evalText = textCell.text(); String text = fixture.page.getWebResponse().getContentAsString(); try { jsEngine.eval("result = " + text + ";"); Object evaluationResult = jsEngine.eval(evalText); if (evaluationResult instanceof Boolean) { if ((Boolean)evaluationResult){ fixture.right(textCell);} else {fixture.wrong(textCell); } • Running tests based on tag • Include: http://<host>:<port>/<suite path and test name>?responder=suite&suiteFilter=smoke,critical • Exclude: http://<host>:<port>/<suite path and test name>?responder=suite&excludeSuiteFilter=NotRunningOnHudson Proprietary and Confidential
  • 19. Test Variations • What we’ve done with it that is different – Use as execution framework for more complex tests – Extension of fitnesse server for data-driven tests – json fixture – pass in javascript – Execution of Selenium tests – Backwards Compatibility tests Proprietary and Confidential
  • 20. Best practices • Test robustness • Test organization • Test readability • Fixture design – Tradeoff between flexibility and readability, usability Proprietary and Confidential
  • 21. Integration: putting the pieces together Proprietary and Confidential
  • 22. Our Environment • Multiple products (3 external, plus internal tools) • Services-based • Builds: – Produce multiple artifacts, including a fitnesse package – Example: A build of contentservice produces: • contentservice-1.2.179886.clover.tar.gz • contentservice-1.2.179886.tar.gz • contentservicedb-1.2.179886.tar.gz • contentservice_fitnesse-1.2.179886.tar.gz – Fitnesse package contains wiki page tests, libs, config files Proprietary and Confidential
  • 23. FitNesse as part of our Continuous Integration Workflow Application Deploy Bundle Application Run Fitnesse Nightly Run Junit, Tests Build Javascript (Nightly suite) (Clover) Tests Fitnesse Deploy Bundle Fitnesse publish publish Hudson Dashboard Fitnesse Wiki Link (Test history, Details, (JUnit, Fitnesse summary, Code Coverage) Test Case Management) Commit SVN (Test Cases) Proprietary and Confidential
  • 24. Integration with Hudson/Jenkins servers • Fitnesse plugin: Proprietary and Confidential
  • 25. Lessons learned • Adds a lot of value for our team – Visibility into results and test history – Accessible to non-technical people – FitNesse is very good for visibility and straightforward verification of data • Not good for everything – Easy to do it wrong – Requires maintenance – Not as flexible • To do more, you have to get creative • Fixture and test ownership needs to be a shared responsibility Proprietary and Confidential
  • 26. Demo files will be posted to github under jwong-github • Slides are on slideshare • Demo and slides are attached to session • Q&A Proprietary and Confidential
  • 27. The “As Seen By” Matrix Proprietary and Confidential

Notas del editor

  1. Outline for this deck:Who we areWhat challenge we are addressing (high level)Our platform = Ingenuity Knowledge Base Content (3 slides) Ontology (1 slide)Products and Solutions Overview Research and Analysis Solutions The challenge IPA addresses IPA overview The challenge Ingenuity Answers addresses Additional Solutions eCommerce EnterpriseWhat Sets Ingenuity Apart (USPs)