Mobile Test Automation Framework using Cucumber, Appium and Page Objects

For teams developing & maintaining mobile apps for both Android & iOS platforms, functional testing is a huge challenge. The current process of updating apps over the air is very easy, raising users’ expectations of new features delivered sooner. So what this means for development teams is, they have to deliver many releases frequently and in turn what this means for Test teams is, they are continuously tasked with testing entire applications faster and more often.

Solution for such problems is Test Automation. Appium is a mobile Test Automation tool that has made life a lot easier for testers because of its capabilities and powers. Appium has made it easier for teams to test their apps for multiple platforms(one test case can test an app on iOs and android both).

But as mobile application matures and the automation test cases grow in number and project enters into a state where Regression test cases are changed frequently, that is when Test Teams starts to feel the heat about maintainability of test automation project and simultaneously adding new test cases.

And with the advent of Agile practices, Behaviour Driven Development/Testing has also gained more popularity.

No tool alone can solve the problem mentioned above.Appium alone cannot solve the challenges around implementing behavior driven development & frequent UI/functionality updates.What is needed is, the combination of tools which can address these problems when combined together. So on this thought process,i created a Test Framework combining Appium, Cucumber-JVM & Page Objects.

Before we move ahead, Lets try list down the features/qualities that we expect from a good Test Automation Framework for mobile:
1. Even Non Technical people like PO and BA’s’ can help in Test Automation.
2. Requirements are directly converted into Test cases ( to eliminate difference in understanding of Dev and QA)
3. Automation tool supports multiple platforms i.e iOS, Android etc. ( Same tool can be used to write test case for iOS and Android)
4. Inter portability of same test cases on Multiple platform ( Same test case can be run for iOS and Android).
5. Maintainability ( How easy it is to change/update a test case) 6. Re-usability ( How easy it is to use existing code to write new test cases)

To solve these problems or to achieve these features we integrated Cucumber-JVM and Appium. Lets see what are the advantages of Cucumber and Appium:

Cucumber is a key tool in implementing BDD. Some of the advantages of Cucumber are:
1. Cucumber Enables Non Technical team members to help in Test Automation (by writing feature files).
2. Cucumber can be implemented in multiple languages. i.e. Java, Ruby and JavaScript. Since i am more comfortable with Java that’s why i used java implementation of cucumber known as cucumber-JVM. But using others implementation should also be more or less same.
3. Cucumber can be used to implement projects in wide business areas like enterprise web, Mobile, Web Services etc.
4. Cucumber is very easy to install, implement and learn.

Appium: is very good for Mobile Automation and Some of the advantages of Appium are:
1. Support for multiple platforms iOS, Android and Firefox OS.
2. Support for Native, Web and Hybrid Applications.
3. Can be implemented in multiple languages Java, PHP, Python,Ruby, C# etc.
4. No need to import any library in the application code.
5. Can be implemented with any Testing Framework i.e Junit, TestNG, Cucumber etc.

Note: Please click on the images to enlarge them and understand the content.

Lets first understand the Application under Test.

First Screen is the Application Landing Page, Which has four buttons: Agenda, Speakers, My schedule and Location.
8

Second screen is displayed when user clicks on Agenda in Home Screen.
9

Now lets see what Test Cases we are going to write:
Test Case 1 : From Home Screen, user goes to agenda screen and comes back to home screen.
Test Case 2: From Home Screen, user goes to Speakers screen and comes back to home screen.

Now Lets understand the Maven Project that we created for this framework.

