Confirmed users
198
edits
(new page) |
(First revision) |
||
Line 1: | Line 1: | ||
== | = 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: | |||
<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> |