Difference between revisions of "Testing/Behat Testing/Steps"

From Mahara Wiki
Jump to navigation Jump to search
(Mahara menu navigation)
(Mahara menu navigation)
Line 79: Line 79:
 
   Given I choose "Main menu item" from main menu
 
   Given I choose "Main menu item" from main menu
 
   Given I choose "Admin menu item" from administration menu
 
   Given I choose "Admin menu item" from administration menu
 +
  Given I choose "User menu item" from user menu
 
   Given I choose "User menu item" from user menu by id
 
   Given I choose "User menu item" from user menu by id
  

Revision as of 12:47, 27 November 2017


Use these steps to create Behat tests
Copy and paste the steps in the order your need into a text editor (ie gedit or vim) to create your tests.

Note: Replace the "And" with "Given, When, Then" where necessary. Replace Selectors and Elements with one from the list of Selectors and Elements

The fastest way to write test is using parts of previous tests. In the terminal type the following command to search through all the feature files for what you are looking for:

 grep --color=auto -RniP -C 3 --include *.feature '(given|when|then|and).*delete.*activity' *

Replace delete and activity with the words that you specifically need

To see the list of current tests from your Mahara directory

grep -RiPoh 'Scenario:(\s+)\K(.*)$' test/

There are test steps provided with Behat in the MinkContext.php file and other customs steps written for Mahara. For a quick and dirty way to create a file with an up to date list of all the steps available, run the following three lines of code:

egrep -r '@(Given|When|Then)' ~/code/mahara/external/vendor/behat/mink-extension/src/Behat/MinkExtension/Context/MinkContext.php > behat_steps.txt
egrep -rh '@(Given|When|Then)' ~/code/mahara/htdocs/testing/frameworks/behat/classes >> behat_steps.txt
perl -i -pe "s/[?\"\'\*\(\)\[\]^\\]\|\\\\]//g" behat_steps.txt

This creates a file called behat_steps.txt in your current directory which contains the list. It will confirm for you that a step exists in the code. Variables in the step are indicated by P<> or :. You can ignore / and /$ at the beginnings and ends of lines. There is often specific information about how to use the steps in the code comments. If you don't feel comfortable trawling through the code yourself, chat to a developer about updating this page with examples of the steps.

Backgrounds/ Way to create heaps of users, groups, institutions:

Given the following "users" exist:
     | username | password | email | firstname | lastname | institution | authname | role |
     | userA | Kupuhipa1 | [email protected] | Pete | Mc | mahara | internal | member |


Given the following "groups" exist:
     | name | owner | description | grouptype | open | invitefriends | editroles | submittableto | allowarchives | members | staff |
     | group 01 | userA | This is group 01 | standard | ON | ON | all | ON | ON | userB, userC | userD |


Given the following "institutions" exist:
     | name | displayname | registerallowed | registerconfirm |
     | instone | Institution One | ON | OFF |
     | insttwo | Institution Two | ON | OFF |

Create heaps of empty pages for users

Given the following "pages" exist:
     | title | description| ownertype | ownername |
     | D's Page 01 | UserD's page 01 | user | userD |
     | D's Page 02 | UserD's page 02 | user | userD |
     | A's Page 01 | UserA's page 01 | user | userA |
     | B's Page 02 | UserB's page 02 | user | userB |

Create heaps of empty pages for groups, institutions, and site

Given the following "pages" exist:
     | title | description| ownertype | ownername |
     | Site Page 01 | This is the page 01 of the site | institution | mahara |
     | Institution Page 01 | This is the page 01 of the Institution One| institution | instone |
     | Group Page 01 | This is the page 01 of the group 01 | group | group 01 |

Create heaps of collections for users, groups, institutions, and site

Given the following "collections" exist:
     | title | description| ownertype | ownername | pages |
     | User Col 01 | My collection 01 | user | userA | A's Page 01, A's Page 03 |
     | Group Col 02 | Group collection 02 | group | group 01 | Group Page 01, Group Page 02 |

Logging In

Logs you in as Admin for testing purpose

 Given I log in as "userA" with password "Kupuhipa1"



Note: The users will be given an automatic PW of Kupuhipa1 and the email account will be [email protected]
If you want to set a user up with aditional admin permissions you have to do that manually.

Mahara menu navigation

Choose a main menu item:

 Given I choose "Main menu item" from main menu
 Given I choose "Admin menu item" from administration menu
 Given I choose "User menu item" from user menu
 Given I choose "User menu item" from user menu by id

E.g:
And I choose "Admin home" from administration menu

Choose a sub menu in a main menu item:

 When I choose "Sub-menu item" in "Main menu item" from main menu
 When I choose "Sub-menu item" in "Admin menu item" from administration menu
 When I choose "Sub-menu item" in "User menu item" from user menu

E.g:
And I choose "Settings" in "Setting" from user menu

And I choose "Pages and collections" in "Portfolio" from main menu

Mahara pages and blocks

Open the configuration of a block

 And I configure the block "Block title"

Delete a block

 And I delete the block "Block title"

Opening/Loading/Closing Pages