Step 1: Since its a maven project, we need to add dependencies in the pom.xml for Cucumber and Appium. Below is the snapshot of the pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>CucumberMobileAutomation</groupId>
	<artifactId>CucumberMobileAutomation</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>CucumberMobileAutomation</name>
	<description>Cucumber+Appium project</description>

	<properties>
		<appium.version>2.2.0</appium.version>
		<cucumber.version>1.2.2</cucumber.version>
	</properties>

	<dependencies>
		<!-- cucumber -->
		<dependency>
			<groupId>info.cukes</groupId>
			<artifactId>cucumber-java</artifactId>
			<version>${cucumber.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>info.cukes</groupId>
			<artifactId>cucumber-junit</artifactId>
			<version>${cucumber.version}</version>
			<scope>test</scope>
		</dependency>

		<!--  Appium -->
		<dependency>
		  <groupId>io.appium</groupId>
		  <artifactId>java-client</artifactId>
		  <version>${appium.version}</version>
		</dependency>
    </dependencies>

</project>

Step 2: Lets understand the project structure by next snapshot:
10

Step 3: Since its a cucumber project, next step is to write a feature file. I have created the feature file as per the application (screen shot and test cases attached above). Below is the snapshot of the feature file:

Feature: Agile NCR App
    In order to look at Agile NCR Conference
    As a Registered user
    I want to specify the flow to Agenda and Speakers

Scenario: Agenda
    Given user is on Application Home Page
    Then user gets an option to choose Agenda, Speakers, Locaton and My sechedule
    When user selects Agenda
    Then user is on Agenda Screen
    When user chooses to go back
    Then user is on Application Home Page

Scenario: Speakers
    Given user is on Application Home Page
    Then user gets an option to choose Agenda, Speakers, Locaton and My sechedule
    When user selects Speakers
    Then user is on Speakers Screen
    When user chooses to go back
    Then user is on Application Home Page

Step 4: Cucumber needs Glue code for implementation. So next logical step would be to right step definitions. Here is the snapshot for step definitions:

package com.stepDefinitions;

import java.net.MalformedURLException;
import com.testOldWay.AppiumTest;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class AgileNcrAppNormal {

    AppiumTest test = new AppiumTest();

    @Given(&quot;^user is on Application Home Page$&quot;)
    public void user_is_on_Application_Home_Page() throws MalformedURLException  {
        test.verifyHomePage();
    }
    @Then(&quot;^user gets an option to choose Agenda, Speakers, Locaton and My sechedule$&quot;)
    public void user_gets_an_option_to_choose_Agenda_Speakers_Locaton_and_My_sechedule() {
        test.verifyHomePageOptions();
    }
    @When(&quot;^user selects Agenda$&quot;)
    public void user_selects_Agenda() {
        test.clickAgenda();
    }
    @Then(&quot;^user is on Agenda Screen$&quot;)
    public void user_is_on_Agenda_Screen() {
        test.verifyAgendaScreen();
    }
    @When(&quot;^user chooses to go back$&quot;)
    public void user_chooses_to_go_back() {
        test.clickBack();
    }
    @When(&quot;^user selects Speakers$&quot;)
    public void user_selects_Speakers() {
        test.clickSpeakers();
    }
    @Then(&quot;^user is on Speakers Screen$&quot;)
    public void user_is_on_Speakers_Screen() {
        test.verifySpeakersScreen();
    }

}

Step 5: Next step is to right some hooks code,which will invoke Appium Instance and close the instance after test case is finished.Here is the sanpshot for the same:

package com.stepDefinitions;

import java.net.MalformedURLException;

import com.pages.DriverFactory;
import com.testOldWay.AppiumTest;

import cucumber.api.java.After;
import cucumber.api.java.Before;

public class Hooks {

    AppiumTest at = new AppiumTest();

    @Before
    public void beforeHookfunction() throws MalformedURLException, InterruptedException{
        at.createDriver();
    }

    @After
    public void afterHookfunction() {
        at.teardown();
    }

}

Step 6: Here is the code for invoking and closing Appium Instance. you can keep this code in any class and then use that class in hooks class accordingly. I have created a Java Class AppiumTest.java and declared this code there.here is the code snapshot for the same:

package com.testOldWay;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import io.appium.java_client.android.AndroidDriver;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class AppiumTest {

 static WebDriver driver = null;
 protected static WebDriverWait waitVar = null;

 public void createDriver() throws MalformedURLException, InterruptedException {

        // set up appium
        final File classpathRoot = new File(System.getProperty(&quot;user.dir&quot;));
        final File appDir = new File(classpathRoot, &quot;src/test/resources/apps&quot;);
        final File app = new File(appDir, &quot;com.xebia.eventsapp_2.1.apk&quot;);

        final DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(&quot;platformName&quot;, &quot;Android&quot;);
        capabilities.setCapability(&quot;deviceName&quot;, &quot;Android Emulator&quot;);
        capabilities.setCapability(&quot;platformVersion&quot;, &quot;4.4&quot;);
        capabilities.setCapability(&quot;app&quot;, app.getAbsolutePath());

        driver = new AndroidDriver(new URL(&quot;http://127.0.0.1:4723/wd/hub&quot;),
                capabilities);

        waitVar = new WebDriverWait(driver, 90);

        //Thread.sleep(90000);

    }

     public void teardown(){
         //close the app
         driver.quit();
     }
}
Step 7: Next we write the code for functions that we expect our test cases to perform and the functions that we have called in the StepDefinition file. This code is written in AppiumTest.java .Here is the snapshot for that code:

package com.testOldWay;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import io.appium.java_client.android.AndroidDriver;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class AppiumTest {

 static WebDriver driver = null;
 protected static WebDriverWait waitVar = null;

 public void createDriver() throws MalformedURLException, InterruptedException {

        // set up appium
        final File classpathRoot = new File(System.getProperty(&quot;user.dir&quot;));
        final File appDir = new File(classpathRoot, &quot;src/test/resources/apps&quot;);
        final File app = new File(appDir, &quot;com.xebia.eventsapp_2.1.apk&quot;);

        final DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(&quot;platformName&quot;, &quot;Android&quot;);
        capabilities.setCapability(&quot;deviceName&quot;, &quot;Android Emulator&quot;);
        capabilities.setCapability(&quot;platformVersion&quot;, &quot;4.4&quot;);
        capabilities.setCapability(&quot;app&quot;, app.getAbsolutePath());

        driver = new AndroidDriver(new URL(&quot;http://127.0.0.1:4723/wd/hub&quot;),
                capabilities);

        waitVar = new WebDriverWait(driver, 90);

        //Thread.sleep(90000);

    }

     public void teardown(){
         //close the app
         driver.quit();
     }

     public void verifyHomePage(){
         //wait for HomePage image and verify if the image is present is or not
         waitVar.until(ExpectedConditions.presenceOfElementLocated(By.id(&quot;com.xebia.eventsapp:id/home_banner_imageView&quot;)));
         assertTrue(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_banner_imageView&quot;)).isDisplayed());
     }

     public void verifyHomePageOptions(){
         //wait for home page options and then verify if home page options are present or not:
         waitVar.until(ExpectedConditions.presenceOfElementLocated(By.id(&quot;com.xebia.eventsapp:id/home_banner_imageView&quot;)));
         waitVar.until(ExpectedConditions.elementToBeClickable(By.id(&quot;com.xebia.eventsapp:id/ll_agenda&quot;)));

         assertTrue(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_agenda_title&quot;)).isDisplayed());
         assertTrue(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_speakers_title&quot;)).isDisplayed());
         assertTrue(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_mySchedule_title&quot;)).isDisplayed());
         assertTrue(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_location_title&quot;)).isDisplayed());

         //print all the options on HomePage
         System.out.println(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_agenda_title&quot;)).getText());
         System.out.println(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_speakers_title&quot;)).getText());
         System.out.println(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_mySchedule_title&quot;)).getText());
         System.out.println(driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_location_title&quot;)).getText());
     }

     public void clickAgenda(){
         //click on Agenda Button and wait for next page to appear:
         driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_agenda_title&quot;)).click();
         waitVar.until(ExpectedConditions.presenceOfElementLocated(By.id(&quot;com.xebia.eventsapp:id/action_bar_custom_title&quot;)));
     }

     public void verifyAgendaScreen(){
         // verify Agena Screen Title:
         assertEquals(&quot;Agenda&quot;,driver.findElement(By.id(&quot;com.xebia.eventsapp:id/action_bar_custom_title&quot;)).getText());
     }

     public void clickBack() {
         //click Back button:
        WebElement backHome = driver.findElement(By.id(&quot;android:id/home&quot;));
        backHome.click();
        waitVar.until(ExpectedConditions.elementToBeClickable(By.id(&quot;com.xebia.eventsapp:id/ll_agenda&quot;)));

        if (driver.findElement(By.id(&quot;com.xebia.eventsapp:id/ll_agenda&quot;)).isDisplayed()){
            System.out.println(&quot;Successfully reach to home page&quot;);
        }
        else {
            System.out.println(&quot;Did Not reach to home page&quot;);
        }
     }

     public void clickSpeakers(){
         //click on Speakers button and wait for the next page to come:
         driver.findElement(By.id(&quot;com.xebia.eventsapp:id/home_speakers_title&quot;)).click();
         waitVar.until(ExpectedConditions.presenceOfElementLocated(By.id(&quot;com.xebia.eventsapp:id/action_bar_custom_title&quot;)));
     }

     public void verifySpeakersScreen(){
         //verify speaker screen Title:
         assertEquals(&quot;speakers&quot;,driver.findElement(By.id(&quot;com.xebia.eventsapp:id/action_bar_custom_title&quot;)).getText().toLowerCase());
     }
 }

