Appiumを使用したAndroidテストの推奨環境
推奨環境
Pitaliumを使用してAppiumでAndroidデバイステストを行うには、以下の環境のいずれかを推奨します。
- WebDriverセッションの生成レベルをTEST_CLASSまたはGLOBALとする
- 1PCに対して接続するAndroidデバイスを1台とする
- MacOSXまたはLinuxを使用する
WebDriverセッション利用レベルをTEST_CLASSまたはGLOBALを設定する
Appiumを使用したAndroidデバイスのテストでは以下の問題があります。
- WebDriverセッションを作成するのに時間を要する
- WebDriverセッションの生成と破棄を繰り返すと、突然WebDriverセッションの生成に失敗し始める
またPitaliumはSelenium Grid Hubの「複数のWebDriverセッション生成を同時に行うとデッドロックが発生する」問題に対処するため、WebDriverセッション生成を同期的に実行します。この処理によって、WebDriverセッション生成に時間がかかるWindows + Appium + Android環境をPitaliumで複数テストを行うと、1テストケースを開始するだけでかなり時間がかかってしまいます。
これらの問題を回避するにはPitaliumの WebDriverセッション利用レベルをTEST_CLASSまたはGLOBALを設定します 。 セッション生成にかかる時間を短縮し、また生成に失敗する現象を回避することができます。
WebDriverセッションレベルを変更する
WebDriverセッションの利用レベルを設定するには次の2つの方法があります。
設定ファイルを利用する
environmentConfig.jsonにWebDriverセッションの利用レベルを設定するには、以下の様に記述します。
この設定は全てのテストに影響します。
"webDriverSessionLevel": "GLOBAL"
}
アノテーションを利用する
テストクラスに@PtlWebDriverStrategyを付加することで、
特定のテストクラスでのみWebDriverセッションの利用レベルを変更します。
また、EnviromnentConfigの設定値をクラス単位で上書きします。
public class TestClass extends PtlTestBase {
@Test
public void test() throws Exception {
}
}
WebDriverセッションレベルを変更したときの注意点
ブラウザの状態をリセットする
セッションレベルをテストクラスまたはグローバルに設定するとテストケース間でブラウザセッションを共有するします。
そのため、例えばクッキーやSessionStorageがテストケース毎に自動でリセットされず、手動でリセットを行う必要があります。
リセットを行うには以下のコードを参考にしてください。
public class Sample extends PtlTestBase {
@Before
@Override
public void setUp() {
super.setUp();
// クッキーの削除
driver.manage().deleteAllCookies();
// LocalStorageの削除
// 初回はURLを読み込んでいないため必ずエラーになるため
// try-catchが必要
driver.executeScript(
"try {" +
" var storage = window.localStorage;" +
" if (storage) {" +
" storage.clear();" +
" }" +
"} catch (e) {" +
"}"
);
// SessionStorageの削除
driver.executeScript(
"try {" +
" var storage = window.sessionStorage;" +
" if (storage) {" +
" storage.clear();" +
" }" +
"} catch (e) {" +
"}"
);
// その他諸々の初期化
}
@Test
public void test1() {
driver.get("https://www.htmlhifive.com/conts/web/view/tutorial/");
}
@Test
public void test2() {
driver.get("https://www.htmlhifive.com/conts/web/view/recipe/");
}
}
WebDriverセッションの管理
WebDriverセッション利用レベルをGLOBALに設定すると、Pitaliumは自動でWebDriverセッションをクローズしません。
通常はEnvironmentConfigのmaxDriverWaitの値にしたがって30秒間何も操作をしないと自動でブラウザが閉じられます。
この値を大きな値で上書きしてしまうと次のテストを開始することができなくなるため、その場合は外部からAppiumプロセスの再起動を行うなど、別途WebDriverセッションを閉じる操作が必要です。
1PCに対して接続するAndroidデバイスを1台とする
Appiumはマルチデバイスをサポートしており、1台のPCに実機、エミュレーターを問わず複数のAndroidデバイスを同時に接続しテストを行うことが可能です。しかしWindowsとAppium、Androidの組み合わせでは、1台のPCに接続するAndroidデバイスの数が多くなるにしたがってWebDriverセッションが生成できなくなるまでの時間が短くなることが分かっています。
なるべくAppiumを使用したテストを長く続けるには、1PCあたりのデバイス数を少なくする(1台とする)ことが有効です。
なお上記のWebDriverセッションレベルを設定している場合、WebDriverセッションの生成をPitaliumが抑制するため、1PCあたり複数のデバイスを接続し長期で利用することができます。
1PCに2台同時に接続しセッションレベルをGLOBALで実行した場合はテストを1日中回すことが可能でしたが、7台まで増やすと原因は不明ですがAppiumが落ちてしまいました。
同時に接続するデバイスは多くても3台程度を推奨します。
MacOSXまたはLinuxを使用する
Appiumを使用する上で最大の障害はWindows上のadbが不安定なことです。
MacOSXやUbuntuなどのLinux系OSではWebDriverセッション生成回数の寿命が存在せず、またセッション生成に要する時間もWindows上での時間に比べかなり短くなります。
MacOSXやLinuxが利用できる環境であれば利用した方が良いでしょう。