Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sebaslogen/cleanguitestarchitecture
Sample project of Android GUI test automation using Espresso, Cucumber and the Page Object Pattern
https://github.com/sebaslogen/cleanguitestarchitecture
android cucumber espresso pageobject-pattern
Last synced: 3 months ago
JSON representation
Sample project of Android GUI test automation using Espresso, Cucumber and the Page Object Pattern
- Host: GitHub
- URL: https://github.com/sebaslogen/cleanguitestarchitecture
- Owner: sebaslogen
- License: mit
- Created: 2015-09-14T17:33:55.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-06-14T21:26:23.000Z (over 7 years ago)
- Last Synced: 2024-10-10T03:41:30.436Z (3 months ago)
- Topics: android, cucumber, espresso, pageobject-pattern
- Language: Java
- Size: 151 KB
- Stars: 137
- Watchers: 17
- Forks: 31
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
[![Build Status](https://travis-ci.org/sebaslogen/CleanGUITestArchitecture.svg?branch=master)](https://travis-ci.org/sebaslogen/CleanGUITestArchitecture)
# Clean GUI Test Architecture
Sample project of Android GUI test automation using Espresso, Cucumber and the Page Object PatternThe evolution journey of Android GUI testing
============
The code in this repository serves as a support example of all the test solutions discussed in this published article:https://medium.com/@sebaslogen/the-evolution-journey-of-android-gui-testing-f65005f7ced8
Execute the project
-------
Open the project in Android Studio and select the gradle task '**connectedCheck**'Alternative, from the command line run ```gradlew connectedCheck```
Cucumber supports **filtering execution of test scenarios with tags** (i.e. @login-scenarios). To filter by tags you have the following options (which can't be combined):
- Hard coded tags in annotation ```@CucumberOptions``` inside ```CucumberTestCase.java```
- Use parameters in command line like ```./gradlew connectedAndroidTest -Ptags="@login-scenarios,@kitkat"```
- In Android Studio, run connectedAndroidTest in the right Gradle tab and then edit the run configuration to add under the `Script parameters` something like `-Ptags="@login-scenarios,@kitkat"`More information about how to use and combine [Cucumber tags here](https://github.com/cucumber/cucumber/wiki/Tags).
_Note: Make sure to connect a phone to the computer or start an emulator before running the tests._
In a nutshell
-------
The sample test code can be summarized in these three elements:1- Feature file describing the test scenario in English:
```gherkin
@ScenarioId("MyApp-135") @login-scenarios
Scenario: User can login with valid user name and password
Given I see the login page
When I login with user name "Sebas" and password "passion"
Then I see the welcome page
And the title is "Welcome Sebas"
```2- Java glue code to translate English to Java (this is a step definition):
```java
@Given("^I see the login page$")
public void i_see_the_login_page() {
mCurrentPage = new LoginPage();
}@When("^I login with user name \"(.+)\" and password \"(.+)\"$")
public void i_login_with_username_and_password(final String userName, final String password) {
mCurrentPage = mCurrentPage.is(LoginPage.class).doLogin(userName, password);
}@Then("^I see the welcome page$")
public void i_see_the_welcome_page() {
mCurrentPage.is(WelcomePage.class);
}@And("^the title is \"(.+)\"$")
public void the_title_is(final String title) {
mCurrentPage.is(WelcomePage.class).checkTitle(title);
}
```3- Page Object class implementing the interactions between tests and tested application:
```java
/**
* Perform the login and return the next Welcome page/view
* @param userName Name of the user to login
* @param password Password of the user to login
* @return Welcome page/view
*/
public WelcomePage doLogin(String userName, String password) {
onView(withId(R.id.username)).perform(typeText(userName));
onView(withId(R.id.password)).perform(typeText(password), closeSoftKeyboard());
onView(withId(R.id.login_button)).perform(click());
return new WelcomePage();
}
```Advanced scenarios
-------
When the code of your application and tests mature enough you will be doing things like this:
- A test step from a test scenario that can be reused across multiple tests:
```gherkin
Given I login into premium account
```
- The step definition describes a lot of steps that need to happen to perform the requested action:
```java
@Given("^I login into premium account$")
public void i_log_in_to_premium() {
mCurrentPage = mCurrentPage
.is(MainPage.class).openMenu()
.is(MenuPage.class).selectMenuItem("Accounts")
.is(AccountsPage.class).selectNewAccountLogin()
.is(LoginPage.class).doLogin()
.is(AgreementPage.class).agreeToPrivacyInformation();
}
```
This step definition still hides most of the implementation details inside the Page Objects that contain the actual how-to communicate with the tested application.License
-------
This content is released under the MIT License: http://opensource.org/licenses/MIT