Now, we are a stage where we have created a small cucumber-appium-maven project that verifies behavior of the application. This project now contains two automation test cases.

After integrating Cucumber and Appium, let see from our list of desired feature which are achieved and which are still not achieved: * Even Non Technical people like PO and Managers can help in Test Automation (Cucumber) * Requirements are directly converted into Test cases (Cucumber) * Automation tool supports multiple platforms i.e iOS, Android etc. (Appium) * Inter portability of same test cases on Multiple platform ( Same test case can be run for iOS and Android) (Appium) * Maintainability * Re-usability

Problem Statement: If we use this approach, two major challenges that still exist are: 1. Locators(code to find elements) are spread across whole file and if some one needs to change a locator then he will have to make changes at multiple places and we face a risk of some locators not being updated at all. To know at what all places the particular locator was defined is the biggest challenge. 2. There is no scope defined for a file, it may contain function for entire application or for some part only. if a new team member joins, then he will face hard time finding a function already defined.

if you would have closely noticed the AppiumTest File, then you would have seen all the locators are scattered across the file. And these are locators only for 2 test cases, imagine what would happen if this file contains locators for the whole project.

Key to the solution is Page Object. Page Objects is a framework design approach for maintaining & accessing components & controls spread across test scenarios. Page Object creates a DSL for our tests that if something changes on the page we don't need to change the test, we just need to update the object that represents the page.

