Hi guys, today I am going to talk about how to better architect your test code and obtain better cross-platform code reuse.
The idea is that you provide an implementation of page objects for each platform you need to support (e.g. iPhone, iPad, Android phone, Android tablet, mobile web, desktop web,…).
Use Page Objects
While originating in web testing, the ideas of POP apply equally well to native mobile. The most obvious benefit of this is abstraction and reuse. If you have several steps needing to navigate to details, the code is reused. Also, callers of this method need not worry about the details (e.g. query and touch) or navigating to this screen.
Don’t specify fields in your feature files
Working this way gets you complete reuse of Cucumber features as well as step definitions: the details of interacting with the screen is pushed to page object implementations.
Scenarios should be written like a user would describe them. Beware of scenarios that only describe clicking links and filling in form fields, or of steps that contain code or CSS selectors. This is just another variant of programming, but certainly not a feature description.
Declarative features are vivid, concise and contain highly maintainable steps.
For example:
Scenario: Valid login credentials
Given I am on login page
When I enter valid credentials
Then I should be redirected to the management page
Define a page object for each screen
For each screen you want to automate, decide on an interface for a page object class (e.g. like LoginScreen
). This means that the calling code, which is usually in a step definition, is independent of platform – hence it can be reused across platforms. For each supported platform, define a class with implementations of the page-object methods.
Don’t expose the framework in your step definitions
Use only custom steps, and in each step definition only use page objects and their methods (no direct calls to the framework (Calabash, Selenium, Appium, Robotium).
Reuse step definitions
This comes in handy when a step extends another step’s behaviour or defines a superior behaviour that consists of multiple steps. You should try to reuse steps as often as possible.This will improve the maintainability of your app: If you need to change a certain behaviour, you just need to change a single step definition.
For example (Using javascript and protractor):
this.Given(/^I am on login page$/, function() { loginPage.openLoginPage(); });
Thank you guys ! See you next week !
Resources:
https://developer.xamarin.com/guides/testcloud/calabash/xplat-best-practices/