SlideShare uma empresa Scribd logo
1 de 133
Baixar para ler offline
Introducing Thucydides
                      Automated Acceptance Tests, Step by step




                                    John Ferguson Smart
Friday, 9 March 12
So who is this guy, anyway?
                                 Consulta
                                         nt
                                 Trainer
                                Mentor
                                Author
                               Speaker
                               Coder
                     John Fer
                              guson S
                                      mar t




Friday, 9 March 12
ATDD
or Specification by example




Friday, 9 March 12
ATDD
or Specification by example




                     The story of your app
Friday, 9 March 12
Friday, 9 March 12
User stories

                 As a job seeker
                 I want to find jobs in relevant categories
                 So that I can find a suitable job




Friday, 9 March 12
User stories

                 As a job seeker
                 I want to find jobs in relevant categories
                 So that I can find a suitable job

                                                             Features/Epics




Friday, 9 March 12
User stories

                 As a job seeker
                 I want to find jobs in relevant categories
                 So that I can find a suitable job


                                                                                       Acceptance criteria

                      ☑	
  The	
  job	
  seeker	
  can	
  see	
  available	
  categories	
  on	
  the	
  home	
  page
                      ☑	
  The	
  job	
  seeker	
  can	
  look	
  for	
  jobs	
  in	
  a	
  given	
  category
                      ☑	
  The	
  job	
  seeker	
  can	
  see	
  what	
  category	
  a	
  job	
  belongs	
  to




Friday, 9 March 12
User stories

                 As a job seeker
                 I want to find jobs in relevant categories
                 So that I can find a suitable job


                                                                                       Acceptance criteria

                      ☑	
  The	
  job	
  seeker	
  can	
  see	
  available	
  categories	
  on	
  the	
  home	
  page
                      ☑	
  The	
  job	
  seeker	
  can	
  look	
  for	
  jobs	
  in	
  a	
  given	
  category
                      ☑	
  The	
  job	
  seeker	
  can	
  see	
  what	
  category	
  a	
  job	
  belongs	
  to



         scenario "A job seeker can see the available job categories on the home page",
         {
         	   when "the job seeker is looking for a job",
         	   then "the job seeker can see all the available job categories"
         }

                                                                                 Automated acceptance test




Friday, 9 March 12
scenario "A job seeker can see the available job categories on the home page",
             {
             	   when "the job seeker is looking for a job",
             	   then "the job seeker can see all the available job categories"
             }
                                                                  Automated acceptance test




Friday, 9 March 12
scenario "A job seeker can see the available job categories on the home page",
             {
             	   when "the job seeker is looking for a job",
             	   then "the job seeker can see all the available job categories"
             }
                                                                  Automated acceptance test




        Implemented development tests

Friday, 9 March 12
scenario "A job seeker can see the available job categories on the home page",
             {
             	   when "the job seeker is looking for a job",
             	   then "the job seeker can see all the available job categories"
             }
                                                                  Automated acceptance test




        Implemented development tests                             Implemented acceptance tests

Friday, 9 March 12
Automated acceptance criteria




Friday, 9 March 12
Automated acceptance criteria




                                    Define your goals

Friday, 9 March 12
Automated acceptance criteria




Friday, 9 March 12
Automated acceptance criteria




                                    keep you on track

Friday, 9 March 12
Automated acceptance criteria




Friday, 9 March 12
Automated acceptance criteria




                                    Provide better visibility

Friday, 9 March 12
Automated acceptance criteria




Friday, 9 March 12
Automated acceptance criteria




                              Allow faster release cycles

Friday, 9 March 12
Automated acceptance criteria




Friday, 9 March 12
Automated acceptance criteria




                                    Reduce Risk

Friday, 9 March 12
Automated acceptance criteria




Friday, 9 March 12
Automated acceptance criteria




                                    Reduce Costs

Friday, 9 March 12
Why should developers
                     write web tests?




Friday, 9 March 12
Why should developers
                     write web tests?




                      Shouldn’t QA be doing that?

Friday, 9 March 12
Why only do QA
                     at the end of the project?




Friday, 9 March 12
Real quality cannot be injected at the end




Friday, 9 March 12
Real quality cannot be injected at the end




                               It must be part of the process

Friday, 9 March 12
Leave the boring stuff to the automated tests...




Friday, 9 March 12
...and empower your QA team




Friday, 9 March 12
...and empower your QA team




                     Let testers focus on more intelligent testing

Friday, 9 March 12
Acceptance Tests

       The high-level view




             So	
  where	
  
            are	
  we	
  at?

Friday, 9 March 12
Low level web tests

                        WebDriver	
  
                         rocks!




                     Focus on implementation
Friday, 9 March 12
How do we bridge the gap?




Friday, 9 March 12
How do we bridge the gap?




                           Test steps

Friday, 9 March 12
scenario "A job seeker can see the available job categories on the home page",
                 {
                 	   when "the job seeker is looking for a job",
                 	   then "the job seeker can see all the available job categories"
                 }
                                                                                     Automated




                                                                        Test steps

Friday, 9 March 12
scenario "A job seeker can see the available job categories on the home page",
                 {
                 	   when "the job seeker is looking for a job",
                 	   then "the job seeker can see all the available job categories"
                 }
                                                                                     Automated

         scenario "The user can see the available job categories on the home page",
         {
         	   when "the job seeker is looking for a job",
             {
                job_seeker.open_jobs_page()
             }
         	   then "the job seeker can see all the available job categories",
             {
                job_seeker.should_see_job_categories "Java Developers", "Groovy Developers"
             }
         }
                                                                                      Implemented

                                                                        Test steps

Friday, 9 March 12
scenario "A job seeker can see the available job categories on the home page",
                 {
                 	   when "the job seeker is looking for a job",
                 	   then "the job seeker can see all the available job categories"
                 }
                                                                                       Automated

         scenario "The user can see the available job categories on the home page",
         {
         	   when "the job seeker is looking for a job",
             {
                job_seeker.open_jobs_page()
             }
         	   then "the job seeker can see all the available job categories",
             {
                job_seeker.should_see_job_categories "Java Developers", "Groovy Developers"
             }
         }
                                                                                       Implemented

                              JobSeekerSteps
                                JobSeekerSteps
                                  JobSeekerSteps
                              open_jobs_page()
                                                                           Test steps
                                open_jobs_page()
                                  open_jobs_page()
                              should_see_job_categories(String...	
  categories)
                                should_see_job_categories(String...	
  categories)
                              ... should_see_job_categories(String...	
  categories)
                                ...
                                  ...
                                                                Step libraries
Friday, 9 March 12
scenario "The user can see the available job categories on the home page",
         {
         	   when "the job seeker is looking for a job",
             {
                job_seeker.open_jobs_page()
             }
         	   then "the job seeker can see all the available job categories",
             {
                job_seeker.should_see_job_categories "Java Developers", "Groovy Developers"
             }
         }

                                                                                      Implemented Tests

                               JobSeekerSteps
                                 JobSeekerSteps
                                   JobSeekerSteps
                               open_jobs_page()
                                 open_jobs_page()
                                   open_jobs_page()
                               should_see_job_categories(String...	
  categories)
                                 should_see_job_categories(String...	
  categories)
                               ... should_see_job_categories(String...	
  categories)
                                 ...
                                   ...
                                                                                Step libraries

                                                                              Test steps

Friday, 9 March 12
scenario "The user can see the available job categories on the home page",
         {
         	   when "the job seeker is looking for a job",
             {
                job_seeker.open_jobs_page()
             }
         	   then "the job seeker can see all the available job categories",
             {
                job_seeker.should_see_job_categories "Java Developers", "Groovy Developers"
             }
         }

                                                                                      Implemented Tests

                               JobSeekerSteps
                                 JobSeekerSteps
                                   JobSeekerSteps
                               open_jobs_page()
                                 open_jobs_page()
                                   open_jobs_page()
                               should_see_job_categories(String...	
  categories)
                                 should_see_job_categories(String...	
  categories)
                               ... should_see_job_categories(String...	
  categories)
                                 ...
                                   ...
                                                                                Step libraries

                                                                              Test steps
                                                                                     Page Objects

Friday, 9 March 12
Test steps

Friday, 9 March 12
Test steps

Friday, 9 March 12
Test steps

Friday, 9 March 12
Test steps

Friday, 9 March 12
Test steps




Friday, 9 March 12
Test steps




                     help organize your tests
Friday, 9 March 12
Test steps




Friday, 9 March 12
Test steps




     are a communication tool
Friday, 9 March 12
Test steps




