QA/Execution/Web Testing/Docs/Automation/StyleGuide: Difference between revisions
< QA | Execution | Web Testing | Docs/Automation
Jump to navigation
Jump to search
No edit summary |
|||
| Line 1: | Line 1: | ||
The goal of the style guide is to try provide rules to write code that looks the same no matter what project. It is a guide and is always up for discussion by the team. I have created [https://github.com/AutomatedTester/mozwebqa-test-templates templates] based on the details below. | The goal of the style guide is to try provide rules to write code that looks the same no matter what project. It is a guide and is always up for discussion by the team. I have created [https://github.com/AutomatedTester/mozwebqa-test-templates templates] based on the details below. | ||
=All Files= | = All Files = | ||
== File Headers == | |||
* At the top of each file should have python file header | |||
<pre class="brush:py;toolbar:false;"> | <pre class="brush:py;toolbar:false;"> | ||
#!/usr/bin/env python | #!/usr/bin/env python | ||
</pre> | </pre> | ||
* Each file should have a completed copy of the [http://www.mozilla.org/MPL/boilerplate-1.1/mpl-tri-license-sh MPL] | |||
*Each file should have a completed copy of the [http://www.mozilla.org/MPL/boilerplate-1.1/mpl-tri-license-sh MPL] | * Each file should pass [http://www.python.org/dev/peps/pep-0008/ PEP8] except for line length, see below. | ||
*Each file should pass [http://www.python.org/dev/peps/pep-0008/ PEP8] except for line length, see below. | |||
** I.e. parameters should have a comma and a space e.g. | ** I.e. parameters should have a comma and a space e.g. | ||
<pre class="brush:py;toolbar:false;"> | <pre class="brush:py;toolbar:false;"> | ||
# Good | # Good | ||
| Line 22: | Line 18: | ||
def method(self,parameter) | def method(self,parameter) | ||
</pre> | </pre> | ||
** Lines should try not to have more than 100 characters. | |||
**Lines should try not to have more than 100 characters. | ** Indenting should be a soft tab (4 spaces) as common with in Python. Do not mix tabs and spaces! | ||
**Indenting should be a soft tab(4 spaces) as common with in Python. Do not mix tabs and spaces | ** There should be no whitespace at the end of the file (as per PEP8) | ||
**There should be no whitespace at the end of the file(as per PEP8) | ** Comments should be on the line above. Remember to update comments when changing code so that code matches the comments. | ||
**Comments should be on the line above. Remember to update comments when changing code so that code matches the comments. | ** Class names should be in Pascal style as this is Python idiomatic. | ||
**Class names should be in Pascal style as this is Python idiomatic | |||
<pre class="brush:py;toolbar:false;"> | <pre class="brush:py;toolbar:false;"> | ||
# Good | # Good | ||
| Line 37: | Line 31: | ||
</pre> | </pre> | ||
== | = Page Objects = | ||
* All Page Objects should inherit from Page in page.py | == General == | ||
* Page Objects should not do asserts. This should be done within the test | * All Page Objects should inherit from Page in page.py. | ||
* Each Page should be grouped within one module | * Page Objects should not do asserts. This should be done within the test. | ||
* Each Page should be grouped within one module. | |||
* If using mutliple words to describe a module separate them with underscores '_' | * If using mutliple words to describe a module separate them with underscores '_' | ||
test_search.py | test_search.py | ||
* Timeout time should be taken from | * Timeout time should be taken from pytest-mozwebqa via page.py's timeout property. | ||
** Locator variables should be prefixed with _ to show that it is "[http://docs.python.org/tutorial/classes.html#private-variables private]" | == Locators == | ||
** Variables should be descriptive of the area and not clash with any properties | ** Locator variables should be prefixed with _ to show that it is "[http://docs.python.org/tutorial/classes.html#private-variables private]". | ||
** Suffix of _locator | ** Variables should be descriptive of the area and not clash with any properties. | ||
** Suffix of _locator. | |||
** Accessing Locators should be done through a property method as this keeps the locator as readonly. | ** Accessing Locators should be done through a property method as this keeps the locator as readonly. | ||
<pre class="brush:py;toolbar:false;"> | <pre class="brush:py;toolbar:false;"> | ||
| Line 61: | Line 56: | ||
return self.selenium.get_title() | return self.selenium.get_title() | ||
</pre> | </pre> | ||
* | * We should use locators in the following order of preference (there will be exceptions): | ||
** Methods that perform actions on the page should indicate the action in the method name | ** ID | ||
** Name | |||
** CSS | |||
** XPath | |||
* Locators should include the strategy instead of using implied strategies. | |||
<pre class="brush:py;toolbar:false;"> | |||
# Good | |||
_my_locator = "id=content" | |||
# Bad | |||
_my_locator = "content" | |||
</pre> | |||
* CSS locators should use whitespace for readability when using direct descendants. | |||
<pre class="brush:py;toolbar:false;"> | |||
# Good | |||
_my_locator = "css=#content > p > a" | |||
# Bad | |||
_my_locator = "css=#content>p>a" | |||
</pre> | |||
== Actions == | |||
* Methods that perform actions on the page should indicate the action in the method name. | |||
<pre class="brush:py;toolbar:false;"> | <pre class="brush:py;toolbar:false;"> | ||
# Good | # Good | ||
| Line 71: | Line 88: | ||
</pre> | </pre> | ||
= | = Tests = | ||
* Module names should be called test_ and then | * Module names should be called test_ and then behavioral areas. | ||
* Test | test_search_positive.py | ||
* Test | * Test method signature should include mozwebqa to use pytest-mozwebqa plugin. | ||
<pre class="brush:py;toolbar:false;"> | |||
def test_example(self, mozwebqa): | |||
</pre> | |||
* Test method names should always show the intent of the test case. | |||
<pre class="brush:py;toolbar:false;"> | <pre class="brush:py;toolbar:false;"> | ||
# Good | # Good | ||
def | def test_that_advanced_search_does_not_find_item(self, mozwebqa): | ||
# Bad | # Bad | ||
def test_advanced_search(self): | def test_advanced_search(self, mozwebqa): | ||
</pre> | </pre> | ||
* Tests should handle the asserts not the | * Tests should handle the asserts -- not the page objects. | ||
To make sure that we can review your patch as quickly and efficiently as possibly we would like patches to have 1 test in them and the necessary changes to the Page Objects. This also limits the chances of merge conflicts | = Size of patches = | ||
To make sure that we can review your patch as quickly and efficiently as possibly we would like patches to have 1 test in them and the necessary changes to the Page Objects. This also limits the chances of merge conflicts later. | |||
Revision as of 16:33, 29 September 2011
The goal of the style guide is to try provide rules to write code that looks the same no matter what project. It is a guide and is always up for discussion by the team. I have created templates based on the details below.
All Files
File Headers
- At the top of each file should have python file header
#!/usr/bin/env python
- Each file should have a completed copy of the MPL
- Each file should pass PEP8 except for line length, see below.
- I.e. parameters should have a comma and a space e.g.
# Good
def method(self, parameter)
# Bad
def method(self,parameter)
- Lines should try not to have more than 100 characters.
- Indenting should be a soft tab (4 spaces) as common with in Python. Do not mix tabs and spaces!
- There should be no whitespace at the end of the file (as per PEP8)
- Comments should be on the line above. Remember to update comments when changing code so that code matches the comments.
- Class names should be in Pascal style as this is Python idiomatic.
# Good
class TestThisSite:
# Bad
class test_this_site:
Page Objects
General
- All Page Objects should inherit from Page in page.py.
- Page Objects should not do asserts. This should be done within the test.
- Each Page should be grouped within one module.
- If using mutliple words to describe a module separate them with underscores '_'
test_search.py
- Timeout time should be taken from pytest-mozwebqa via page.py's timeout property.
Locators
- Locator variables should be prefixed with _ to show that it is "private".
- Variables should be descriptive of the area and not clash with any properties.
- Suffix of _locator.
- Accessing Locators should be done through a property method as this keeps the locator as readonly.
@property
def search_box(self):
return self.search_box_locator
- This approach can also be used with get_* calls with Selenium making it more idiomatic for the call.
@property
def page_title(self):
return self.selenium.get_title()
- We should use locators in the following order of preference (there will be exceptions):
- ID
- Name
- CSS
- XPath
- Locators should include the strategy instead of using implied strategies.
# Good
_my_locator = "id=content"
# Bad
_my_locator = "content"
- CSS locators should use whitespace for readability when using direct descendants.
# Good
_my_locator = "css=#content > p > a"
# Bad
_my_locator = "css=#content>p>a"
Actions
- Methods that perform actions on the page should indicate the action in the method name.
# Good
def click_report_with_length(length)
# Bad
def report_length(length)
Tests
- Module names should be called test_ and then behavioral areas.
test_search_positive.py
- Test method signature should include mozwebqa to use pytest-mozwebqa plugin.
def test_example(self, mozwebqa):
- Test method names should always show the intent of the test case.
# Good
def test_that_advanced_search_does_not_find_item(self, mozwebqa):
# Bad
def test_advanced_search(self, mozwebqa):
- Tests should handle the asserts -- not the page objects.
Size of patches
To make sure that we can review your patch as quickly and efficiently as possibly we would like patches to have 1 test in them and the necessary changes to the Page Objects. This also limits the chances of merge conflicts later.