To implement page objects, we need to define rules and communicate these rules to all team members. Rules could be ( but not limited to): * Each Page object scope will be limited to one page of the application only. * All locators related to that page will be defined in the page object ( all locators will be grouped at one place, possibly on the Top so that it is easy to find and update these). * All behaviors associated to a page will be described in the page object as functions.

Now lets understand what changes we made to our code for introducing Page Objects.

Change 1: We are not going to use AppiumTest.java

Change 2: Since invoking and closing Appium Session does not fall in any page scope, we created a new file DriverFactory.Java. Here is the snapshot:

package com.pages;

import io.appium.java_client.android.AndroidDriver;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.WebDriverWait;

public class DriverFactory {

    public static WebDriver driver = null;
    public static WebDriverWait waitVar = null;

    public void createDriver() throws MalformedURLException, InterruptedException {

        // set up appium
        final File classpathRoot = new File(System.getProperty(&quot;user.dir&quot;));
        final File appDir = new File(classpathRoot, &quot;src/test/resources/apps&quot;);
        final File app = new File(appDir, &quot;com.xebia.eventsapp_2.1.apk&quot;);

        final DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(&quot;platformName&quot;, &quot;Android&quot;);
        capabilities.setCapability(&quot;deviceName&quot;, &quot;Android Emulator&quot;);
        capabilities.setCapability(&quot;platformVersion&quot;, &quot;4.4&quot;);
        capabilities.setCapability(&quot;app&quot;, app.getAbsolutePath());

        driver = new AndroidDriver(new URL(&quot;http://127.0.0.1:4723/wd/hub&quot;),
                capabilities);

        waitVar = new WebDriverWait(driver, 90);
    }

     public void teardown(){
         //close the app
         driver.quit();
     }
}

Change 3: Now we created a Page Object file for each page of the application. The beauty of these files is that just by looking at the code, you can relate for which part of the application these files belong to.

First Page object is: Home page of the application(HomePage.java)

package com.pages;

import static org.junit.Assert.assertTrue;

import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class HomePage extends DriverFactory{

    // All the locators for Home page will be defined here
    By homePageImage = By.id(&quot;com.xebia.eventsapp:id/home_banner_imageView&quot;);
    By agendaButton = By.id(&quot;com.xebia.eventsapp:id/home_agenda_title&quot;);
    By speakersButton = By.id(&quot;com.xebia.eventsapp:id/home_speakers_title&quot;);
    By myScheduleButton = By.id(&quot;com.xebia.eventsapp:id/home_mySchedule_title&quot;);
    By locationButton = By.id(&quot;com.xebia.eventsapp:id/home_location_title&quot;);

    By backButton = By.id(&quot;android:id/home&quot;);

    // All the behavior of home page will be defined here in functions
    public void verifyHomePage()
    {
        waitVar.until(ExpectedConditions.presenceOfElementLocated(homePageImage));
        assertTrue(driver.findElement(homePageImage).isDisplayed());
    }

    public void verifyHomePageOptions()
    {
         waitVar.until(ExpectedConditions.presenceOfElementLocated(homePageImage));
         waitVar.until(ExpectedConditions.elementToBeClickable(agendaButton));

         assertTrue(driver.findElement(agendaButton).isDisplayed());
         assertTrue(driver.findElement(speakersButton).isDisplayed());
         assertTrue(driver.findElement(locationButton).isDisplayed());
         assertTrue(driver.findElement(myScheduleButton).isDisplayed());

         //print all the options on HomePage
         System.out.println(driver.findElement(agendaButton).getText());
         System.out.println(driver.findElement(speakersButton).getText());
         System.out.println(driver.findElement(myScheduleButton).getText());
         System.out.println(driver.findElement(locationButton).getText());
    }

    public void clickAgenda(){
        driver.findElement(agendaButton).click();
    }

    public void clickSpeakers() {
        driver.findElement(speakersButton).click();
    }

    public void clickBack() {
        driver.findElement(backButton).click();
        waitVar.until(ExpectedConditions.elementToBeClickable(agendaButton));

        if (driver.findElement(agendaButton).isDisplayed()){
            System.out.println(&quot;Successfully reach to home page&quot;);
        }
        else{
            System.out.println(&quot;Did Not reach to home page&quot;);
        }
    }
}

Second page object is for Agenda Page. ( AgendaPage.java)

package com.pages;

import static org.junit.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class AgendaPage extends DriverFactory{

    // All the locators for Agenda page will be defined here
    By title = By.id(&quot;com.xebia.eventsapp:id/action_bar_custom_title&quot;);
    By AgendaList = By.id(&quot;referenceOfAgendaList&quot;);

    // All the behavior of Agenda page will be defined here in functions

    public void verifyAgendaPage() {
        waitVar.until(ExpectedConditions.presenceOfElementLocated(title));

        assertEquals(&quot;Agenda&quot;,driver.findElement(title).getText());
    }

    public void clickonAgenda(){
        //code goes here
    }

}

Third page object is Speakers page. (SpeakersPage.java)

package com.pages;

import static org.junit.Assert.assertEquals;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class SpeakersPage extends DriverFactory{

    // All the locators for Speaker page will be defined here
    By title = By.id(&quot;com.xebia.eventsapp:id/action_bar_custom_title&quot;);
    By SpeakersList = By.id(&quot;referenceOfSpeakersList&quot;);

    // All the behavior of Speaker page will be defined here in functions
    public void verifySpeakersPage(){
        waitVar.until(ExpectedConditions.presenceOfElementLocated(title));

        assertEquals(&quot;Speakers&quot;,driver.findElement(title).getText());
    }

    public void clickonSpeaker() {
        //code goes here
    }
}

Change 4: Step Definitions file also be updated to use the Page objects. Here is the snapshot of the StepDefinitions file:

package com.stepDefinitions;

import java.net.MalformedURLException;

import com.pages.AgendaPage;
import com.pages.DriverFactory;
import com.pages.HomePage;
import com.pages.SpeakersPage;

import cucumber.api.java.After;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class AgileNcrAppPageObject {

    DriverFactory df = new DriverFactory();
    HomePage hp = new HomePage();
    AgendaPage ag = new AgendaPage();
    SpeakersPage sp = new SpeakersPage();

    @Given(&quot;^user is on Application Home Page$&quot;)
    public void user_is_on_Application_Home_Page() throws MalformedURLException  {
        hp.verifyHomePage();
    }
    @Then(&quot;^user gets an option to choose Agenda, Speakers, Locaton and My sechedule$&quot;)
    public void user_gets_an_option_to_choose_Agenda_Speakers_Locaton_and_My_sechedule() {
        hp.verifyHomePageOptions();
    }

    @When(&quot;^user selects Agenda$&quot;)
    public void user_selects_Agenda() {
        hp.clickAgenda();
    }
    @Then(&quot;^user is on Agenda Screen$&quot;)
    public void user_is_on_Agenda_Screen() {
        ag.verifyAgendaPage();
    }
    @When(&quot;^user chooses to go back$&quot;)
    public void user_chooses_to_go_back() {
        hp.clickBack();
    }
    @When(&quot;^user selects Speakers$&quot;)
    public void user_selects_Speakers() {
        hp.clickSpeakers();
    }
    @Then(&quot;^user is on Speakers Screen$&quot;)
    public void user_is_on_Speakers_Screen() {
        sp.verifySpeakersPage();
    }
}

Now, you can see yourself that if some one has to make a change, how easy it becomes to change and at the same time how easy it is to add new functionality.

After integrating Cucumber and Appium with Page Objects, let see from our list of desired feature which are achieved and which are not still:
1. Even Non Technical people like PO and Managers can help in Test Automation (Cucumber)
2. Requirements are directly converted into Test cases (Cucumber)
3. Automation tool supports multiple platforms i.e iOS, Android etc. (Appium)
4. Inter portability of same test cases on Multiple platform ( Same test case can be run for iOS and Android) (Appium)
5. Maintainability (Page-Objects)
6. Re-usability (Page-Objects)

I really hope after reading this blog, you will have a better understanding of what are the features required from a good automation framework and how to use different tools/design approaches to achieve those features.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s