前回はとりあえずScalaでAndroid開発が出来そう!ってところで終わりました。
でも開発するにはあれですよね、(Developer)Testがやりやすいというのも重要ですよね
ってことでとりあえずやってみた結果がこちら
Android特有のテストに関して
src下の instrumentTest に配置することで、sbt android:test
で動かせます
Ant Styleの場合はsrcと並列に tests ディレクトリを作成して同様にやればOKです
フツーならtest側にもAndroidManifest.xmlが必要ですが、android-sdk-pluginが適当に補完してくれるので特に配置する必要は無いです
もちろん配置してもOKです
android:debug-includes-tests を false にすると自分でどうにかしないとダメなのかな?
これでscalaでめでたくテストが…
とは言うものの、
class SimpleLogicTest extends TestCase {
def testAddOne(): Unit = {
assertEquals(2, SimpleLogic.addOne(1))
}
}
みたいなのを書いても、なんかそんなに嬉しくないですね…
ただでさえ、Emulatorやら実機やらにテスト用のapk差し込む時間があるのに…
出力はこんなの
さてどれがテスト結果でしょう
みたいな。
そういやこんなのだったっけ??
specs2とかを使ってAndroidとは関係のない部分をテストする
普段Scala等に飼い慣らされていると、フツーの、しかもJUnit3ベースのテストケース書いても「なんだかなぁ…」という気持ちでイッパイになるかと思います
かと言って、なんにも考えずに
libraryDependencies ++= Seq(
"org.specs2" %% "specs2" % "2.3.10" % "test"
)
みたいな感じで依存関係追加しても解決しません(´・ω・`)ショボーン
拙い英語力で読むと libraryDependencies in test に期待してても依存性に追加しねーから。どうしても使いたければ普通に追加しろよ!(要は"2.3.10" % "test" のtestを除去すれば良い)
だってprogurdでどうせ使わないやつは除外されるしいいでしょ?
みたいな感じでしょうか。
テスト用に普通のProjectを作る
というわけでTestだけをするためにフツーのSBTプロジェクト作ってそいつがAndroidのプロジェクトに対してTestすりゃいいんじゃね??
ということでやったのが今日のやつです
結果
sbt testProject/test
とか叩けば、なんと!Android動いてなくてもOK!
出力結果はこちら
これでAndroidに依存しない部分はガシガシ動作確認出来ますね!
Androidに依存する部分もspecs2とか使いたい…けど
使いたいですがどうすれば良いんでしょ。
readmeの後半 に "Unit testing with robolectric, see my build.scala for this configuration:" みたいな感じで書かれているんですけど
その直後に、「でもこれもう1年近く触ってねーから」とか書いてあったりして、ちょっとよくわかんないですね。
あとRobolectricSuite.scalaなるものへのリンクも貼ってあるのですが…
なのでrobolectricと合わせて上手に使える方法が見つかれば大変ハッピーになれそうな予感だけはしています
ので、だれかご教授お願い致します…
感想
- テストコードが分散してしまう
- 挙句Androidに依存する部分は結局Junitベース
- それ以前になんかもっとある程度ちゃんとしたアプリの状態で試したほうがよいのでは…
とか色々あるけど
どうせAndroidTestCaseやInstrumentationTestCase使うことも少ないだろうし、Androidに依存しないような部分のテストさえ書きやすけりゃどうでもいいか #暴言
— 駄猫(社内ニート) (@daneko0123) 2014, 3月 11
という個人的なダメな思いもあるのでいいや
そうそう、android-pluginを使ったg8のテンプレートだと、これと逆な作りになってましたよ
android-pluginとandroid-sdk-pluginどっちを使うのが良いのだろう…
→ コメント頂いている通り、現状後者のほうは結構マメにupdateされています
とは言うものAndroidに多少は依存した部分もどうにかしたい
2014/05/10 追記
基本は依存する部分、しない部分を出来る限り分けたいですが、
それでも限度ありますよね。
ましてや依存する部分でも「ほぼ単なるロジックなんだよねこれ…」とかもあるかと
もちろんActivityとかに対するテストも含めてきちんとrobolectric対応とかすればよいのですが、
とりあえず下記を試す価値があるかもしれません。
libraryDependencies ++= Seq(
"org.specs2" %% "specs2" % "2.3.10" % "test",
"org.robolectric" % "android-all" % "4.4_r1-robolectric-0"
)
あまり深く考えずに足してみたら割とうまいこと動いたので個人の備忘までに
上にも書いてますが、そのうち…そのうちちゃんとrobolectric対応を調べる…