Friday, 9 March 12
Test steps




                     are reusable building blocks
Friday, 9 March 12
Test steps




Friday, 9 March 12
Test steps




  help estimate progress
Friday, 9 March 12
And so we built a tool...




Friday, 9 March 12
Friday, 9 March 12
Webdriver/Selenium 2 extension




Friday, 9 March 12
Webdriver/Selenium 2 extension

      Organize tests, stories and features




Friday, 9 March 12
Webdriver/Selenium 2 extension

      Organize tests, stories and features




                                     Record/report test execution




Friday, 9 March 12
Webdriver/Selenium 2 extension

      Organize tests, stories and features




                                     Record/report test execution


                     Measure functional coverage

Friday, 9 March 12
Friday, 9 March 12
Thucydides in action




Friday, 9 March 12
Thucydides in action   A simple demo app




Friday, 9 March 12
Defining your acceptance tests
        scenario "A
                    job seeker
        {                       can see the
                                             available j
                                                             ob categori
       	   when "the j                                                   es on the h
                       ob seeker i                                                   ome page",
       	   then "the j             s looking f
                       ob seeker c             o r a j o b ",
       }                           an see all
                                              the availab
                                                              le job cate
                                                                          gories"




                       scenario "The administrator adds a new category to the system",
                       {
                           given "a new category needs to be added to the system",
                           when "the administrator adds a new category",
                           then "the system should confirm that the category has been created",
                           and "the new category should be visible to job seekers",
                       }
       scenario "The admini
                            strator deletes a ca
      {                                          tegory from the syst
                                                                      em",
           given "a category ne
                                eds to be deleted",
           when "the administra
                                tor deletes a catego
           then "the system will                     ry",
                                  confirm that the cate
           and "the deleted cate                        gory has been delete
                                 gory should no longer                       d",
      }                                                 be visible to job se
                                                                             eker   s",




Friday, 9 March 12
Defining your acceptance tests
        scenario "A
                    job seeker
        {                       can see the
                                             available j
                                                             ob categori
       	   when "the j                                                   es on the h
                       ob seeker i                                                   ome page",
       	   then "the j             s looking f
                       ob seeker c             o r a j o b ",
       }                           an see all
                                              the availab
                                                              le job cate
                                                                          gories"




                       scenario "The administrator adds a new category to the system",
                       {
                           given "a new category needs to be added to the system",
                           when "the administrator adds a new category",
                           then "the system should confirm that the category has been created",
                           and "the new category should be visible to job seekers",
                       }
       scenario "The admini
                            strator deletes a ca
      {                                          tegory from the syst
                                                                      em",
           given "a category ne
                                eds to be deleted",
           when "the administra
                                tor deletes a catego
           then "the system will                     ry",
                                  confirm that the cate
           and "the deleted cate                        gory has been delete
                                 gory should no longer                       d",
      }                                                 be visible to job se
                                                                             eker   s",

                                                focus on business value

Friday, 9 March 12
Defining your acceptance tests
        scenario "A
                    job seeker
        {                       can see the
                                             available j
                                                             ob categori
       	   when "the j                                                   es on the h
                       ob seeker i                                                   ome page",
       	   then "the j             s looking f
                       ob seeker c             o r a j o b ",
       }                           an see all
                                              the availab
                                                              le job cate
                                                                          gories"




                       scenario "The administrator adds a new category to the system",
                       {
                           given "a new category needs to be added to the system",
                           when "the administrator adds a new category",
                           then "the system should confirm that the category has been created",
                           and "the new category should be visible to job seekers",
                       }

      {
       scenario "The admini
                            strator deletes a ca
                                                 tegory from the syst
                                                                      em",
                                                                                     ...defined in business terms
           given "a category ne
                                eds to be deleted",
           when "the administra
                                tor deletes a catego
           then "the system will                     ry",
                                  confirm that the cate
           and "the deleted cate                        gory has been delete
                                 gory should no longer                       d",
      }                                                 be visible to job se
                                                                             eker   s",

                                                focus on business value

Friday, 9 March 12
Defining your acceptance tests
        scenario "A
                    job seeker
        {                       can see the
                                             available j
                                                             ob categori
       	   when "the j                                                   es on the h
                       ob seeker i                                                   ome page",
       	   then "the j             s looking f
                       ob seeker c             o r a j o b ",
       }                           an see all
                                              the availab
                                                              le job cate
                                                                          gories"

                                                             High level requ
                                                                                      irements...

                       scenario "The administrator adds a new category to the system",
                       {
                           given "a new category needs to be added to the system",
                           when "the administrator adds a new category",
                           then "the system should confirm that the category has been created",
                           and "the new category should be visible to job seekers",
                       }

      {
       scenario "The admini
                            strator deletes a ca
                                                 tegory from the syst
                                                                      em",
                                                                                     ...defined in business terms
           given "a category ne
                                eds to be deleted",
           when "the administra
                                tor deletes a catego
           then "the system will                     ry",
                                  confirm that the cate
           and "the deleted cate                        gory has been delete
                                 gory should no longer                       d",
      }                                                 be visible to job se
                                                                             eker   s",

                                                focus on business value

Friday, 9 March 12
Organizing your requirements
                     public class Application {

                         @Feature
                         public class ManageCompanies {
                             public class AddNewCompany {}
                             public class DeleteCompany {}
                             public class ListCompanies {}
                         }

                         @Feature
                         public class ManageCategories {
                             public class AddNewCategory {}
                             public class ListCategories {}
                             public class DeleteCategory {}
                         }

                         @Feature
                         public class BrowseJobs {
                             public class UserLookForJobs {}
                             public class UserBrowsesJobTabs {}
                         }
                     }




Friday, 9 March 12
Organizing your requirements
        Features     public class Application {

                         @Feature
                         public class ManageCompanies {
                             public class AddNewCompany {}
                             public class DeleteCompany {}
                             public class ListCompanies {}
                         }

                         @Feature
                         public class ManageCategories {
                             public class AddNewCategory {}
                             public class ListCategories {}
                             public class DeleteCategory {}
                         }

                         @Feature
                         public class BrowseJobs {
                             public class UserLookForJobs {}
                             public class UserBrowsesJobTabs {}
                         }
                     }




Friday, 9 March 12
Organizing your requirements
        Features     public class Application {

                         @Feature
                         public class ManageCompanies {
                             public class AddNewCompany {}
                             public class DeleteCompany {}
                             public class ListCompanies {}
                         }

                         @Feature
                         public class ManageCategories {
                             public class AddNewCategory {}
                             public class ListCategories {}
                             public class DeleteCategory {}
                         }

                         @Feature                                 Stories
                         public class BrowseJobs {
                             public class UserLookForJobs {}
                             public class UserBrowsesJobTabs {}
                         }
                     }




Friday, 9 March 12
Organizing your requirements
        Features     public class Application {

                         @Feature
                         public class ManageCompanies {
                             public class AddNewCompany {}
                             public class DeleteCompany {}
                             public class ListCompanies {}
                         }

                         @Feature
                         public class ManageCategories {
                             public class AddNewCategory {}
                             public class ListCategories {}
                             public class DeleteCategory {}
                         }

                         @Feature                                 Stories
                         public class BrowseJobs {
                             public class UserLookForJobs {}
                             public class UserBrowsesJobTabs {}
                         }
                     }




Friday, 9 March 12
Implementing your acceptance tests
  using "thucydides"
  thucydides.uses_steps_from AdministratorSteps
  thucydides.uses_steps_from JobSeekerSteps
  thucydides.tests_story AddNewCategory

  scenario "The administrator adds a new category to the system",
  {
  	 given "a new category needs to be added to the system",
      {
        administrator.logs_in_to_admin_page_if_first_time()
        administrator.opens_categories_list()
      }
  	 when "the administrator adds a new category",
      {
         administrator.selects_add_category()
         administrator.adds_new_category("Scala Developers","SCALA")
      }
      then "the system should confirm that the category has been created",
      {
          administrator.should_see_confirmation_message "The Category has been created"
      }
      and "the new category should be visible to job seekers",
      {
          job_seeker.opens_jobs_page()
          job_seeker.should_see_job_category "Scala Developers"
      }
  }
