単体テストをしたくなることもあろう。
そういうときには、JUnit。
と書いてみたが、使ったことはない・・・。
eclipseでなるべくやってみよう。
新規プロジェクト作成。これはテスト対象のプロジェクト。
デフォルトのまま使うことにする。

ここでNextを押すと・・・
左上に、「Create a Test Project」が出てくる。
が、今回は「後から追加する」イメージでやってみる。

Finishすると、eclipseのプロジェクト画面に戻る。
赤いマークがでているのは、genディレクトリ以下が見つからなかったためだろう。
自動ビルドにてgen以下を生成してくれるので、実は問題ないのだが、気になる。
これは、プロジェクトのPropertiesを開いて、OKすると消える(プロジェクト名を右クリックして出てくるコンテキストメニューの一番下にある)。
F5で更新しても消えなかったから、何か更新する必要があるということか。
よくわからん。

左側のプロジェクト(パッケージ?)をマウスで選んで右クリック。
下の方に「Android Tools」があるので、開く。
開くと「New Test Project...」があるので、選択。
ダイアログが出てくる。
ここで「Test Target」を選ぶと、他の空欄を埋めてくれる。
「This project」でもよさそうな気はするのだが、Browseから選ばないとうまくいかないように見える。

Finishすると、プロジェクトが追加される。
さっきと同じく赤いマークがついているのが気にくわないが、今回はPropertiesでやることがあるので、それで解決できるだろう。

・・・と思ったら、自動でそこまでやっていた。
生成したテスト用プロジェクトのPropertiesを選び、「Java Build Path」を選択。
タブの「Projects」を選び、ここにテスト対象のプロジェクトを追加する必要があるのだ。
あるのだけど、やってくれるのね。。。

さて、ここまでは何とかなる。
問題はここからだ。
Androidのサンプルにはtestsの下にテストが書いてあるので、まねをしよう。
まねをするだけなのだが、ApiDemosとHelloActivityでは作りが違う。
ApiDemosにはAllTestsがあるのだけど、HelloActivityにはHelloActivityTestしかない。
「俺はActivityしかテストしないぜ」と主張している。
ApiDemosは、私の中ではちょっと毛色が違ったアプリという扱いになっている。
他のはActivityを継承するが、ApiDemosはApplicationを継承している。
まあ勉強不足なので、Applicationは後回しにしよう。
何となく、Activityが1つのときと、複数の時で作り方が違うんじゃないか、という気がするが、それはそのときでよかろう。
しかし・・・HelloActivityTest.javaを見るとわかるが、中身はスカスカだ。
テストしてない。
なので、ここからはAndroid Wiki*さんを参考に。
eclipseから新規追加で「JUnit Test Case」を選択。

順番はよくわからんけど、「Class under test」を追加。
たぶん、テスト対象のクラスだと思う。
Browseを選んでも何も出てこない…ので、文字を入力する必要がある。
これになかなか気付かなかった。

そのあと、「Superclass」。
これはデフォルトで埋まっていたのだが、AndroidではAndroid用のを使うとよさそうだ。
どれかわからないので、Android Wiki*にもあり、ApiDemosにもあった「ActivityInstrumentationTestCase2」を選択。
AndroidのサンプルにはActivityInstrumentationTestCaseという「2」がないやつになってるけど、もう推奨されていないらしい。
Android Wiki*の説明によると、これは「Activityの機能テストを行う」らしい。
他のは、単体テスト用。
ApiDemosの下の方では、それらを使ったテストになっていた。
まあ、テストの中身についてはまた考えよう。
「そんなSuperclassはないぞ」と言われているが、無視。
setUp()とtearDown()にチェックをし、Nameを適当に(今回は「HelloActivityTest01」)につけた。
そしてNext。
今度は、テストするメソッドを選択するようである。
HelloActivity.onCreate()にチェック。

Finishすると、プロジェクトに戻る。
eclipseに頼るのは、ここまで。
あとは手でぽちぽちとやらねばならぬ。
まず、追加したTestCaseが怒られているので、何とかせねば。
テンプレート(というのかな?)のtypenameに当たる部分が「T」のままなので、テスト対象のクラス名にしてやる。
ここでは「HelloActivity」。
(ここにきて「HelloAndroidクラスじゃないことに気付く・・・。まあいいや。)
そうすると、今度は「HelloActivityなんか知らない」とおっしゃる。
まずは何も考えずに、Ctrl+Shift+O。
テスト対象クラスへのimportを追加してくれたので、よし(あ、これはeclipseの機能か)。
しかし、また赤マークがついている。
今度はコンストラクタがないとのこと。
赤マークのところにマウスを持っていくと、「add constructorなんちゃら」と書いてあるので、クリックしてみよう。
・・・追加されたけど、Android Wiki*のと違う・・・
よくわからないので、このままやってみて、だめなら修正しよう。
では、ここまでで赤マークが消えたと思うので、動かしてみよう。
まずは、HelloAndroidプロジェクトで右クリックして、「Run As→1. Android Application」。
エミュレータがのしのしと起動して、こんな画面が出てくる。

さて、次はTestアプリ。
これもeclipseからHelloAndroidTestプロジェクトで右クリックして、「Run As→2. Android JUnit Test}。
動いているかどうかは、eclipseのConsoleを見るしかない。
最後に「HelloAndroidTest]Test run complete」と出てくれば、動いたのだろう。
が、これでは何かわからん。
そもそも、テストケースは追加したものの、テスト自体は何もしていない。
testOnCreateBundle()というメソッドに「fail」があるから、失敗しそうなのだが、それすらもわからない。。。
ということは、さっきのコンストラクタか?
public HelloActivityTest01() {
super("jp.justblog.hirokuma.HelloActivity", HelloActivity.class);
}
こんなコンストラクタを追加した。
第1引数はクラスまでのフルパス。第2引数はテスト対象のクラス。
これで動かすと・・・

おお、失敗している。
というわけで、コンストラクタは自分で追加しなくてはならない。
しかし、ActivityInstrumentationTestCase2のコンストラクタは引数2つなのになぁ。
なんで引数なしコンストラクタが有効なのだろう?
Javaの言語ルールなのか、JUnitのルールなのか、AndroidのJUnitルールなのかは気になるところだ。
ちなみに、成功するとこんな画面だ。

最近のコメント