最初、EclipseでJunit 4.11+Robolectricを使ってたんだけど、AndroidStudioに移植した時に、全部グリーン状態のソースを移植したのでテストコードは省いてたw
なので、機能追加のついでに、テストコードも移植しようと思ったんだけど、意外な展開が。
!!! JUnit version 3.8 or later expected:
java.lang.RuntimeException: Stub!
<中略>
Process finished with exit code -3
素直にRobolectricを依存ライブラリに追加して実行して、なにこれ???というわけで色々と調査。で、判ったことは
- Android StudioでRobolectric使うならプラグインいれましょう
- クラスパスはJunit>SDKの順番でライブラリ参照しましょう
あふー、gradleをいじる羽目になりましたですよorz 書き直すのメンドイなー。
RobolectricスタッフのブログやGoogleGroupを見る限りだと、この辺りの問題はできたら解決したいなー的レベルらしくて、しばらくは手動でごにょごにょの世界のようです。まぁAndroid Studio自身がbetaの立場だもんなー、正式版になってからなんだろうなぁ(遠い目)
で、やってみたこと。
- app/build.gradleにrobolectricの依存ライブラリ追加
- ルートのbuild.gradleにrobolectricのプラグインのための依存ライブラリ追加
- app/buid.gradleにrobolectircのプラグイン追加
- ここで、いったんgladleをSync
- ターミナルから、プロジェクトルートでgladle robolectric を実行し、必要なクラスがコンパイルされていることを確認
- テストコードを書いて、ライブラリが追加出来ていることを確認
- テストコードから生成されたクラスの出力先をクラスパスに追加
- プロジェクトルートにある、.imlファイルの中にあるクラスファイルの読み込み順番を変更
- gladlew androidTest を実行
さらっと書いたけど、2から5の間はgradleソースの読み込みだったので、簡単じゃなかったよorz gradleソースはpom.xmlよりも何をやっているのかソースで追える分、楽と言えば楽だし、親切と言えば親切なんだけどね。やっててよかったgroovy。
そして、何とかたどり着く9のフェーズ。ここで恐怖のハマりポイント、自クラスをクラスパスにうまく追加できない、をやらかしてしまった。いや、世界には、この方法で解決している人もいるので(成功例がMacOSXだったりするのがとてもとても気になるけれどもw)きっと、何かが悪いんだろう。
収穫はgradleソースが読めるようになった、ってことで、挫折orz
これに丸々二日ハマって、なんか疲れたんで、基本に立ち返ってみたんだ。
Android SDK にテストフレームワークがあるのかな?
結論から言えば、ある、Junitがある。ただし、バージョンは3.8。便利なassertもアノテーションも全滅のオールドタイプさん。まぁ悪いバージョンじゃないんだ、基本機能はガッチリ揃ってるし、実績も高いしさ。まさかとは思うけど、Mavenリポジトリサイトで、Junit3.8のダウンロード数が廃れないのは、こいつのせいだったりしてねw
Testing Fundamentals | Android Developers:
http://developer.android.com/tools/testing/testing_android.html
基本に立ち返って、もう一度、この記事を目皿にして読み直し、抜粋したポイントは
- ディレクトリを作成する
- テストしたいAndroidオブジェクトに対応したTestCaseを継承してテストコードを書く
- Android Test を実行する
これだけ。じゃ、やってみようか、もちろん、最初はレッドのテストでね。
まず、ディレクトリ作成
デフォルト配色で、androidTest/javaフォルダが緑色になればOK。これは、テストクラスのあるパッケージディレクトリですよ、を指している色で、これが指定されていないと、後の作業がメンドクサイ、フォルダ見難いw
このフォルダの指定は、モジュールの.imlファイルに記述されているので、検索してフォルダ表記が無かったら、それを記述追加してリビルドすれば環境ができているはず。できるだけ、いじらないでいたいなら、テストクラスとして指定されている別のフォルダがすでにあれば、それを新規作成すると後も綺麗に続けられるので楽。テストクラスのパッケージフォルダ記述が無いなら、仕方ないから追加ね。
そして、テストクラスを新規作成。これはいつもの新規作成の手順でOK。
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
public void testAssertion(){
assertEquals(1,3);
}
}
絶対レッドのテストw<手抜きすぎw
今回はアクティビティやコンテンツのテストではないので、ApplicationTestCaseを継承したけど、テストしたいものによって継承するテストクラスが異なるので、細かい事は前記述のサイトのリンクから参照で。(そのうち、まとめるとは思うけどw)
クラスが書けたら、次は実行設定。私は、モジュール内のxxxxTestクラスのtestXXXXメソッドを総なめにした。細かくやりたい人はパッケージ事とかに分けると良いと思う。
Android SDKのJunitは実行環境を必要とするのでエミュレーターは起動しておき、立ち上がりを確認したら、テストを実行してエミュレーターに環境割り当てをすると、テストモジュールがエミュレーターにアップロードされて……
よっしあぁ!レッドすねぇぇくかもぉぉん♪
というわけで、立ち返ってからレッドになるまで、2時間だったというオチw
基本って大事だね! 痛感したわ。