# モバイルテストの概要

このページで学べること

Gondolaでモバイルアプリケーションをテストする際に利用可能な機能を紹介します。

# はじめに

Gondolaは、Android・iOS双方のモバイルアプリケーションとモバイルブラウザのテストをサポートします。

# モバイルテストで可能なこと

Gondolaは、以下のプラットフォームと設定をサポートします。

  • OS: Android 9+, iOS 13.7+, iPadOS 14.1+(ベータ版)
  • デバイス: モバイル端末、およびタブレット端末。物理デバイスと仮想デバイスの双方。
  • アプリケーションタイプ: ネイティブ、ハイブリッド、ウェブ

TIP

Gondolaでは、アプリケーション署名やインストルメント化は不要です。

  • ブラウザ: Chrome, Safari
  • モバイルクラウド: Sauce LabsやNTT Remote Testkit等のAppiumをサポートするあらゆるベンダー

# Appium

Gondolaは、内部にてAppiumを使用してモバイルの自動化を行っています。
Appiumはモバイルテストを行うための、非常に洗練されたオープンソースパッケージです。

# 機能

# プラットフォーム抽象化スクリプト

Gondolaフレームワークではプラットフォーム抽象化を行っており、作成したテストはあらゆるデバイス(AndroidおよびiOSを含む)で動作します。

accessibility idbtnSubmitに設定されているSubmitボタンをAndroidとiOSの双方でクリックする例は以下のようになります。

gondola.tap('~btnSubmit');

accessibility idがAndroidとiOSで異なっている場合はどうでしょう?

gondola.tap({
  android: '~android id',
  ios: '~iOS id'
});

上記の例では、tapcheckControlExistなどのようなILocatorを引数とするビルトインアクションは同様に動作します。

# ビヘイビア駆動開発に基づいた分かりやすいスクリプト

Gondolaでは、ビヘイビア駆動開発手法(BDD)を使用したあなた独自のテスト設計を支援します。
そのため、ビジネスチームと技術チームのコミュニケーションを円滑にすることができます。

BDDでのシナリオ:

Feature: Login Validation

    Background: App is started to Login page
        Given I start "loginPage"

    Scenario: Valid login
        When I login by username "john" and password ""
        Then I should see "pageTitle" of "homePage"

    Scenario: Invalid login
        When I login by username "Invalid" and password "Invalid"
        Then I should see "InvalidMsg" of "loginPage"

自動化エンジニアが、上記のシナリオに相当するスクリプトを記述します。このステップ定義により、テストとBDDシナリオのマッピングを行うことができます。

ステップ定義:

Given("I start {string}", (pageName: string) => {
    const pageClass = getPageClass(pageName);
    if (pageClass){
        const packageId = pageClass.packageId;
        if (packageId){
            gondola.runOnAndroid(async () => {
                await gondola.checkAppIsInstalled(typeof(packageId) === "string" ? 
                    packageId : packageId.android!);
            });
        }
        //gondola.wait(5);
    } else {
        throw new Error("Invalid page was given. Page is not found or corrupted.");
    }
});

When("I login by username {string} and password {string}", async (user: string, pass: string) => {
    await loginPage.login(user, pass);
});

Then("I should see {string} of {string}", (ele: string, parent: string) => {
    let parentPage;
    if (parent){
        parentPage = getPageClass(parent);
    }

    let toCheck = ele;
    if (parentPage && parentPage.hasOwnProperty(ele)){
        toCheck = parentPage[ele];
    }
    gondola.checkControlExist(toCheck);
});
最終更新: 2020/12/28 4:12:58