ラベル JUnit の投稿を表示しています。 すべての投稿を表示
ラベル JUnit の投稿を表示しています。 すべての投稿を表示

2013年9月6日金曜日

【Androidシナリオテスト】Androidのテストを完全自動化する方法

AndroidをPCにつなぐ事で、シナリオテストが出来るようになります。

まずはその仕組みについて、調査してみましょう!
AndroidSDKをDLし、SDKにパスを通します!
そして、コマンドラインで

adb shell getevent

と打ってみましょう!
その動画がコレです。



ん?ちょっとわかり辛いですが、
タッチした瞬間、何か変化が現れて流れていきましたね!

それではコマンドラインのログを見てみましょう!














おお!
/dev/input/event0
のイベントが流れているのがわかります!

それでは、このイベントでフィルタリングしてみましょう!
単純にgrep でフィルタリングしてみます。

adb shell getevent | grep event0



おお!
タッチした瞬間に何かイベントが起きているという事がわかりますね!

実はAndroidは、タッチしたイベントをadb経由でこのように取得する事も
可能ですが、さらに送信する事も可能です!

ただし、送信イベントは先ほどみたログとはちょっと形式が違ってきます。
ログは、

/dev/input/event0: 0000 0000 00000000

という感じですが、Androidにタッチイベントを送信する場合、

adb shell sendevent /dev/input/event0 0 0 0

という風になります。
大雑把に言うと、


  1. 先頭に「adb shell sendevent」がくっついて、
  2. コロン「:」がなくなり、
  3. 3つの数字が16進が10進

の3点の違いがあります。

うーーーん、どうしようか???

ピコーーーーン!!!
そんなときの頼みの綱!!!
目の前にPCがあるではないか!!!

そうだ!!!
PCでフォーマット変換をしよう!!!

ということで、フォーマット変換のプログラムを作りました!

皆さんに使って欲しいのでオープンソースにしてあります!
ご自由にお使い頂いてどうぞ!


使い方は簡単!
/tmpにevent.txtというファイルをおきます!
そのファイルは、上のようなコマンドでとったイベントのログを
貼り付けます。
そして、上で取得したプロジェクトをビルドして、ソフトを起動します!
そうすると、/tmpにevent_c.txt
というファイルが出来上がります!

それを、

chmod +x /tmp/event_c.txt

として実行権限をつければOK!!!

後は、コマンドラインでSDK_ROOT/platform-toolsにディレクトリを移し、
/tmp/event_c.txtとコマンドラインで実行してください!

そうすれば、複数のアプリにまたがった、あるいは、複数のActivityに
またがった、トータルテストが出来るようになります!

あ!
ちなみに、これで作ったシナリオで私も「ぱすわ~ど帳(SA)」を
リリース時にテストしています!
そのときの動画がコレ!




ぱすわ〜ど帳はこういったテストを繰り返し1000回以上行って
リリースしています!


2013年1月8日火曜日

Kindle fire HD

最近何かと話題のKindleですが、実はぱすわ〜ど帳SAはKindleの
マーケットにも出しています!

Kindle Storeでも何人かのユーザーさんにご購入いただいています。
とても嬉しい事です!


さて、わいわいもKindle fire HDを入手して、早速動かしてみました!
ぱすわ〜ど帳SAが実際に動いている画面です!

ほら!
ちゃんと動くでしょ!













テストの為の画面キャプチャなので、パスワード名称がテストとなっていますが^^;;;

でも実際にこうやって動作する事は確認済みですので、
安心してお使いくださいね^^


2012年6月16日土曜日

Androidの単体テストの方法

まぁ、今さら感満載なのですが^^;;;

今日はAndroidの単体テストをする方法について記述していこうと思います。

まず、テストプロジェクトを用意します!
これはEclipseのAndroid Unit Test Projectを作成すればいいので
特に説明はいらないと思います!

あ!そうそう、一つだけ!!!
単体テストをしたいアプリのプロジェクトを指定するところが
ありますので、そこだけはちゃんと指定してください^^

さて、プロジェクトを作った後ですが、Activityをテストする
場合には、以下のように、「ActivityInstrumentationTestCase2」から
派生させてください。

で、そのクラスにテストケースを記述していく訳ですが、
命名規則(?)があります。

public void testXXXX()

のように、testから始まる関数がテストケースになります。
例えば、あるボタンの単体テストを記述する時には、
public void testButton()
などのようになるわけです。

以下にサンプルソースを乗せておきます!
サンプルでは、Acitivity1というActivityの、ボタンとオプションメニューの
動作をテストするサンプルです!
後は応用と発想力(?)です^^

この他にSDKには、モンキーテストをするためのツールもあるようです!
詳しくは調べてないのですが、
「adb ごにょごにょ monkey ごにょごにょ」
というように、コマンドラインから実行できるみたいです!

Let's Try Unit Test.

あ!
ちなみに、Androidの単体テストのベースはJUnitです!



package jp.developerwaiwai.test.test;

import jp.developerwaiwai.test.UI.Activity1;

import android.app.Activity;
import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;

public class TestCase1 extends ActivityInstrumentationTestCase2<Activity1> {

    private Activity _activity;
    private Instrumentation _instrumentation;
    
    public TestCase1() {
     super("jp.developerwaiwai.test.UI.Activity1", Activity1.class);
    }
    
    
    //テストを始める前に必要なものを記述する
    @Override
    protected void setUp() throws Exception {
     super.setUp();
    
     _activity = getActivity();
     _instrumentation = getInstrumentation();
    }
    
    //テスト後に必要な後処理を記述する
    @Override
    protected void tearDown() throws Exception {
    }
    
    
    public void testOptionMenu(){
     _instrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
     _instrumentation.invokeMenuActionSync(_activity, Activity1.optionMenuID_1, 0);
    
     assertEquals(true , true);
    }

    public void testButton1() {
     ActivityMonitor monitor = new ActivityMonitor("jp.developerwaiwai.test.UI.Activity2", null, false);
     _instrumentation.addMonitor(monitor);
    
        _activity.runOnUiThread(new Runnable() {
            private Button button1 = (Button)_activity.findViewById(R.id.button1);
            
            @Override
            public void run() {
                button1.performClick();
            }
        });
        //UIスレッドが終了するまで待つ
        _instrumentation.waitForIdleSync();
        Activity next = getInstrumentation().waitForMonitorWithTimeout(monitor, 2000);
        assertEquals(monitor.getHits(),1);
        next.finish();
        _instrumentation.removeMonitor(monitor);
        
        TextView textView = (TextView)_activity.findViewById(R.id.textview1);
        String stringOfTextView = textView.getText().toString();
        assertTrue(stringOfTextView.equals("abc"));
    
    }
}