B2G/QA/Automation/Style Guide/Avoiding Duplication: Difference between revisions

From MozillaWiki
< B2G‎ | QA‎ | Automation‎ | Style Guide
Jump to navigation Jump to search
(new page)
 
(First revision)
 
Line 1: Line 1:
== Avoid Code Duplication ==
= Between 2 tests =
TBD - jlorenzo
Sometimes, you might want to copy and paste 1 test in order to test a sightly similar scenario.
* Use parameterized()
 
* Centralize workarounds
== Same test, different data ==
If the only thing that changes is the data you provide to the test, you can use the @parameterized decorator. Here's an example:
 
<source lang="python">
@parameterized("zero_length_file", 'image_formats/x05.png')
@parameterized("truncated_jpg", 'image_formats/x08.jpg')
def test_gallery_handle_load_corrupt_file(self, filename):
    self.push_resource(filename)
 
    gallery = Gallery(self.marionette)
    gallery.launch()
 
    self.assertTrue(gallery.gallery_items_number == 0)
</source>
 
== Tests have a set of steps that are common ==
Sometimes, you have steps that are repeated in many tests. One way to avoid the duplication here is to group these steps in the page class.
 
= Within 1 page class =
Sometimes you might end up repeating the same steps over and over along the Page class. Like in regular software development, don't be afraid to factorize all these steps in a function. For example:
 
<source lang="python">
class ContactsDetails(PageRegion):
 
    def type_email(self, value):
        self._type_in_field(self._add_new_email_locator, self._email_locator, value)
 
    def type_phone(self, value):
        self._type_in_field(self._add_new_phone_locator, self._phone_locator, value)
 
    def _type_in_field(self, add_locator, field_locator, value):
        Wait(self.marionette).until(expected.element_present(*add_locator)).tap()
        element = Wait(self.marionette).until(expected.element_present(*field_locator))
        Wait(self.marionette).until(expected.element_displayed(element))
        element.clear()
        element.send_keys(value)
</source>

Latest revision as of 14:12, 12 November 2015

Between 2 tests

Sometimes, you might want to copy and paste 1 test in order to test a sightly similar scenario.

Same test, different data

If the only thing that changes is the data you provide to the test, you can use the @parameterized decorator. Here's an example:

@parameterized("zero_length_file", 'image_formats/x05.png')
@parameterized("truncated_jpg", 'image_formats/x08.jpg')
def test_gallery_handle_load_corrupt_file(self, filename):
    self.push_resource(filename)

    gallery = Gallery(self.marionette)
    gallery.launch()

    self.assertTrue(gallery.gallery_items_number == 0)

Tests have a set of steps that are common

Sometimes, you have steps that are repeated in many tests. One way to avoid the duplication here is to group these steps in the page class.

Within 1 page class

Sometimes you might end up repeating the same steps over and over along the Page class. Like in regular software development, don't be afraid to factorize all these steps in a function. For example:

class ContactsDetails(PageRegion):

    def type_email(self, value):
        self._type_in_field(self._add_new_email_locator, self._email_locator, value)

    def type_phone(self, value):
        self._type_in_field(self._add_new_phone_locator, self._phone_locator, value)

    def _type_in_field(self, add_locator, field_locator, value):
        Wait(self.marionette).until(expected.element_present(*add_locator)).tap()
        element = Wait(self.marionette).until(expected.element_present(*field_locator))
        Wait(self.marionette).until(expected.element_displayed(element))
        element.clear()
        element.send_keys(value)