Friday, 9 March 12
Implementing your acceptance tests
  using "thucydides"                                   We are testing this story
  thucydides.uses_steps_from AdministratorSteps
  thucydides.uses_steps_from JobSeekerSteps
  thucydides.tests_story AddNewCategory

  scenario "The administrator adds a new category to the system",
  {
  	 given "a new category needs to be added to the system",
      {
        administrator.logs_in_to_admin_page_if_first_time()
        administrator.opens_categories_list()
      }
  	 when "the administrator adds a new category",
      {
         administrator.selects_add_category()
         administrator.adds_new_category("Scala Developers","SCALA")
      }
      then "the system should confirm that the category has been created",
      {
          administrator.should_see_confirmation_message "The Category has been created"
      }
      and "the new category should be visible to job seekers",
      {
          job_seeker.opens_jobs_page()
          job_seeker.should_see_job_category "Scala Developers"
      }
  }
Friday, 9 March 12
Implementing your acceptance tests
  using "thucydides"                                   We are testing this story
  thucydides.uses_steps_from AdministratorSteps
  thucydides.uses_steps_from JobSeekerSteps
  thucydides.tests_story AddNewCategory
                                                            An acceptance criteria
  scenario "The administrator adds a new category to the system",
  {
  	 given "a new category needs to be added to the system",
      {
        administrator.logs_in_to_admin_page_if_first_time()
        administrator.opens_categories_list()
      }
  	 when "the administrator adds a new category",
      {
         administrator.selects_add_category()
         administrator.adds_new_category("Scala Developers","SCALA")
      }
      then "the system should confirm that the category has been created",
      {
          administrator.should_see_confirmation_message "The Category has been created"
      }
      and "the new category should be visible to job seekers",
      {
          job_seeker.opens_jobs_page()
          job_seeker.should_see_job_category "Scala Developers"
      }
  }
Friday, 9 March 12
Implementing your acceptance tests
  using "thucydides"                                   We are testing this story
  thucydides.uses_steps_from AdministratorSteps
  thucydides.uses_steps_from JobSeekerSteps
  thucydides.tests_story AddNewCategory
                                                            An acceptance criteria
  scenario "The administrator adds a new category to the system",
  {
  	 given "a new category needs to be added to the system",
      {
                                                                   Narrative style
        administrator.logs_in_to_admin_page_if_first_time()
        administrator.opens_categories_list()
      }
  	 when "the administrator adds a new category",
      {
         administrator.selects_add_category()
         administrator.adds_new_category("Scala Developers","SCALA")
      }
      then "the system should confirm that the category has been created",
      {
          administrator.should_see_confirmation_message "The Category has been created"
      }
      and "the new category should be visible to job seekers",
      {
          job_seeker.opens_jobs_page()
          job_seeker.should_see_job_category "Scala Developers"
      }
  }
Friday, 9 March 12
Implementing your acceptance tests
  using "thucydides"                                   We are testing this story
  thucydides.uses_steps_from AdministratorSteps
  thucydides.uses_steps_from JobSeekerSteps
  thucydides.tests_story AddNewCategory
                                                            An acceptance criteria
  scenario "The administrator adds a new category to the system",
  {
  	 given "a new category needs to be added to the system",
      {
                                                                   Narrative style
        administrator.logs_in_to_admin_page_if_first_time()
        administrator.opens_categories_list()
      }                                                              Step through an
  	 when "the administrator adds a new category",                       example
      {
         administrator.selects_add_category()
         administrator.adds_new_category("Scala Developers","SCALA")
      }
      then "the system should confirm that the category has been created",
      {
          administrator.should_see_confirmation_message "The Category has been created"
      }
      and "the new category should be visible to job seekers",
      {
          job_seeker.opens_jobs_page()
          job_seeker.should_see_job_category "Scala Developers"
      }
  }
Friday, 9 March 12
Implementing your acceptance tests
  using "thucydides"                                   We are testing this story
  thucydides.uses_steps_from AdministratorSteps
  thucydides.uses_steps_from JobSeekerSteps
  thucydides.tests_story AddNewCategory
                                                            An acceptance criteria
  scenario "The administrator adds a new category to the system",
  {
  	 given "a new category needs to be added to the system",
      {
                                                                   Narrative style
        administrator.logs_in_to_admin_page_if_first_time()
        administrator.opens_categories_list()
      }                                                              Step through an
  	 when "the administrator adds a new category",                       example
      {
         administrator.selects_add_category()
         administrator.adds_new_category("Scala Developers","SCALA")
      }
      then "the system should confirm that the category has been created",
      {
          administrator.should_see_confirmation_message "The Category has been created"
      }
      and "the new category should be visible to job seekers",
      {                                                              Still high-level
          job_seeker.opens_jobs_page()
          job_seeker.should_see_job_category "Scala Developers"
      }
  }
Friday, 9 March 12
Some folks prefer JUnit...
  @RunWith(ThucydidesRunner.class)
  @Story(AddNewCategory.class)
  public class AddCategoryStory {

        @Managed
        public WebDriver webdriver;

        @ManagedPages(defaultUrl = "http://localhost:9000")
        public Pages pages;

        @Steps
        public AdministratorSteps administrator;

        @Steps
        public JobSeekerSteps job_seeker;

        @Test
        public void administrator_adds_a_new_category_to_the_system() {
            administrator.logs_in_to_admin_page_if_first_time();
            administrator.opens_categories_list();
            administrator.selects_add_category();
            administrator.adds_new_category("Java Developers","JAVA");
            administrator.should_see_confirmation_message("The Category has been created");

               job_seeker.opens_job_page();
               job_seeker.should_see_job_category("Java Developers");
        }

        @Pending @Test
        public void administrator_adds_an_existing_category_to_the_system() {}
  }

Friday, 9 March 12
Some folks prefer JUnit...
  @RunWith(ThucydidesRunner.class)
  @Story(AddNewCategory.class)                           Thucydides handles the
  public class AddCategoryStory {
                                                          web driver instances
        @Managed
        public WebDriver webdriver;

        @ManagedPages(defaultUrl = "http://localhost:9000")
        public Pages pages;

        @Steps
        public AdministratorSteps administrator;

        @Steps
        public JobSeekerSteps job_seeker;

        @Test
        public void administrator_adds_a_new_category_to_the_system() {
            administrator.logs_in_to_admin_page_if_first_time();
            administrator.opens_categories_list();
            administrator.selects_add_category();
            administrator.adds_new_category("Java Developers","JAVA");
            administrator.should_see_confirmation_message("The Category has been created");

               job_seeker.opens_job_page();
               job_seeker.should_see_job_category("Java Developers");
        }

        @Pending @Test
        public void administrator_adds_an_existing_category_to_the_system() {}
  }

Friday, 9 March 12
Some folks prefer JUnit...
  @RunWith(ThucydidesRunner.class)
  @Story(AddNewCategory.class)                           Thucydides handles the
  public class AddCategoryStory {
                                                          web driver instances
        @Managed
        public WebDriver webdriver;

        @ManagedPages(defaultUrl = "http://localhost:9000")
        public Pages pages;

        @Steps
        public AdministratorSteps administrator;

        @Steps
                                                                        Using the same steps
        public JobSeekerSteps job_seeker;

        @Test
        public void administrator_adds_a_new_category_to_the_system() {
            administrator.logs_in_to_admin_page_if_first_time();
            administrator.opens_categories_list();
            administrator.selects_add_category();
            administrator.adds_new_category("Java Developers","JAVA");
            administrator.should_see_confirmation_message("The Category has been created");

               job_seeker.opens_job_page();
               job_seeker.should_see_job_category("Java Developers");
        }

        @Pending @Test
        public void administrator_adds_an_existing_category_to_the_system() {}
  }

Friday, 9 March 12
Some folks prefer JUnit...
  @RunWith(ThucydidesRunner.class)
  @Story(AddNewCategory.class)                           Thucydides handles the
  public class AddCategoryStory {
                                                          web driver instances
        @Managed
        public WebDriver webdriver;

        @ManagedPages(defaultUrl = "http://localhost:9000")
        public Pages pages;

        @Steps
        public AdministratorSteps administrator;

        @Steps
                                                                        Using the same steps
        public JobSeekerSteps job_seeker;

        @Test
        public void administrator_adds_a_new_category_to_the_system() {
            administrator.logs_in_to_admin_page_if_first_time();
            administrator.opens_categories_list();
            administrator.selects_add_category();
            administrator.adds_new_category("Java Developers","JAVA");
            administrator.should_see_confirmation_message("The Category has been created");

               job_seeker.opens_job_page();
               job_seeker.should_see_job_category("Java Developers");
        }                                                               Tests can be pending
        @Pending @Test
        public void administrator_adds_an_existing_category_to_the_system() {}
  }