Checks, that current page PATH is equal to specified. eg; And I should be on "Profile" would be written as; And I should be on "artefact/internal/index.php"

 And I should be on "page path"


Opens user profile.

 And I am on user profile


Opens homepage.

 And I go to the homepage
 And I am on homepage

Checks, that current page is the homepage.

 And I should be on the homepage

Reloads the current page.

 And I reload the page

Waits until the page is completely loaded. This step is auto-executed after every step.

 And I wait until the page is ready
    

Take you to a specific page using the relative path:

 And I am on "page"
 And I go to "page"

Example: When I go to "admin/site/options.php" //opens the admin settings for your site.

Opens named Group page

 And I go to group "name"

Moves backward one page in history.

 And I move backward one page

Moves forward one page in history

 And I move forward one page
   

Checks, that current page response status is equal to specified.

 And the response status code should be 404
   
   

Checks, that current page response status is not equal to specified.

 And the response status code should not be 404

Switching Frames/Windows

Switches to the specified iframe.

 And I switch to "$iframename" iframe


Switches to the main Mahara frame.

 And I switch to the main frame


Switches to the specified window. Useful when interacting with popup windows.

 And I switch to “windowname” windows


Switches to the main Mahara window. Useful when you finish interacting with popup windows.

 And I switch to the main window

Actions Requiring Waiting

Waits X seconds. Required after an action that requires data from an AJAX request.

 And I wait "$numberofseconds" seconds


Waits until the provided element selector exists in the DOM

 And I wait until "$element" "$selector" exists


Waits until the provided element does not exist in the DOM

 And I wait until "element_string" "selector_string" does not exist


Click Actions

Click on the link or button inside a list/table row containing the specified text.

 And I click on "link or button" in "row_text_string" row

Click on the delete button inside a list/table row containing the specified text.

 And I delete the "text string" row

@Given I drag "element_string" "selector1_string" and I drop it in "container_element_string" "selector2_string"


Generic mouse over action. Mouse over a element of the specified type.

 And I hover "$element" "$selector"

Click on the element of the specified type which is located inside the second element.

 And I click on "$element" "$selector" 

Click on the button or link which is located inside the second element.

 And I click on "link or button" in the "$element" "$selector" 


Follow the link which is located inside the second element.

 And I follow "link" in the "$element" "$selector"

Click on the specified element inside a table row containing the specified text.

 And I click on "$element" "$selector" in the table row

Clicks link with specified id|title|alt|text.

 And I follow "id|title|alt|text"
E.g. To click the 'Edit dashboard' button on the homepage, use:
And I follow "Edit dashboard"

Expanding the blocks when adding content to a page eg And I expand "General" node

 And I expand "text" node

Presses button with specified id|name|title|alt|value.

 And I press "BUTTON_STRING"

Press the button which is located inside the second element.

 And I press "button" in the "$element" "$selector"

Steps that use css or xpath elements directly have been replaced in Mahara by steps using a property

And I press "Show" in the "annotation" property

Drags and drops the specified element to the specified container. This step does not work in all the browsers, consider it experimental.

 And I drag "$element" "$selector" and I drop it in "$containerelement" ”$selector"

Filling in Forms

Selects option in select field with specified id|name|label|value.

 And I select "option" from "select"

Selects additional option in select field with specified id|name|label|value.

 And I additionally select "option" from "select"

Checks checkbox with specified id|name|label|value.

 And I check "option"

Unchecks checkbox with specified id|name|label|value.

 And I uncheck "option"

Checks, that form field with specified id|name|label|value has specified value.

 And the "field" field should contain "value"

Checks, that form field with specified id|name|label|value doesn't have specified value.

 And the "field" field should not contain "value"

Checks, that checkbox with specified in|name|label|value is checked.

 And the "checkbox" checkbox should be checked

Checks, that checkbox with specified in|name|label|value is checked.

 And the checkbox "checkbox" is|should be checked

Checks, that checkbox with specified in|name|label|value is unchecked.

 And the "checkbox" checkbox should not be checked

Checks, that checkbox with specified in|name|label|value is unchecked.

 And the checkbox "checkbox" should be unchecked|not be checked

Checks, that checkbox with specified in|name|label|value is unchecked.

 And the checkbox "checkbox" is unchecked|not checked)

Attaches file to field with specified id|name|label|value. eg; "Mahara Testing notes.odt.tar.gz" to "Upload file"

 And I attach the file "File name" to "Field"

Fills a form with field/value data. This step will work for HTML editor

 And I set the following fields to these values:
   | Field name | Field value |    

Sets the specified value to the field. This step will work for HTML editor

 And I set the field "field_string" to "field_value_string"
  • The following step isn't found in the code

Sets the specified value to the field with xpath.

 And I set the field with xpath "fieldxpath_string" to "field_value_string"

Checks, the field matches the value.

 And the field "field_string" matches value "field_value_string"

Checks, the field does not match the value.

 And the field "field_string" does not match value "field_value_string"

Checks, the provided field/value matches.

 And the following fields match these values:

Checks that the provided field/value pairs don't match.

 And the following fields do not match these values:

