スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

NativeDriver

NativeDriver




sciroccoを調査中に見つけた別のandroidのUIを含めた試験を出来るライブラリ。


http://code.google.com/p/nativedriver/

概要のPDFは見るべし
http://nativedriver.googlecode.com/files/NativeDriver_introduction.pdf


通常のJunitTestCaseとしてandroidのテストがかけるというのがメリット。


というわけで流してみます。
GettingsStart
http://code.google.com/p/nativedriver/wiki/GettingStartedAndroid

自分でチェックアウト方式なので、svnより取得。もうねsubclipseとかでとっちゃえばいいと思う。
それで、androidフォルダ内のbuild.xmlを実行

しばらく待つとbuildの中にいろいろと出来るけど、以下2つを利用
server-standalone.jar
client-standalone.jar


サンプルの実行
一応Manifext.MFを見ます。テスト対象のアプリケーションには以下の設定が必要です。

<instrumentation android:targetPackage="com.google.android.testing.nativedriver.simplelayouts"
android:name="com.google.android.testing.nativedriver.server.ServerInstrumentation" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />


sample-autにプロジェクトの形で入っているからeclipseにインポートします。
eclipse使ってそのままemulatorなり端末なりで実行しますが、当然adb installで実行してもいいです。
まずは、テスト対象をインストールしておく必要があります。


NativeDriverの通信(HTTP+JSON)を受け取れるようにします。
今のところ、ここが肝というかちょっと面倒なところですかね。
プロンプトで以下を実行します。/の前は、ManifestMFで指定した、targetPackageになります。


adb shell am instrument com.google.android.testing.nativedriver.simplelayouts/com.google.android.testing.nativedriver.server.ServerInstrumentation



続いて以下の様に打ちます。おまじない。

adb forward tcp:54129 tcp:54129



あとはテスト用のプロジェクト(通常のJavaプロジェクト)を作成して、android/testフォルダをコピーして配置。testをソースフォルダとして登録。
Junit3のライブラリをインポート、client-standalone.jarもついでにビルドパスに追加

で適当なテストケースを実行します。その際にandroidのテスト?それともeclipseの普通のテスト?みたいに聞かれますので、eclipseのテストを選択すればOKです。間違えてもそれとも私?とは聞いてくれません。残念。

ただやはりeclipse側で通常のJUnitと同様に実行できるのはかなりのアドバンテージに思えます。
端末にテスト用のアプリケーションを載せて、動かして、って考えると、普通に手で操作すればいいじゃないか・・・って思ってしまいますもの。まぁ複数台やるの面倒だというのはありますけどね。
QuickJUnitでぽちっと対象のテストだけ実行できたりするのも結構いいですよね。カバレッジとかはどうなんだろう?対象のクラスとの対応付けが出来ていないといえば出来ていないですかね。
ただアプリ側を変えたりすると、上記のadbコマンドなどを都度打ち直してあげないとエラーが出たりするのが面倒。

ではTextValueTestを見てみます。


public class TextValueTest extends TestCase{



通常のJunit3のテストの書き方ですね。

以下利用するNativeDriver(client)の初期化と終了処理

private AndroidNativeDriver driver;

@Override
protected void setUp() {
driver = getDriver();
}

@Override
protected void tearDown() {
driver.quit();
}

protected AndroidNativeDriver getDriver() {
return new AndroidNativeDriverBuilder()
.withDefaultServer()
.build();
}



で、実際のテストの内容

//driverを経由して、アクティビティを起動させます。
driver.startActivity("com.google.android.testing.nativedriver"
+ ".simplelayouts.TextValueActivity");


//TextView01というidのViewを取得します。
WebElement textView = driver.findElement(By.id("TextView01"));
assertEquals("Hello, Android NativeDriver!", textView.getText());

WebElement textEditView = driver.findElement(By.id("EditText01"));
//以下のキー入力を送信します。(テキストを設定するわけではありません)
textEditView.clear();
textEditView.sendKeys("this is some input");
assertEquals("this is some input", textEditView.getText());



ポイントはsendKeysですかね。。。テキストを直接設定するのではなくキー入力をプチプチ送信していく感じです。サンプルをそのまま日本語にすると残念な結果になりました。・・・日本語入力できるのかしら?

WebElementですが、実際はAndroidNativeElementの型なのでそちらで受けたほうが見た目気持ち悪くないですね。
残念ながらこちらでもうまく日本語通らないっぽいですが。

startActivityは好き好きですかね。対象のプロジェクトにパスを通して、driver.startActivity(TextValueActivity.class.getName());とするのがいいかなぁと思いましたが、そもそもActivityがないなどandroid周りの参照まで必要になっちゃうみたいですね。(platformの適当なandroid.jarを参照すればいいだけなんですが)
せっかく分離できたのにという思いが・・・
あとはID指定できるのに文字列かぁという思いもありますよね。まぁ分離しているのでしょうがないのかなぁ


ちょっとこの辺で挫折。
関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。