Friday, 9 March 12
Defining your test steps
  public class AdministratorSteps extends ScenarioSteps {

        @Step
        public void opens_categories_list() {
            AdminHomePage page = getPages().get(AdminHomePage.class);
            page.open();
            page.selectObjectType("Categories");
        }

        @Step
        public void selects_add_category() {
            CategoriesPage categoriesPage = getPages().get(CategoriesPage.class);
            categoriesPage.selectAddCategory();
        }

        @Step
        public void adds_new_category(String label, String code) {
            EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class);
            newCategoryPage.saveNewCategory(label, code);
        }

        @Step
        public void should_see_confirmation_message(String message) {
            AdminPage page = getPages().get(AdminPage.class);
            page.shouldContainConfirmationMessage(message);
        }

        @Step
        public void deletes_category(String name) {
            opens_categories_list();
            displays_category_details_for(name);
            deletes_category();
        }
  }

Friday, 9 March 12
Defining your test steps
  public class AdministratorSteps extends ScenarioSteps {                    A step library
        @Step
        public void opens_categories_list() {
            AdminHomePage page = getPages().get(AdminHomePage.class);
            page.open();
            page.selectObjectType("Categories");
        }

        @Step
        public void selects_add_category() {
            CategoriesPage categoriesPage = getPages().get(CategoriesPage.class);
            categoriesPage.selectAddCategory();
        }

        @Step
        public void adds_new_category(String label, String code) {
            EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class);
            newCategoryPage.saveNewCategory(label, code);
        }

        @Step
        public void should_see_confirmation_message(String message) {
            AdminPage page = getPages().get(AdminPage.class);
            page.shouldContainConfirmationMessage(message);
        }

        @Step
        public void deletes_category(String name) {
            opens_categories_list();
            displays_category_details_for(name);
            deletes_category();
        }
  }

Friday, 9 March 12
Defining your test steps
  public class AdministratorSteps extends ScenarioSteps {                    A step library
        @Step
        public void opens_categories_list() {
            AdminHomePage page = getPages().get(AdminHomePage.class);
            page.open();
            page.selectObjectType("Categories");
        }                                                               High level steps...
        @Step
        public void selects_add_category() {
            CategoriesPage categoriesPage = getPages().get(CategoriesPage.class);
            categoriesPage.selectAddCategory();
        }

        @Step
        public void adds_new_category(String label, String code) {
            EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class);
            newCategoryPage.saveNewCategory(label, code);
        }

        @Step
        public void should_see_confirmation_message(String message) {
            AdminPage page = getPages().get(AdminPage.class);
            page.shouldContainConfirmationMessage(message);
        }

        @Step
        public void deletes_category(String name) {
            opens_categories_list();
            displays_category_details_for(name);
            deletes_category();
        }
  }

Friday, 9 March 12
Defining your test steps
  public class AdministratorSteps extends ScenarioSteps {                    A step library
        @Step
        public void opens_categories_list() {
            AdminHomePage page = getPages().get(AdminHomePage.class);
            page.open();
            page.selectObjectType("Categories");
        }                                                               High level steps...
        @Step
        public void selects_add_category() {
            CategoriesPage categoriesPage = getPages().get(CategoriesPage.class);
            categoriesPage.selectAddCategory();
        }

        @Step
        public void adds_new_category(String label, String code) {
            EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class);
            newCategoryPage.saveNewCategory(label, code);
        }
                                                                             ...implemented
        @Step
        public void should_see_confirmation_message(String message) {
                                                                            with Page Objects
            AdminPage page = getPages().get(AdminPage.class);
            page.shouldContainConfirmationMessage(message);
        }

        @Step
        public void deletes_category(String name) {
            opens_categories_list();
            displays_category_details_for(name);
            deletes_category();
        }
  }

Friday, 9 March 12
Defining your test steps
  public class AdministratorSteps extends ScenarioSteps {                    A step library
        @Step
        public void opens_categories_list() {
            AdminHomePage page = getPages().get(AdminHomePage.class);
            page.open();
            page.selectObjectType("Categories");
        }                                                               High level steps...
        @Step
        public void selects_add_category() {
            CategoriesPage categoriesPage = getPages().get(CategoriesPage.class);
            categoriesPage.selectAddCategory();
        }

        @Step
        public void adds_new_category(String label, String code) {
            EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class);
            newCategoryPage.saveNewCategory(label, code);
        }
                                                                             ...implemented
        @Step
        public void should_see_confirmation_message(String message) {
                                                                            with Page Objects
            AdminPage page = getPages().get(AdminPage.class);
            page.shouldContainConfirmationMessage(message);
        }

        @Step                                                             ...or with other steps
        public void deletes_category(String name) {
            opens_categories_list();
            displays_category_details_for(name);
            deletes_category();
        }
  }

Friday, 9 March 12
Defining your page objects
  public class EditCategoryPage extends PageObject {

          @FindBy(id="object_label")
          WebElement label;

          @FindBy(id="object_code")
          WebElement code;

          @FindBy(name="_save")
          WebElement saveButton;

          public EditCategoryPage(WebDriver driver) {
              super(driver);
          }

          public void saveNewCategory(String labelValue, String codeValue) {
              typeInto(label, labelValue);
              typeInto(code, codeValue);
              saveButton.click();
          }
  }




Friday, 9 March 12
Defining your page objects
  public class EditCategoryPage extends PageObject {

          @FindBy(id="object_label")
          WebElement label;                                 Provides some useful
          @FindBy(id="object_code")
                                                              utility methods...
          WebElement code;

          @FindBy(name="_save")
          WebElement saveButton;

          public EditCategoryPage(WebDriver driver) {
              super(driver);
          }

          public void saveNewCategory(String labelValue, String codeValue) {
              typeInto(label, labelValue);
              typeInto(code, codeValue);
              saveButton.click();
          }
  }




Friday, 9 March 12
Defining your page objects
  public class EditCategoryPage extends PageObject {

          @FindBy(id="object_label")
          WebElement label;                                 Provides some useful
          @FindBy(id="object_code")
                                                              utility methods...
          WebElement code;

          @FindBy(name="_save")
          WebElement saveButton;

          public EditCategoryPage(WebDriver driver) {
              super(driver);
          }

          public void saveNewCategory(String labelValue, String codeValue) {
              typeInto(label, labelValue);
              typeInto(code, codeValue);
              saveButton.click();
          }
  }                                          but otherwise a normal
                                             WebDriver Page Object



Friday, 9 March 12
Then we run the tests...




Friday, 9 March 12
Thucydides reports




Friday, 9 March 12
Thucydides reports




Friday, 9 March 12
Thucydides reports

                     Browse the features




Friday, 9 March 12
Browse the stories




Friday, 9 March 12
Browse the stories




Friday, 9 March 12
Browse the stories

                     Browse the stories




Friday, 9 March 12
Browse the stories




Friday, 9 March 12
Browse the stories

                     Browse the test scenarios




Friday, 9 March 12
Browse the stories

                     Browse the test scenarios




Friday, 9 March 12
Illustrating the test paths
                                     A test
                                    scenario




                                    Steps




                          Test
                        scenarios




Friday, 9 March 12
Friday, 9 March 12
Illustrating the test paths




                               Screenshots



Friday, 9 March 12
Functional coverage




                       Features




Friday, 9 March 12
Functional coverage




                        User
                       stories




Friday, 9 March 12
Functional coverage




Friday, 9 March 12
Functional coverage

                       Passing tests




Friday, 9 March 12
Functional coverage

                       Passing tests




                           Failing tests

Friday, 9 March 12
Functional coverage

                          Passing tests




                       Pending tests



                              Failing tests

Friday, 9 March 12
Functional coverage




Friday, 9 March 12
Functional coverage

                       Planned




Friday, 9 March 12
Functional coverage

                        Planned




                       Done




Friday, 9 March 12
Functional coverage

                        Planned




                       Done



                       Broken




Friday, 9 March 12
Functional coverage




                         Test
                       scenarios




Friday, 9 March 12
Functional coverage




Friday, 9 March 12
Thucydides in Action   A simple real-world test




Friday, 9 March 12
Thucydides in Action   A simple real-world test




Friday, 9 March 12
Thucydides in Action




Friday, 9 March 12
Thucydides in Action




Friday, 9 March 12
Thucydides in Action




                        Groovy shortcuts to obtain
                              a page object




Friday, 9 March 12
Thucydides in Action




                        Groovy shortcuts to obtain
                              a page object




Friday, 9 March 12
Thucydides in Action




                           Groovy shortcuts to obtain
                                 a page object




                     A simple page object

Friday, 9 March 12
Thucydides in Action




Friday, 9 March 12
Thucydides in Action




Friday, 9 March 12
Thucydides in Action




Friday, 9 March 12
Thucydides in Action




                        DSL for HTML tables




