TestとInstrumentation

1,152 views
Skip to first unread message

fujio maruyama

unread,
Aug 11, 2010, 9:21:53 PM8/11/10
to android-g...@googlegroups.com
丸山です。

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のテスト機能、使ってください。

KAMBAYASHI Takashi

unread,
Aug 11, 2010, 10:00:18 PM8/11/10
to android-g...@googlegroups.com
丸山先生、

> Androidのテストには、Instrumentation Testという機能があります。
> Instrumentation test、日本語で何と訳せばいいか困っているのですが、
> 「実機(エミュレータ)上での操作テスト」だと思ってください。

テストしていることだけを見ると、イベント駆動型テストとかで
いいような気がしますが・・・。 ちょっとニュアンスが違いますかね?

神林

夜子まま

unread,
Aug 11, 2010, 10:07:29 PM8/11/10
to android-g...@googlegroups.com
夜子ままです

JUnit はJava開発では、かなり便利なツールなのですが、操作テストとなるとまちまちですね、
昔からいってますが、テストプログラムでバグがでるようなテストはテストじゃないし、
テストプログラムのためのテスト工数なんてあってほしくないです。

希望としては、Dalivkじゃないと動かないプログラムがPC上でエミュレーターを起動しなくても
ちゃんと動作するのであれば、非常に便利だとおもっています。

要するにメソッド単位のテストで、Inputになるデータのモックが作成できればいいのですが。

以前、AndroidのJUnitをつかったことのがあるのですが、使い方がわるいのか起動でエラー
がでてしまったので環境の設定がややこしいなという印象をうけました。

せっかくなので、暇をみてじっくりつかえるかどうか試してみようとおもっています。


2010年8月12日11:00 KAMBAYASHI Takashi <kambayash...@lab.ntt.co.jp>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


ゆうしぐ

unread,
Aug 12, 2010, 1:20:41 AM8/12/10
to 日本Androidの会
丸山先生、
いつもお世話になっております、横浜支部所属のゆうしぐと申します。

様々呼び名はあるかと思われますが、
Instrument test
→シナリオテスト
と読んでいます。

参考までに。
> この例は、以下のページから借用したものです。http://www.netmite.com/android/mydroid/development/pdk/docs/instrumen...

fujio maruyama

unread,
Aug 12, 2010, 11:34:38 AM8/12/10
to android-g...@googlegroups.com
丸山です。

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>:

fujio maruyama

unread,
Aug 12, 2010, 12:20:36 PM8/12/10
to android-g...@googlegroups.com
丸山です。

> テストプログラムのためのテスト工数なんてあってほしくないです。

僕の友人からも、個人的に、こんなメールがありました。

> でも結局、このテストコードを誰が書くんだとみんな思うような気がするんですよね。。
> テストコード書くのに時間がかかりすぎるというか。

そうなんでしょうね。
現実的には、むずかしいところですね。

僕は、テストコードは必要だと思っています。
ただ、それが開発者に、大きな負担を与えては、いけないですね。

皆さんは、どうしていますか?

Webアプリの世界では、Seleniumとかありますし、SpringのRooでは、
テストは、自動的に生成されて、自動的に実行されます。


2010年8月12日11:07 夜子まま <hijirin...@gmail.com>:

Lewske Wada

unread,
Aug 13, 2010, 3:07:29 AM8/13/10
to android-g...@googlegroups.com
fujio maruyama wrote :

> こうしてみたら、意味が取りやすいと思います。
>
>> パッケージ java.lang.instrument
>> Java プログラミング言語エージェントが JVM 上で実行されているプログラムを、機器上で
>> 利用できるよう にするサービスを提供します。
>>
>> Instrumentation このクラスは、Java プログラミング言語コードを機器上で利用するための
>> サービスを提供します。
>>

むかし計測器業界だったので言いますが, instrument だけでも
計器あるいは計測器という意味になります. Measurement instrument まで
いわなくてもいいです.

Cheers,
Lewske "Ryu" Wada
Web: http://run.sh/
Email: r...@run.sh
Facebook: Lewske Wada
ICQ: 348990359

fujio maruyama

unread,
Aug 14, 2010, 1:36:14 AM8/14/10
to android-g...@googlegroups.com
> むかし計測器業界だったので言いますが, instrument だけでも
> 計器あるいは計測器という意味になります. Measurement instrument まで
> いわなくてもいいです.

なるほど。

2010年8月13日16:07 Lewske Wada <r...@run.sh>:

Reply all
Reply to author
Forward
0 new messages