Green Light for the Apps with Calaba.sh - DroidCon Paris 2014

Preview:

DESCRIPTION

Talk @DroidCon Paris - 23rd September 2014 How Meetic Mobile App Team is using Calaba.sh to deliver better quality software.

Citation preview

Green Light for the Apps!

Using Calaba.sh @Meetic

DroidCon Paris September 23rd 2014  

Cédric Creusot Jean-Loup Yu  

About us

Cédric Creusot

Android Developer

Meetic HQ

@Calimeraw

Jean-Loup Yu

Head of Mobile Development

Meetic HQ

@djelmen

Agenda

About Meetic

Mobile @Meetic

Green light to submit

Why Calaba.sh?

Hands on

Experience Sharing

About Meetic The French Success Story

The Success Story

founded by Marc Simoncini

of dating service in Europe

of unique visitors / month

countries covered by Meetic Service

events organized by Meetic

employees

2001

#1

7 millions

17

>1000

380

Mobile @Meetic Scaling in 2014

Mobile Apps Team – start of 2014

Tech

Product

Design

4

2

1

Mobile Apps Team - now

Tech

Product

Design

14

3

3

Mobile Apps Team Scope

Android

iOS

Windows

API – Web Services

Mobile Team Organization

One single open space

Cross functional Team

Mobile Team Organization

Agile

From Concept To Store

Mobile Team Organization

Agile

From Concept To Store

Mobile Team Organization

Agile

From Concept To Store

Mobile Team Organization

Agile

From Concept To Store

Green light to submit Apps Quality Status

Code Quality

•  Readable

•  Unit Tested

•  Smart Architecture

•  Maintenable

•  The code do what we want

•  Work with external

components

Functional Quality

Different Type of Test

•  Unit Test

•  Integration Test

•  Functional Test

Different Type of Test

•  Unit Test

•  Integration Test

•  Functional Test

Functional Test Tools

Why Calaba.sh? The Functional Tool Choice

Specification written with Gherkin

All the test cases in Meetic look like:

•  Given <the context>

•  When <users do actions>

•  Then <expected result>

Multi-platform Support

Android iOS

Mature

•  Open Sourced since February 2012

•  Based on Cucumber •  Born in 2008

•  Over 200 contributors

•  Backed and developed by Xamarin

Hands On Code inside

The Feature Scenario

@login!

Feature: Login feature!

As a Meetic user!

In order to enjoy the service!

I want to be able to log into the service!

!

Scenario: Wrong Login!

Given I am on the Login screen!

When I enter my credentials calabash_error@calabash.com and foobar!

And I press confirm!

Then I should see an error message!

The Feature Scenario

@login!

Feature: Login feature!

As a Meetic user!

In order to enjoy the service!

I want to be able to log into the service!

!

Scenario: Wrong Login!

Given I am on the Login screen!

When I enter my credentials calabash_error@calabash.com and foobar!

And I press confirm!

Then I should see an error message!

The Feature Scenario

@login!

Feature: Login feature!

As a Meetic user!

In order to enjoy the service!

I want to be able to log into the service!

!

Scenario: Wrong Login!

Given I am on the Login screen!

When I enter my credentials calabash_error@calabash.com and foobar!

And I press confirm!

Then I should see an error message!

The Feature Scenario

@login!

Feature: Login feature!

As a Meetic user!

In order to enjoy the service!

I want to be able to log into the service!

!

Scenario: Wrong Login!

Given I am on the Login screen!

When I enter my credentials calabash_error@calabash.com and foobar!

And I press confirm!

Then I should see an error message!

The Android Source Code – non intrusive

An example step definition – the glue

When(/^I enter my credentials (\S*) and (\S*)$/) do |login, password|!

wait_for_screen :login!

!

step 'I enter text "" into field with id "loginEdit"'!

step "I enter text \"#{login}\" into field with id \"loginEdit\""!

step 'I enter text "" into field with id "passwordEdit"'!

step "I enter text \"#{password}\" into field with id \"passwordEdit\""!

end!!

!

!

Run!

The result – human readable

How does it works?

Running environment

Features

Step definitions, Ruby client library

Devices/Emulators

Your app

Instrumentation Test server

Source: http://blog.lesspainful.com/2012/03/07/Calabash-Android/

The commands

Installation $>sudo gem install calabash-android!

 Setup $your_android_project_dir>calabash-android gen!

 Run tests $>calabash-android resign <your apk>!$>calabash-android run <your apk>!$>ADB_DEVICE_ARG=<your device> calabash-android run <your apk>!!

Better format output $>calabash-android run <your apk> --format html --out result.html!

!

!

Industrialization

•  Map of our code

•  Ease the issue localisation

Automated Tests

Continuous Integration

>  

Experience Sharing

Multi Language

•  12 languages management

•  4 brands

Calabash Ruby API

backdoor(method,arg)

1  

Backdoor with calabash

•  Need to run only when we are using calabash

•  The backdoor can call method only in the current activity tested

Create a specific target for Calabash

1  

In your Android app

public class MainActivitiy extends Activity { ! public String calabashGetStringById(String stringId) { ! String stringToReturn = “”; ! if (id != null && !id.isEmpty()) { ! Resources resources = getResources(); !

int resourceId = resources.getIdentifier(stringId, “string”, getPackageName()); ! stringToReturn = resources.getString(resourceId); !

} !

return stringToReturn; !

} !

} !

 

1  

In your glue

Given(/^I see the title “([^\”]*)”$/) do |key_string| ! title = backdoor(“calabashGetStringById”, key_string) ! wait_for_text(title) !end !

1  

Execution Time

•  Take time to execute the test

•  During Dev, need to be productive

Use label

$>calabash-android run <your apk> --tags <your tags>!

Example

$>calabash-android run myapp.apk --tags @login!

2  

Dedicated Environment

•  Control the Data Set

•  Setup the Back End

Huge amount of work!

Mock usage 3  

Behavior Driven Development

•  Write the expected Behavior in human language before implementation

•  User centric

•  Use concrete examples

•  No context

Work closely with Product and Dev

Define a company dictionary for the test 4  

Functional Test Cover

•  Functional tests need to stay maintenable

•  Don’t cover all the cases with automatic tests!

Automatic tests of the main cases •  Main path of the customers

•  Nominal cases

Manual Testing needed for specific cases

5  

Conclusion

We are hiring!

http://jobs.meetic.fr/

Any Question ?

Thanks!