Friday, 9 March 12
Thucydides in Action




Friday, 9 March 12
Thucydides in Action


                        Store field values between
                                test steps




Friday, 9 March 12
Thucydides in Action


                        Store field values between
                                test steps




Friday, 9 March 12
Thucydides in Action


                        Store field values between
                                test steps




                             ...and use them later



Friday, 9 March 12
References




Friday, 9 March 12
References
                     github.com/thucydides-webtests




Friday, 9 March 12
References
                     github.com/thucydides-webtests



                               thucydides-webtests.com




Friday, 9 March 12
References
                     github.com/thucydides-webtests



                               thucydides-webtests.com




                                    wakaleo.com/thucydides




Friday, 9 March 12
Introducing Thucydides
                      Automated Acceptance Tests, Step by step




                                                     John	
  Ferguson	
  Smart
                                      Email:	
  john.smart@wakaleo.com
                                       Web:	
  hEp://www.wakaleo.com
                                                         TwiEer:	
  wakaleo
Friday, 9 March 12

Mais conteúdo relacionado

Destaque

Destrezas BáSicas De Registro De Datos Financieros
Destrezas BáSicas De Registro De Datos FinancierosDestrezas BáSicas De Registro De Datos Financieros
Destrezas BáSicas De Registro De Datos Financieros
Carmen Maldonado
 
Demanda - MeliDevConf BsAs.
Demanda - MeliDevConf BsAs.Demanda - MeliDevConf BsAs.
Demanda - MeliDevConf BsAs.
melidevelopers
 
Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016
Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016
Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016
Search Foresight
 

Destaque (15)

handwriting recognition
handwriting recognitionhandwriting recognition
handwriting recognition
 
Ashtavakra Gita - Chapter 3 - Test of the Seeker
Ashtavakra Gita - Chapter 3 - Test of the SeekerAshtavakra Gita - Chapter 3 - Test of the Seeker
Ashtavakra Gita - Chapter 3 - Test of the Seeker
 
Recherche d'emploi et réseaux sociaux
Recherche d'emploi et réseaux sociauxRecherche d'emploi et réseaux sociaux
Recherche d'emploi et réseaux sociaux
 
Innovacio Oberta portada a la practica (UOC)
Innovacio Oberta portada a la practica (UOC)Innovacio Oberta portada a la practica (UOC)
Innovacio Oberta portada a la practica (UOC)
 
TDNN for speech recognition
TDNN for speech recognitionTDNN for speech recognition
TDNN for speech recognition
 
Fiera Presentation
Fiera   PresentationFiera   Presentation
Fiera Presentation
 
Particle swarm optimization for human face recognition
Particle swarm optimization for human face recognitionParticle swarm optimization for human face recognition
Particle swarm optimization for human face recognition
 
Tecnologia de Imagenes (OCR) y Seguridad de datos electrónicos
Tecnologia de Imagenes (OCR) y Seguridad de datos electrónicosTecnologia de Imagenes (OCR) y Seguridad de datos electrónicos
Tecnologia de Imagenes (OCR) y Seguridad de datos electrónicos
 
Destrezas BáSicas De Registro De Datos Financieros
Destrezas BáSicas De Registro De Datos FinancierosDestrezas BáSicas De Registro De Datos Financieros
Destrezas BáSicas De Registro De Datos Financieros
 
Personal Branding 2.0
Personal Branding 2.0Personal Branding 2.0
Personal Branding 2.0
 
Reconocimiento supramolecular del ADN
Reconocimiento supramolecular del ADNReconocimiento supramolecular del ADN
Reconocimiento supramolecular del ADN
 
Demanda - MeliDevConf BsAs.
Demanda - MeliDevConf BsAs.Demanda - MeliDevConf BsAs.
Demanda - MeliDevConf BsAs.
 
Les outils de l’UX pour connaître les utilisateurs - MC Casal - YOODx 2017
 Les outils de l’UX pour connaître les utilisateurs - MC Casal - YOODx 2017 Les outils de l’UX pour connaître les utilisateurs - MC Casal - YOODx 2017
Les outils de l’UX pour connaître les utilisateurs - MC Casal - YOODx 2017
 
Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016
Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016
Synodiance > Recherche Vocale - SEO Campus Paris - 07/04/2016
 
PHP UK Conference 2012: Scaling Communication via Continuous Integration
PHP UK Conference 2012: Scaling Communication via Continuous IntegrationPHP UK Conference 2012: Scaling Communication via Continuous Integration
PHP UK Conference 2012: Scaling Communication via Continuous Integration
 

Mais de John Ferguson Smart Limited

Mais de John Ferguson Smart Limited (20)

My Reading Specs - Refactoring Patterns for Gherkin Scenarios
My Reading Specs - Refactoring Patterns for Gherkin ScenariosMy Reading Specs - Refactoring Patterns for Gherkin Scenarios
My Reading Specs - Refactoring Patterns for Gherkin Scenarios
 
Artisti e Condotierri - How can your team become artists of the 21st century ...
Artisti e Condotierri - How can your team become artists of the 21st century ...Artisti e Condotierri - How can your team become artists of the 21st century ...
Artisti e Condotierri - How can your team become artists of the 21st century ...
 
Engage! Bringing teams together to deliver software that makes a difference
Engage! Bringing teams together to deliver software that makes a differenceEngage! Bringing teams together to deliver software that makes a difference
Engage! Bringing teams together to deliver software that makes a difference
 
BE A POD OF DOLPHINS, NOT A DANCING ELEPHANT
BE A POD OF DOLPHINS, NOT A DANCING ELEPHANTBE A POD OF DOLPHINS, NOT A DANCING ELEPHANT
BE A POD OF DOLPHINS, NOT A DANCING ELEPHANT
 
Sustainable Test Automation with Serenity BDD and Screenplay
Sustainable Test Automation with Serenity BDD and ScreenplaySustainable Test Automation with Serenity BDD and Screenplay
Sustainable Test Automation with Serenity BDD and Screenplay
 
Feature Mapping Workshop
Feature Mapping WorkshopFeature Mapping Workshop
Feature Mapping Workshop
 
Engage! Bringing teams together to deliver software that makes a difference
Engage! Bringing teams together to deliver software that makes a differenceEngage! Bringing teams together to deliver software that makes a difference
Engage! Bringing teams together to deliver software that makes a difference
 
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
 
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
 
Shift left-devoxx-pl
Shift left-devoxx-plShift left-devoxx-pl
Shift left-devoxx-pl
 
Screenplay - Next generation automated acceptance testing
Screenplay - Next generation automated acceptance testingScreenplay - Next generation automated acceptance testing
Screenplay - Next generation automated acceptance testing
 
Cucumber and Spock Primer
Cucumber and Spock PrimerCucumber and Spock Primer
Cucumber and Spock Primer
 
All the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practicesAll the world's a stage – the next step in automated testing practices
All the world's a stage – the next step in automated testing practices
 
CukeUp 2016 Agile Product Planning Workshop
CukeUp 2016 Agile Product Planning WorkshopCukeUp 2016 Agile Product Planning Workshop
CukeUp 2016 Agile Product Planning Workshop
 
BDD Anti-patterns
BDD Anti-patternsBDD Anti-patterns
BDD Anti-patterns
 
Serenity and the Journey Pattern
Serenity and the Journey PatternSerenity and the Journey Pattern
Serenity and the Journey Pattern
 
BDD - Collaborate like you mean it!
BDD - Collaborate like you mean it!BDD - Collaborate like you mean it!
BDD - Collaborate like you mean it!
 
BDD-Driven Microservices
BDD-Driven MicroservicesBDD-Driven Microservices
BDD-Driven Microservices
 
BDD Anti-patterns
BDD Anti-patternsBDD Anti-patterns
BDD Anti-patterns
 
It's Testing, Jim, but not as we know it - BDD for Testers
It's Testing, Jim, but not as we know it - BDD for TestersIt's Testing, Jim, but not as we know it - BDD for Testers
It's Testing, Jim, but not as we know it - BDD for Testers
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
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
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
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...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 

