@ayunyanさんに教えていただいたので使ってみる。
■シナリオ
以下のようにandroid版顔文字辞典を操作するとする。
- メニューを開く
- カテゴリ追加をタップする
- カテゴリ名を入力し登録する(a)
- 登録したカテゴリ(a)をロングタップする
- 編集を選択する
- カテゴリ名を変更して登録する(b)
- 編集したカテゴリ(b)をロングタップする
- 削除をタップする
■テストコード
以下のようにして「みんなの顔文字辞典」のカテゴリー追加・編集・削除のダイアログのテストを行う。
package info.justoneplanet.android.kaomoji.test.dialog; import com.jayway.android.robotium.solo.Solo; import info.justoneplanet.android.kaomoji.KaomojiFavorite; import info.justoneplanet.android.kaomoji.R; //import android.app.Instrumentation; import android.test.ActivityInstrumentationTestCase2; /** * カテゴリを追加するダイアログのテストケース * @author justoneplanet * カテゴリの登録・編集・削除は決まった順番で行われる必要があるためメソッド名で順序を指定した */ public class CategoryDialogBuilderTest extends ActivityInstrumentationTestCase2<KaomojiFavorite> { private KaomojiFavorite mActivity; //private Instrumentation mInstrumentation; private Solo solo; private static final String OLD_CATEGORY_NAME = "新しいカテゴリ"; private static final String NEW_CATEGORY_NAME = "新カテゴリ"; public CategoryDialogBuilderTest() { super("info.justoneplanet.android.kaomojifavorite", KaomojiFavorite.class); } @Override public void setUp() throws Exception { super.setUp(); mActivity = getActivity(); //mInstrumentation = getInstrumentation(); solo = new Solo(getInstrumentation(), getActivity()); } @Override public void tearDown() throws Exception { super.tearDown(); mActivity = null; //mInstrumentation = null; } /** * カテゴリを正しく追加できるか * カテゴリaを登録する */ public void testCategory1Add() { solo.clickOnMenuItem(mActivity.getString(R.string.menu_category_add));// メニュー>カテゴリを追加 solo.enterText(0, OLD_CATEGORY_NAME);// 新しいカテゴリ名を入力 solo.clickOnButton(mActivity.getString(R.string.register));// 登録ボタン } /** * カテゴリを正しく編集できるか * カテゴリaを編集してカテゴリbに名前を変える */ public void testCategory2Edit() { solo.clickLongOnText(OLD_CATEGORY_NAME);// テキストで探索してリストの要素をロングタップ solo.clickOnText(mActivity.getString(R.string.edit));// ダイアログ内カテゴリの編集をタップ solo.clearEditText(0);// テキストを消す solo.enterText(0, NEW_CATEGORY_NAME);// 新カテゴリ名を入力 solo.clickOnButton(mActivity.getString(R.string.register));// 登録ボタン } /** * カテゴリを削除できるか * カテゴリbを削除する */ public void testCategory3Delete() { solo.clickLongOnText(NEW_CATEGORY_NAME);// テキストで探索してリストの要素をロングタップ solo.clickOnText(mActivity.getString(R.string.delete));// カテゴリの削除をクリック solo.waitForDialogToClose(1000);// すぐに終了してしまうと削除クエリが実行されなかったので } }
操作する要素をテキストで指定できる探索が便利!
clickInListについて
以下のようにして使用した。おそらく表示しているlistアイテムの配列の中でのpositionを指定していると思われる。また、表示されていないlistアイテムを上からの位置で指定することはできなかった。
private String tapEmoticonAfterCategory(String category, int position) { solo.clickOnText(category); solo.waitForDialogToClose(1000);// 作用するまでwait ArrayList<TextView> list = solo.clickInList(position);// 表示されているlistの要素配列のposition solo.waitForDialogToClose(1000);// 作用するまでwait Log.e("tapped", String.valueOf(list.get(0).getText())); return String.valueOf(list.get(0).getText()); }
■参考
おまけ
当初は以下のようにThread.sleepを使用していたが、ProgressDialogを表示し通信結果を待つような場合に期待した動作にならなかった。
/** * カテゴリを削除できるかテストする * @throws InterruptedException */ public void testCategory3Delete() throws InterruptedException { solo.clickLongOnText(NEW_CATEGORY_NAME);// テキストで探索してリストの要素をロングタップ solo.clickOnText(mActivity.getString(R.string.delete));// カテゴリの削除をクリック Thread.sleep(1000);// 期待の動作とならない }
テキスト(半角カナ?)によってはいまいち探索できないときがある。