Checks, that given select box contains the specified option.

 And the "select_string" select box should contain "option_string"

Checks, that given select box contains the specified option.

 And the "select_string" select box should not contain "option_string"

TinyMCE

Our WYSIWYG rich text editor, TinyMCE, behaves a bit strangely, so it requires its own special behat step to fill in a TinyMCE rich text field. You must identify the editor by the ID of the iframe that TinyMCE generates.

 And I fill in text "Testing 123" in WYSIWYG editor "add_feedback_from_form_message_ifr"

Or you can leave out the iframe name, and Behat will find and use the first TinyMCE editor on the page. (This is useful when the TinyMCE editor's ID is assigned dynamically.)

And I fill in text "Testing 123" in WYSIWYG editor

Checking For Specfic Visible Elements

Checks, that (?P<num>\d+) CSS elements exist on the page

 And I should see (?P<num>\d+) "element" elements

Checks, that the specified element is visible. Only available in tests using Javascript.

 And I should see the element "element" "selectortype"
  

Checks, that field with specified identifier exists on page.

 And I should see the field "field"
     

Checks, that current page PATH matches regular expression.

 And the url should match "pattern" 
   

Prints current URL to console.

 And print current URL
   

Checks, that the specified element is visible. Only available in tests using Javascript.

 And "$elements" "$selector" should be visible
    
 And "$element" "$selector" should not be visible


Checks, that the specified element is visible inside the specified container. Only available in tests using Javascript.

 And "$element" "$selector" in the "$elementcontainer" "$selector" should be visible     


Checks, that the specified element is not visible inside the specified container. Only available in tests using Javascript.

 And "$element" "$selector" in the "$elementcontainer" "$textselector" should not be visible
         

Checks, that page contains specified text. It also checks if the text is visible when running Javascript tests.

 And I should see "$text"
    

Checks, that page doesn't contain specified text. When running Javascript tests it also considers that texts may be hidden.

 And I should not see "$text"


Checks, that the specified element contains the specified text. When running Javascript tests it also considers that texts may be hidden.

 And I should see "$text" in the "$element" “$sector”

Checks, that the specified element does not contain the specified text. When running Javascript tests it also considers that texts may be hidden.

 And I should not see "$text" in the “$element" "$selector”


Checks, that the first specified element appears before the second one.

 And "$element" "$selector" should appear before "$element" "$selector"
    


Checks, that the first specified element appears after the second one.

 And "$element" "selector" should appear after $"element"  $"selector"


Checks, that the first specified element appears after the second one.

 And "following_element_string" "selector1_string" should appear after "preceding_element_string" "selector2_string"
   

Checks, that element of specified type is disabled.

 And the "$element" "$selector" should be disabled
    

Checks, that element of specified type is enabled.

 And the "$element" "$selector" should be enabled
    

Checks the provided element and selector type are readonly on the current page.

 And the "$element" "$selector" should be readonly

Checks the provided element and selector type exists in the current page. -This step is for advanced users, use it if you don't find anything else suitable for what you need.

 And "$element" "$selector" should exists

Checks that the provided element and selector type not exists in the current page. -This step is for advanced users, use it if you don't find anything else suitable for what you need.

 And "$element" "$selector" should not exists


Checks that an element and selector type exists in another element and selector type on the current page. -This step is for advanced users, use it if you don't find anything else suitable for what you need.

 And "$element" "$selector" should exist in the "$element" "$selector"


Checks, that page contains text matching specified pattern.

 And I should see text matching "pattern"

Checks, that page doesn't contain text matching specified pattern.

 And I should not see text matching "pattern"
   
   

Checks, that HTML response contains specified string.

 And the response should contain "text"


Checks, that HTML response doesn't contain specified string.

 And the response should not contain "text"
   

Checks, that element with specified CSS contains specified text.

 And I should see "text" in the "element" element


Checks, that element with specified CSS doesn't contain specified text.

 And I should not see "text" in the "element" element


Checks, that element with specified CSS contains specified HTML.

 And the "element" element should contain "value"
   


Checks, that element with specified CSS doesn't contain specified HTML.

 And the "element" element should not contain "value"


Checks, that element with specified CSS exists on page.

 And I should see an "element" element
   

Checks, that element with specified CSS doesn't exist on page.

 And I should not see an "element" element

Printing/Display

Prints last response to console.

 And print last response

Prints current URL to console.

 And print current URL

Debugging Tests

Pauses the test and waits for you to manually press the enter key. NB: Don't commit this step!!

 And I insert breakpoint

Prints a line of your choosing to the console so you can confirm the test is reaching that point

 And I echo the line "text"


Ungrouped Steps

Opens last response content in browser.

 And show last response
   

Internal step definition to find exceptions, debugging() messages and PHP debug messages.

 And I look for exceptions


Follows the page redirection. Use this step after any action that shows a message and waits for a redirection

 And I wait to be redirected
    

Accepts the currently displayed alert dialog. This step does not work in all the browsers, consider it experimental.

 And I accept the currently displayed dialog


This step triggers cron like a user would do going to admin/cron.php.

 And I trigger cron