Introduction to-thucydides

  • 1. Introducing Thucydides Automated Acceptance Tests, Step by step John Ferguson Smart Friday, 9 March 12
  • 2. So who is this guy, anyway? Consulta nt Trainer Mentor Author Speaker Coder John Fer guson S mar t Friday, 9 March 12
  • 3. ATDD or Specification by example Friday, 9 March 12
  • 4. ATDD or Specification by example The story of your app Friday, 9 March 12
  • 6. User stories As a job seeker I want to find jobs in relevant categories So that I can find a suitable job Friday, 9 March 12
  • 7. User stories As a job seeker I want to find jobs in relevant categories So that I can find a suitable job Features/Epics Friday, 9 March 12
  • 8. User stories As a job seeker I want to find jobs in relevant categories So that I can find a suitable job Acceptance criteria ☑  The  job  seeker  can  see  available  categories  on  the  home  page ☑  The  job  seeker  can  look  for  jobs  in  a  given  category ☑  The  job  seeker  can  see  what  category  a  job  belongs  to Friday, 9 March 12
  • 9. User stories As a job seeker I want to find jobs in relevant categories So that I can find a suitable job Acceptance criteria ☑  The  job  seeker  can  see  available  categories  on  the  home  page ☑  The  job  seeker  can  look  for  jobs  in  a  given  category ☑  The  job  seeker  can  see  what  category  a  job  belongs  to scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated acceptance test Friday, 9 March 12
  • 10. scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated acceptance test Friday, 9 March 12
  • 11. scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated acceptance test Implemented development tests Friday, 9 March 12
  • 12. scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated acceptance test Implemented development tests Implemented acceptance tests Friday, 9 March 12
  • 14. Automated acceptance criteria Define your goals Friday, 9 March 12
  • 16. Automated acceptance criteria keep you on track Friday, 9 March 12
  • 18. Automated acceptance criteria Provide better visibility Friday, 9 March 12
  • 20. Automated acceptance criteria Allow faster release cycles Friday, 9 March 12
  • 22. Automated acceptance criteria Reduce Risk Friday, 9 March 12
  • 24. Automated acceptance criteria Reduce Costs Friday, 9 March 12
  • 25. Why should developers write web tests? Friday, 9 March 12
  • 26. Why should developers write web tests? Shouldn’t QA be doing that? Friday, 9 March 12
  • 27. Why only do QA at the end of the project? Friday, 9 March 12
  • 28. Real quality cannot be injected at the end Friday, 9 March 12
  • 29. Real quality cannot be injected at the end It must be part of the process Friday, 9 March 12
  • 30. Leave the boring stuff to the automated tests... Friday, 9 March 12
  • 31. ...and empower your QA team Friday, 9 March 12
  • 32. ...and empower your QA team Let testers focus on more intelligent testing Friday, 9 March 12
  • 33. Acceptance Tests The high-level view So  where   are  we  at? Friday, 9 March 12
  • 34. Low level web tests WebDriver   rocks! Focus on implementation Friday, 9 March 12
  • 35. How do we bridge the gap? Friday, 9 March 12
  • 36. How do we bridge the gap? Test steps Friday, 9 March 12
  • 37. scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated Test steps Friday, 9 March 12
  • 38. scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated scenario "The user can see the available job categories on the home page", { when "the job seeker is looking for a job", { job_seeker.open_jobs_page() } then "the job seeker can see all the available job categories", { job_seeker.should_see_job_categories "Java Developers", "Groovy Developers" } } Implemented Test steps Friday, 9 March 12
  • 39. scenario "A job seeker can see the available job categories on the home page", { when "the job seeker is looking for a job", then "the job seeker can see all the available job categories" } Automated scenario "The user can see the available job categories on the home page", { when "the job seeker is looking for a job", { job_seeker.open_jobs_page() } then "the job seeker can see all the available job categories", { job_seeker.should_see_job_categories "Java Developers", "Groovy Developers" } } Implemented JobSeekerSteps JobSeekerSteps JobSeekerSteps open_jobs_page() Test steps open_jobs_page() open_jobs_page() should_see_job_categories(String...  categories) should_see_job_categories(String...  categories) ... should_see_job_categories(String...  categories) ... ... Step libraries Friday, 9 March 12
  • 40. scenario "The user can see the available job categories on the home page", { when "the job seeker is looking for a job", { job_seeker.open_jobs_page() } then "the job seeker can see all the available job categories", { job_seeker.should_see_job_categories "Java Developers", "Groovy Developers" } } Implemented Tests JobSeekerSteps JobSeekerSteps JobSeekerSteps open_jobs_page() open_jobs_page() open_jobs_page() should_see_job_categories(String...  categories) should_see_job_categories(String...  categories) ... should_see_job_categories(String...  categories) ... ... Step libraries Test steps Friday, 9 March 12
  • 41. scenario "The user can see the available job categories on the home page", { when "the job seeker is looking for a job", { job_seeker.open_jobs_page() } then "the job seeker can see all the available job categories", { job_seeker.should_see_job_categories "Java Developers", "Groovy Developers" } } Implemented Tests JobSeekerSteps JobSeekerSteps JobSeekerSteps open_jobs_page() open_jobs_page() open_jobs_page() should_see_job_categories(String...  categories) should_see_job_categories(String...  categories) ... should_see_job_categories(String...  categories) ... ... Step libraries Test steps Page Objects Friday, 9 March 12
  • 47. Test steps help organize your tests Friday, 9 March 12
  • 49. Test steps are a communication tool Friday, 9 March 12
  • 51. Test steps are reusable building blocks Friday, 9 March 12
  • 53. Test steps help estimate progress Friday, 9 March 12
  • 54. And so we built a tool... Friday, 9 March 12
  • 57. Webdriver/Selenium 2 extension Organize tests, stories and features Friday, 9 March 12
  • 58. Webdriver/Selenium 2 extension Organize tests, stories and features Record/report test execution Friday, 9 March 12
  • 59. Webdriver/Selenium 2 extension Organize tests, stories and features Record/report test execution Measure functional coverage Friday, 9 March 12
  • 62. Thucydides in action A simple demo app Friday, 9 March 12
  • 63. Defining your acceptance tests scenario "A job seeker { can see the available j ob categori when "the j es on the h ob seeker i ome page", then "the j s looking f ob seeker c o r a j o b ", } an see all the availab le job cate gories" scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", when "the administrator adds a new category", then "the system should confirm that the category has been created", and "the new category should be visible to job seekers", } scenario "The admini strator deletes a ca { tegory from the syst em", given "a category ne eds to be deleted", when "the administra tor deletes a catego then "the system will ry", confirm that the cate and "the deleted cate gory has been delete gory should no longer d", } be visible to job se eker s", Friday, 9 March 12
  • 64. Defining your acceptance tests scenario "A job seeker { can see the available j ob categori when "the j es on the h ob seeker i ome page", then "the j s looking f ob seeker c o r a j o b ", } an see all the availab le job cate gories" scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", when "the administrator adds a new category", then "the system should confirm that the category has been created", and "the new category should be visible to job seekers", } scenario "The admini strator deletes a ca { tegory from the syst em", given "a category ne eds to be deleted", when "the administra tor deletes a catego then "the system will ry", confirm that the cate and "the deleted cate gory has been delete gory should no longer d", } be visible to job se eker s", focus on business value Friday, 9 March 12
  • 65. Defining your acceptance tests scenario "A job seeker { can see the available j ob categori when "the j es on the h ob seeker i ome page", then "the j s looking f ob seeker c o r a j o b ", } an see all the availab le job cate gories" scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", when "the administrator adds a new category", then "the system should confirm that the category has been created", and "the new category should be visible to job seekers", } { scenario "The admini strator deletes a ca tegory from the syst em", ...defined in business terms given "a category ne eds to be deleted", when "the administra tor deletes a catego then "the system will ry", confirm that the cate and "the deleted cate gory has been delete gory should no longer d", } be visible to job se eker s", focus on business value Friday, 9 March 12
  • 66. Defining your acceptance tests scenario "A job seeker { can see the available j ob categori when "the j es on the h ob seeker i ome page", then "the j s looking f ob seeker c o r a j o b ", } an see all the availab le job cate gories" High level requ irements... scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", when "the administrator adds a new category", then "the system should confirm that the category has been created", and "the new category should be visible to job seekers", } { scenario "The admini strator deletes a ca tegory from the syst em", ...defined in business terms given "a category ne eds to be deleted", when "the administra tor deletes a catego then "the system will ry", confirm that the cate and "the deleted cate gory has been delete gory should no longer d", } be visible to job se eker s", focus on business value Friday, 9 March 12
  • 67. Organizing your requirements public class Application { @Feature public class ManageCompanies { public class AddNewCompany {} public class DeleteCompany {} public class ListCompanies {} } @Feature public class ManageCategories { public class AddNewCategory {} public class ListCategories {} public class DeleteCategory {} } @Feature public class BrowseJobs { public class UserLookForJobs {} public class UserBrowsesJobTabs {} } } Friday, 9 March 12
  • 68. Organizing your requirements Features public class Application { @Feature public class ManageCompanies { public class AddNewCompany {} public class DeleteCompany {} public class ListCompanies {} } @Feature public class ManageCategories { public class AddNewCategory {} public class ListCategories {} public class DeleteCategory {} } @Feature public class BrowseJobs { public class UserLookForJobs {} public class UserBrowsesJobTabs {} } } Friday, 9 March 12
  • 69. Organizing your requirements Features public class Application { @Feature public class ManageCompanies { public class AddNewCompany {} public class DeleteCompany {} public class ListCompanies {} } @Feature public class ManageCategories { public class AddNewCategory {} public class ListCategories {} public class DeleteCategory {} } @Feature Stories public class BrowseJobs { public class UserLookForJobs {} public class UserBrowsesJobTabs {} } } Friday, 9 March 12
  • 70. Organizing your requirements Features public class Application { @Feature public class ManageCompanies { public class AddNewCompany {} public class DeleteCompany {} public class ListCompanies {} } @Feature public class ManageCategories { public class AddNewCategory {} public class ListCategories {} public class DeleteCategory {} } @Feature Stories public class BrowseJobs { public class UserLookForJobs {} public class UserBrowsesJobTabs {} } } Friday, 9 March 12
  • 71. Implementing your acceptance tests using "thucydides" thucydides.uses_steps_from AdministratorSteps thucydides.uses_steps_from JobSeekerSteps thucydides.tests_story AddNewCategory scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", { administrator.logs_in_to_admin_page_if_first_time() administrator.opens_categories_list() } when "the administrator adds a new category", { administrator.selects_add_category() administrator.adds_new_category("Scala Developers","SCALA") } then "the system should confirm that the category has been created", { administrator.should_see_confirmation_message "The Category has been created" } and "the new category should be visible to job seekers", { job_seeker.opens_jobs_page() job_seeker.should_see_job_category "Scala Developers" } } Friday, 9 March 12
  • 72. Implementing your acceptance tests using "thucydides" We are testing this story thucydides.uses_steps_from AdministratorSteps thucydides.uses_steps_from JobSeekerSteps thucydides.tests_story AddNewCategory scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", { administrator.logs_in_to_admin_page_if_first_time() administrator.opens_categories_list() } when "the administrator adds a new category", { administrator.selects_add_category() administrator.adds_new_category("Scala Developers","SCALA") } then "the system should confirm that the category has been created", { administrator.should_see_confirmation_message "The Category has been created" } and "the new category should be visible to job seekers", { job_seeker.opens_jobs_page() job_seeker.should_see_job_category "Scala Developers" } } Friday, 9 March 12
  • 73. Implementing your acceptance tests using "thucydides" We are testing this story thucydides.uses_steps_from AdministratorSteps thucydides.uses_steps_from JobSeekerSteps thucydides.tests_story AddNewCategory An acceptance criteria scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", { administrator.logs_in_to_admin_page_if_first_time() administrator.opens_categories_list() } when "the administrator adds a new category", { administrator.selects_add_category() administrator.adds_new_category("Scala Developers","SCALA") } then "the system should confirm that the category has been created", { administrator.should_see_confirmation_message "The Category has been created" } and "the new category should be visible to job seekers", { job_seeker.opens_jobs_page() job_seeker.should_see_job_category "Scala Developers" } } Friday, 9 March 12
  • 74. Implementing your acceptance tests using "thucydides" We are testing this story thucydides.uses_steps_from AdministratorSteps thucydides.uses_steps_from JobSeekerSteps thucydides.tests_story AddNewCategory An acceptance criteria scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", { Narrative style administrator.logs_in_to_admin_page_if_first_time() administrator.opens_categories_list() } when "the administrator adds a new category", { administrator.selects_add_category() administrator.adds_new_category("Scala Developers","SCALA") } then "the system should confirm that the category has been created", { administrator.should_see_confirmation_message "The Category has been created" } and "the new category should be visible to job seekers", { job_seeker.opens_jobs_page() job_seeker.should_see_job_category "Scala Developers" } } Friday, 9 March 12
  • 75. Implementing your acceptance tests using "thucydides" We are testing this story thucydides.uses_steps_from AdministratorSteps thucydides.uses_steps_from JobSeekerSteps thucydides.tests_story AddNewCategory An acceptance criteria scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", { Narrative style administrator.logs_in_to_admin_page_if_first_time() administrator.opens_categories_list() } Step through an when "the administrator adds a new category", example { administrator.selects_add_category() administrator.adds_new_category("Scala Developers","SCALA") } then "the system should confirm that the category has been created", { administrator.should_see_confirmation_message "The Category has been created" } and "the new category should be visible to job seekers", { job_seeker.opens_jobs_page() job_seeker.should_see_job_category "Scala Developers" } } Friday, 9 March 12
  • 76. Implementing your acceptance tests using "thucydides" We are testing this story thucydides.uses_steps_from AdministratorSteps thucydides.uses_steps_from JobSeekerSteps thucydides.tests_story AddNewCategory An acceptance criteria scenario "The administrator adds a new category to the system", { given "a new category needs to be added to the system", { Narrative style administrator.logs_in_to_admin_page_if_first_time() administrator.opens_categories_list() } Step through an when "the administrator adds a new category", example { administrator.selects_add_category() administrator.adds_new_category("Scala Developers","SCALA") } then "the system should confirm that the category has been created", { administrator.should_see_confirmation_message "The Category has been created" } and "the new category should be visible to job seekers", { Still high-level job_seeker.opens_jobs_page() job_seeker.should_see_job_category "Scala Developers" } } Friday, 9 March 12
  • 77. Some folks prefer JUnit... @RunWith(ThucydidesRunner.class) @Story(AddNewCategory.class) public class AddCategoryStory { @Managed public WebDriver webdriver; @ManagedPages(defaultUrl = "http://localhost:9000") public Pages pages; @Steps public AdministratorSteps administrator; @Steps public JobSeekerSteps job_seeker; @Test public void administrator_adds_a_new_category_to_the_system() { administrator.logs_in_to_admin_page_if_first_time(); administrator.opens_categories_list(); administrator.selects_add_category(); administrator.adds_new_category("Java Developers","JAVA"); administrator.should_see_confirmation_message("The Category has been created"); job_seeker.opens_job_page(); job_seeker.should_see_job_category("Java Developers"); } @Pending @Test public void administrator_adds_an_existing_category_to_the_system() {} } Friday, 9 March 12
  • 78. Some folks prefer JUnit... @RunWith(ThucydidesRunner.class) @Story(AddNewCategory.class) Thucydides handles the public class AddCategoryStory { web driver instances @Managed public WebDriver webdriver; @ManagedPages(defaultUrl = "http://localhost:9000") public Pages pages; @Steps public AdministratorSteps administrator; @Steps public JobSeekerSteps job_seeker; @Test public void administrator_adds_a_new_category_to_the_system() { administrator.logs_in_to_admin_page_if_first_time(); administrator.opens_categories_list(); administrator.selects_add_category(); administrator.adds_new_category("Java Developers","JAVA"); administrator.should_see_confirmation_message("The Category has been created"); job_seeker.opens_job_page(); job_seeker.should_see_job_category("Java Developers"); } @Pending @Test public void administrator_adds_an_existing_category_to_the_system() {} } Friday, 9 March 12
  • 79. Some folks prefer JUnit... @RunWith(ThucydidesRunner.class) @Story(AddNewCategory.class) Thucydides handles the public class AddCategoryStory { web driver instances @Managed public WebDriver webdriver; @ManagedPages(defaultUrl = "http://localhost:9000") public Pages pages; @Steps public AdministratorSteps administrator; @Steps Using the same steps public JobSeekerSteps job_seeker; @Test public void administrator_adds_a_new_category_to_the_system() { administrator.logs_in_to_admin_page_if_first_time(); administrator.opens_categories_list(); administrator.selects_add_category(); administrator.adds_new_category("Java Developers","JAVA"); administrator.should_see_confirmation_message("The Category has been created"); job_seeker.opens_job_page(); job_seeker.should_see_job_category("Java Developers"); } @Pending @Test public void administrator_adds_an_existing_category_to_the_system() {} } Friday, 9 March 12
  • 80. Some folks prefer JUnit... @RunWith(ThucydidesRunner.class) @Story(AddNewCategory.class) Thucydides handles the public class AddCategoryStory { web driver instances @Managed public WebDriver webdriver; @ManagedPages(defaultUrl = "http://localhost:9000") public Pages pages; @Steps public AdministratorSteps administrator; @Steps Using the same steps public JobSeekerSteps job_seeker; @Test public void administrator_adds_a_new_category_to_the_system() { administrator.logs_in_to_admin_page_if_first_time(); administrator.opens_categories_list(); administrator.selects_add_category(); administrator.adds_new_category("Java Developers","JAVA"); administrator.should_see_confirmation_message("The Category has been created"); job_seeker.opens_job_page(); job_seeker.should_see_job_category("Java Developers"); } Tests can be pending @Pending @Test public void administrator_adds_an_existing_category_to_the_system() {} } Friday, 9 March 12
  • 81. Defining your test steps public class AdministratorSteps extends ScenarioSteps { @Step public void opens_categories_list() { AdminHomePage page = getPages().get(AdminHomePage.class); page.open(); page.selectObjectType("Categories"); } @Step public void selects_add_category() { CategoriesPage categoriesPage = getPages().get(CategoriesPage.class); categoriesPage.selectAddCategory(); } @Step public void adds_new_category(String label, String code) { EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class); newCategoryPage.saveNewCategory(label, code); } @Step public void should_see_confirmation_message(String message) { AdminPage page = getPages().get(AdminPage.class); page.shouldContainConfirmationMessage(message); } @Step public void deletes_category(String name) { opens_categories_list(); displays_category_details_for(name); deletes_category(); } } Friday, 9 March 12
  • 82. Defining your test steps public class AdministratorSteps extends ScenarioSteps { A step library @Step public void opens_categories_list() { AdminHomePage page = getPages().get(AdminHomePage.class); page.open(); page.selectObjectType("Categories"); } @Step public void selects_add_category() { CategoriesPage categoriesPage = getPages().get(CategoriesPage.class); categoriesPage.selectAddCategory(); } @Step public void adds_new_category(String label, String code) { EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class); newCategoryPage.saveNewCategory(label, code); } @Step public void should_see_confirmation_message(String message) { AdminPage page = getPages().get(AdminPage.class); page.shouldContainConfirmationMessage(message); } @Step public void deletes_category(String name) { opens_categories_list(); displays_category_details_for(name); deletes_category(); } } Friday, 9 March 12
  • 83. Defining your test steps public class AdministratorSteps extends ScenarioSteps { A step library @Step public void opens_categories_list() { AdminHomePage page = getPages().get(AdminHomePage.class); page.open(); page.selectObjectType("Categories"); } High level steps... @Step public void selects_add_category() { CategoriesPage categoriesPage = getPages().get(CategoriesPage.class); categoriesPage.selectAddCategory(); } @Step public void adds_new_category(String label, String code) { EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class); newCategoryPage.saveNewCategory(label, code); } @Step public void should_see_confirmation_message(String message) { AdminPage page = getPages().get(AdminPage.class); page.shouldContainConfirmationMessage(message); } @Step public void deletes_category(String name) { opens_categories_list(); displays_category_details_for(name); deletes_category(); } } Friday, 9 March 12
  • 84. Defining your test steps public class AdministratorSteps extends ScenarioSteps { A step library @Step public void opens_categories_list() { AdminHomePage page = getPages().get(AdminHomePage.class); page.open(); page.selectObjectType("Categories"); } High level steps... @Step public void selects_add_category() { CategoriesPage categoriesPage = getPages().get(CategoriesPage.class); categoriesPage.selectAddCategory(); } @Step public void adds_new_category(String label, String code) { EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class); newCategoryPage.saveNewCategory(label, code); } ...implemented @Step public void should_see_confirmation_message(String message) { with Page Objects AdminPage page = getPages().get(AdminPage.class); page.shouldContainConfirmationMessage(message); } @Step public void deletes_category(String name) { opens_categories_list(); displays_category_details_for(name); deletes_category(); } } Friday, 9 March 12
  • 85. Defining your test steps public class AdministratorSteps extends ScenarioSteps { A step library @Step public void opens_categories_list() { AdminHomePage page = getPages().get(AdminHomePage.class); page.open(); page.selectObjectType("Categories"); } High level steps... @Step public void selects_add_category() { CategoriesPage categoriesPage = getPages().get(CategoriesPage.class); categoriesPage.selectAddCategory(); } @Step public void adds_new_category(String label, String code) { EditCategoryPage newCategoryPage = getPages().get(EditCategoryPage.class); newCategoryPage.saveNewCategory(label, code); } ...implemented @Step public void should_see_confirmation_message(String message) { with Page Objects AdminPage page = getPages().get(AdminPage.class); page.shouldContainConfirmationMessage(message); } @Step ...or with other steps public void deletes_category(String name) { opens_categories_list(); displays_category_details_for(name); deletes_category(); } } Friday, 9 March 12
  • 86. Defining your page objects public class EditCategoryPage extends PageObject { @FindBy(id="object_label") WebElement label; @FindBy(id="object_code") WebElement code; @FindBy(name="_save") WebElement saveButton; public EditCategoryPage(WebDriver driver) { super(driver); } public void saveNewCategory(String labelValue, String codeValue) { typeInto(label, labelValue); typeInto(code, codeValue); saveButton.click(); } } Friday, 9 March 12
  • 87. Defining your page objects public class EditCategoryPage extends PageObject { @FindBy(id="object_label") WebElement label; Provides some useful @FindBy(id="object_code") utility methods... WebElement code; @FindBy(name="_save") WebElement saveButton; public EditCategoryPage(WebDriver driver) { super(driver); } public void saveNewCategory(String labelValue, String codeValue) { typeInto(label, labelValue); typeInto(code, codeValue); saveButton.click(); } } Friday, 9 March 12
  • 88. Defining your page objects public class EditCategoryPage extends PageObject { @FindBy(id="object_label") WebElement label; Provides some useful @FindBy(id="object_code") utility methods... WebElement code; @FindBy(name="_save") WebElement saveButton; public EditCategoryPage(WebDriver driver) { super(driver); } public void saveNewCategory(String labelValue, String codeValue) { typeInto(label, labelValue); typeInto(code, codeValue); saveButton.click(); } } but otherwise a normal WebDriver Page Object Friday, 9 March 12
  • 89. Then we run the tests... Friday, 9 March 12
  • 92. Thucydides reports Browse the features Friday, 9 March 12
  • 95. Browse the stories Browse the stories Friday, 9 March 12
  • 97. Browse the stories Browse the test scenarios Friday, 9 March 12
  • 98. Browse the stories Browse the test scenarios Friday, 9 March 12
  • 99. Illustrating the test paths A test scenario Steps Test scenarios Friday, 9 March 12
  • 101. Illustrating the test paths Screenshots Friday, 9 March 12
  • 102. Functional coverage Features Friday, 9 March 12
  • 103. Functional coverage User stories Friday, 9 March 12
  • 105. Functional coverage Passing tests Friday, 9 March 12
  • 106. Functional coverage Passing tests Failing tests Friday, 9 March 12
  • 107. Functional coverage Passing tests Pending tests Failing tests Friday, 9 March 12
  • 109. Functional coverage Planned Friday, 9 March 12
  • 110. Functional coverage Planned Done Friday, 9 March 12
  • 111. Functional coverage Planned Done Broken Friday, 9 March 12
  • 112. Functional coverage Test scenarios Friday, 9 March 12
  • 114. Thucydides in Action A simple real-world test Friday, 9 March 12
  • 115. Thucydides in Action A simple real-world test Friday, 9 March 12
  • 118. Thucydides in Action Groovy shortcuts to obtain a page object Friday, 9 March 12
  • 119. Thucydides in Action Groovy shortcuts to obtain a page object Friday, 9 March 12
  • 120. Thucydides in Action Groovy shortcuts to obtain a page object A simple page object Friday, 9 March 12
  • 124. Thucydides in Action DSL for HTML tables Friday, 9 March 12
  • 126. Thucydides in Action Store field values between test steps Friday, 9 March 12
  • 127. Thucydides in Action Store field values between test steps Friday, 9 March 12
  • 128. Thucydides in Action Store field values between test steps ...and use them later Friday, 9 March 12
  • 130. References github.com/thucydides-webtests Friday, 9 March 12
  • 131. References github.com/thucydides-webtests thucydides-webtests.com Friday, 9 March 12
  • 132. References github.com/thucydides-webtests thucydides-webtests.com wakaleo.com/thucydides Friday, 9 March 12
  • 133. Introducing Thucydides Automated Acceptance Tests, Step by step John  Ferguson  Smart Email:  john.smart@wakaleo.com Web:  hEp://www.wakaleo.com TwiEer:  wakaleo Friday, 9 March 12