Androidのテスト環境について、もうすこし述べたいと思います。
別のメールで、JUnitを使ったことがある人は、Androidのテスト使って
みてくださいと書いたのですが、JUnit使ったことがある人なら、あれは
Androidのテストでは、あまり役に立たないと感じている人もいるかも
しれません。
というのも、Androidで皆さんが主にテストしたいのは、このボタンを
押したら、画面の状態がどう変わるかというようなことで、そんな動的
なチェックは、JUinitでは難しいからです。
でも大丈夫です。
Androidのテストには、Instrumentation Testという機能があります。
Instrumentation test、日本語で何と訳せばいいか困っているのですが、
「実機(エミュレータ)上での操作テスト」だと思ってください。
正確に言うと、Instrumentationというのは、Java1.5から導入された
java.lang.instrument パッケージに基づいた機能で、主に、Javaのクラスを
書き換えるのにつかわれます。
テストするのに、何でJavaのクラスを書き換えるのか?
右と左に二つのボタンがあるAndroidのアプリがあったとします。
左のボタンにFocusがあった時に、右矢印キーが押されたら、
Focusは、右ボタンに移るというプログラムを作りたいとします。
この動作の確認のために、普通は、実際に人間が右矢印キーを押して
動作のチェックをします。でも、Androidが、右矢印キーが押されたことを
認識するのは、右矢印キーが押されたという「イベント」が発生した時です。
逆に言えば、人間が右矢印キーを実際に押そうが押すまいが、
右矢印キーのイベントが発生すれば、Androidは右矢印キーが
押されたと思って反応します。
Instrument testは、この場合は、もとのクラスに、人工的に、
右矢印キーが押されたというイベントを発生させるコードを、こっそり
挿入して、もとのクラスを書き換えます。
このクラスを実行すると、Androidはだまされて、人間が右矢印キーを
押した時と正確に同じように反応します。あとは、本当に右ボタンに
Focusが移ったかチェックすればいいのです。
Instrumentation testのコードは、この場合、次のようになります。
public void testFocusMovesToRight() throws Exception {
assertTrue(mLeftButton.hasFocus());
getInstrumentation().sendCharacterSync(KeyEvent.KEYCODE_DPAD_RIGHT);
Button rightButton = (Button)
getActivity().findViewById(R.id.rightButton);
assertTrue(rightButton.hasFocus());
}
最初の assertTrue(mLeftButton.hasFocus()); は、左ボタンにFocusが
あるかを確認しています。
大事なのは、次の、 getInstrumentation().sendCharacterSync(KeyEvent.KEYCODE_DPAD_RIGHT);
です。ここで、Instrumentation Frameworkは、人工的に右矢印キーが押されたという
キー・イベントを発生させています。
最後の assertTrue(rightButton.hasFocus());は、テストの目的の、
本当に、右ボタンにFocusが移ったかのチェックです。
この例は、以下のページから借用したものです。
http://www.netmite.com/android/mydroid/development/pdk/docs/instrumentation_testing.html
実際に、人間が実機上で、いろいろ操作してテストしなくても、プログラムだけで
同じことが出来ること、分かりましたか? この機能は、とても強力なものです。
これまで、人力で時間をかけて行ってきた、いろいろなテストが、あっという間に終わります。
(エラーがなかった場合ですが)
開発・テストのサイクルに、是非、Androidのテスト機能、使ってください。
> Androidのテストには、Instrumentation Testという機能があります。
> Instrumentation test、日本語で何と訳せばいいか困っているのですが、
> 「実機(エミュレータ)上での操作テスト」だと思ってください。
テストしていることだけを見ると、イベント駆動型テストとかで
いいような気がしますが・・・。 ちょっとニュアンスが違いますかね?
神林
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
Instrumentationの日本語訳について、いくつかポストがありました。
ゆうしぐさん
> 様々呼び名はあるかと思われますが、
> Instrument test
> →シナリオテスト
> と読んでいます。
神林さん
> テストしていることだけを見ると、イベント駆動型テストとかで
> いいような気がしますが・・・。 ちょっとニュアンスが違いますかね?
java.lang.insrument については、「計測」という言葉が
使われることもあるようですね。ただ、次の翻訳は、どうも、日本語としてしっくりきません。
> パッケージ java.lang.instrument
> Java プログラミング言語エージェントが JVM 上で実行されているプログラムを計測できるよう> にするサービスを提供します。
> Instrumentation このクラスは、Java プログラミング言語コードを計測するためのサービスを提供します。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/instrument/package-summary.html
確かに、Instrumentationは、技術用語としては、「計測」あるいは「計装」と訳されるようです。
http://en.wikipedia.org/wiki/Instrumentation
ただ、JavaDocの翻訳でも、Instrumentationが、すべて「計測」と訳されている訳ではない
ようです。
> このクラスは、Java プログラミング言語コードを計測するためのサービスを提供します。
> インストゥルメンテーションとは、ツールで使用するデータを収集することを目的として
> メソッドにバイトコードを追加することです。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/instrument/Instrumentation.html
instrumentが「計測する」、instrumentationは「インストゥルメンテーション」になっていますね。
後者の「ツールで使用する」という説明は重要だと思います。instrumentは、もともと
「器具」とか「器具を使用する」という意味を持ちますから。音楽のinstrumentalも、器楽演奏
です。
JavaDocの「計測」、あまりいい翻訳じゃないと思います。
こうしてみたら、意味が取りやすいと思います。
> パッケージ java.lang.instrument
> Java プログラミング言語エージェントが JVM 上で実行されているプログラムを、機器上で
> 利用できるよう にするサービスを提供します。
> Instrumentation このクラスは、Java プログラミング言語コードを機器上で利用するための
> サービスを提供します。
> instrumentationとは、ツールで使用するデータを収集することを目的として
> メソッドにバイトコードを追加することです。
これはこれで、すっきりします。
Instrumentation Test 「機器利用テスト」と訳して、いいんじゃないかしら?
2010年8月12日11:00 KAMBAYASHI Takashi <kambayash...@lab.ntt.co.jp>:
> テストプログラムのためのテスト工数なんてあってほしくないです。
僕の友人からも、個人的に、こんなメールがありました。
> でも結局、このテストコードを誰が書くんだとみんな思うような気がするんですよね。。
> テストコード書くのに時間がかかりすぎるというか。
そうなんでしょうね。
現実的には、むずかしいところですね。
僕は、テストコードは必要だと思っています。
ただ、それが開発者に、大きな負担を与えては、いけないですね。
皆さんは、どうしていますか?
Webアプリの世界では、Seleniumとかありますし、SpringのRooでは、
テストは、自動的に生成されて、自動的に実行されます。
2010年8月12日11:07 夜子まま <hijirin...@gmail.com>:
むかし計測器業界だったので言いますが, instrument だけでも
計器あるいは計測器という意味になります. Measurement instrument まで
いわなくてもいいです.
Cheers,
Lewske "Ryu" Wada
Web: http://run.sh/
Email: r...@run.sh
Facebook: Lewske Wada
ICQ: 348990359
なるほど。
2010年8月13日16:07 Lewske Wada <r...@run.sh>: