1 / 20

Putting Cucumber to Use

Putting Cucumber to Use. Titus Fortner HomeAway 5 June 2013. Answers. What exactly is a tool like Cucumber? Is it something I should use? What does it look like in practice? Why did I go out of my way to spend an hour listening to this?. It isn’t Magic.

janina
Download Presentation

Putting Cucumber to Use

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Putting Cucumber to Use Titus Fortner HomeAway 5 June 2013

  2. Answers • What exactly is a tool like Cucumber? • Is it something I should use? • What does it look like in practice? • Why did I go out of my way to spend an hour listening to this?

  3. It isn’t Magic (Your boss will not all of a sudden be able to write all of your automated tests)

  4. Just an Abstraction Layer • Given – Do all of the setting up • When – Take the action under test • Then – Verify results Match the natural language strings with regex With a line of code that you want to run The line of code can be anything you want; it doesn’t have to be for a functional test

  5. For Instance Current Code user = owner_multiple_properties get_page(login).login(user) Cucumber feature Given I am logged in as an owner with multiple properties Cucumber step Given /^I am logged in as an owner(?: with )?(multiple properties|a single property)?/ do |which_owner| user = create_owner(which_owner) get_page(login).login(user)

  6. Gherkin Abstraction Tools Cucumber uses Ruby with RSpec matchers Options are available in all languages Cucumber, Lettuce, Robot Framework, JBehave

  7. Cucumber != BDD / ATDD These tools are often called BDD or ATDD tools • Behavior Driven Development • Acceptance Test Driven Development (I hate that) Natural language abstraction is useful for many other things… Regression Tests, Smoke Tests, “Living Documentation,” etc

  8. Use vs Don’t Use • Cucumber is useful • Interface to interact with non-developers • Business? Management? Manual testers? • Distinguish Page Object unit tests (You are writing unit tests for your page objects, right?) from functional tests • Helps focus tests – more on this later… • Cucumber is not useful • Small set of tests • Too much overhead • Only developers will look at the tests

  9. The Problem at HomeAway • HomeAway site and features are complicated • Dozens of services • Dozens of brands with one-off features • Constantly adding new features • My Project is the Owner Dashboard • Slowly rolling it out by brand • 5 when I started • 8 now • All the manual testers were testing the entire site; One day for each brand. (That doesn’t scale)

  10. Our Approach • Updated project to Webdriver (because) • Hundreds of Test Cases, many written in cucumber format already by business analysts • Re-wrote these with an automation mindset • Build a vocabulary • Use conventions • Move from manual thought process to automated (One action per test)

  11. My conventions Given I am logging to Test Case TC37300 And I am logged in as an owner with one property And I am viewing recent activity for an active property listing When I follow View Calendar link Then I should see the current year calendar displayed

  12. Spot the Issues • Given I am an HAO User viewing the login page • And I am able to log in • When I type “mike” in the user name field • And I type “test” in the password field • And I click the submit button • Then I should see a welcome popup • When I cancel welcome popup • Then I should see my property information • And I should see my user name • And The header should say “This is your Property!” • And I should see my reviews summary links

  13. Imperative vs Declarative What does the consumers of your test care about? -- Mike’s password? -- How we welcome a user? -- The content on the page? -- The exact text of the header? These are the most brittle kinds of tests If this is in your Continuous Integration and your build fails as a result of one of these, are you going to roll it back and fix it? Insist on a high bar for what gets automation

  14. Scenario: Log in • Given I am an Owner • And I am viewing the Login Page • When I log in with good credentials • Then I should be logged in • And I should see a welcome message

  15. Scenario: Cancel the welcome message • Given I am an Owner • And I have logged in • When I cancel the welcome message • Then I should see the Home Page

  16. Steps Issues Given /^I am an? (.*)user (.*) the (.*) (modal|page)$/ do |a,b,c| Matches things like: “I am an awesome user automating the nifty modal that does amazing things”

  17. Scenario: Form Submission Given I am logged in as an owner with multiple properties And I am viewing <item_type> list page When I submit <item_type> Then I should see a success message Examples: |item_type| |a reservation| |an inquiry| |a review|

  18. Cucumber Steps Given /^I am logged in as an owner(?: with )?(multiple properties|a single property)?/ do |which_owner| user = which_owner.tr(‘ ‘,’_’) get_page(login).login(user) Given /^I am viewing an? (reservation|inquiry|review) list page$/ do |page_type| @action_page = “#{page_type} list” get_page(@action_page) /^When I submit an? (reservation|inquiry|review)$/ do |submit_type| @result_page = @action_page.send(“submit_#{submit_type}”) /^Then I should see an? (success|error) message$/ do |message_type| @result_page.send(“is_#{message_type}_displayed?”).should be_true

  19. Considerations • Don’t nest steps! • Abstract in your PageObjects • It is ok to duplicate the PageObject call, the implementation of the PageObject method can change, which object and the method name “shouldn’t” • Be careful with complicated Regex • Just because you can make it work, doesn’t mean you should • Adapt methods to your test language, not the other way around

  20. Cuke Approach Improves Testing • Helps enforce the idea that the test language should never change unless the business logic changes • Feature language informs the method names  more understandable • Matching vocabulary between page objects • Breaks the focus into concrete chunks (easier to muddle things in Rspec/xUnit type tests • Each chunk is ideally one line to let the Page Object do all the work • Really helps distingush the ‘What’ from the ‘How’

More Related