ScalaとAndroidとUnitテスト

[前回](http://qiita.com/daneko0123/items/c255964a53bee9b15e00)はとりあえずScalaでAndroid開発が出来そう！ってところで終わりました。

でも開発するにはあれですよね、(Developer)Testがやりやすいというのも重要ですよね

ってことでとりあえずやってみた結果が[こちら](https://github.com/daneko/android-scala-unit-test-sample)

## Android特有のテストに関して

src下の instrumentTest に配置することで、`sbt android:test`で動かせます

Ant Styleの場合はsrcと並列に tests ディレクトリを作成して同様にやればOKです

フツーならtest側にもAndroidManifest.xmlが必要ですが、[android-sdk-plugin](https://github.com/pfn/android-sdk-plugin)が適当に補完してくれるので特に配置する必要は無いです

もちろん配置してもOKです

[android:debug-includes-tests](https://github.com/pfn/android-sdk-plugin/blob/1.2.11/README.md#new-features-in-12x-last-version-1211) を false にすると自分でどうにかしないとダメなのかな？


これでscalaでめでたくテストが…

とは言うものの、

```scala
class SimpleLogicTest extends TestCase {

  def testAddOne(): Unit = {
    assertEquals(2, SimpleLogic.addOne(1))
  }
}
```

みたいなのを書いても、なんかそんなに嬉しくないですね…

ただでさえ、Emulatorやら実機やらにテスト用のapk差し込む時間があるのに…

出力はこんなの

![JUnit](https://qiita-image-store.s3.amazonaws.com/0/1221/ca5d5293-a6a1-b15e-6bce-78fa42271aaf.png)

さてどれがテスト結果でしょう

みたいな。

そういやこんなのだったっけ？？

## specs2とかを使ってAndroidとは関係のない部分をテストする

普段Scala等に飼い慣らされていると、フツーの、しかもJUnit3ベースのテストケース書いても「なんだかなぁ…」という気持ちでイッパイになるかと思います

かと言って、なんにも考えずに

```scala
libraryDependencies ++= Seq(
  "org.specs2" %% "specs2" % "2.3.10" % "test"
)
```

みたいな感じで依存関係追加しても解決しません(´・ω・｀)ｼｮﾎﾞｰﾝ

[拙い英語力で読むと](https://github.com/pfn/android-sdk-plugin/blob/1.2.11/README.md#new-features-in-12x-last-version-1211) libraryDependencies in test に期待してても依存性に追加しねーから。どうしても使いたければ普通に追加しろよ！(要は"2.3.10" % "test" のtestを除去すれば良い)

だってprogurdでどうせ使わないやつは除外されるしいいでしょ？

みたいな感じでしょうか。


### テスト用に普通のProjectを作る

というわけでTestだけをするためにフツーのSBTプロジェクト作ってそいつがAndroidのプロジェクトに対してTestすりゃいいんじゃね？？

ということでやったのが今日のやつです

結果

```sh
sbt testProject/test
```

とか叩けば、なんと！Android動いてなくてもOK！

出力結果はこちら

![Specs2](https://qiita-image-store.s3.amazonaws.com/0/1221/e59c8071-9a38-aabc-2b72-ad00430be62d.png)

これでAndroidに依存しない部分はガシガシ動作確認出来ますね！


## Androidに依存する部分もspecs2とか使いたい…けど

使いたいですがどうすれば良いんでしょ。

[readmeの後半](https://github.com/pfn/android-sdk-plugin/blob/1.2.11/README.md#advanced-usage) に "Unit testing with robolectric, see my build.scala for this configuration:" みたいな感じで書かれているんですけど

その直後に、「でもこれもう1年近く触ってねーから」とか書いてあったりして、ちょっとよくわかんないですね。

あと[RobolectricSuite.scala](https://gist.github.com/pfn/2662806)なるものへのリンクも貼ってあるのですが…

なのでrobolectricと合わせて上手に使える方法が見つかれば大変ハッピーになれそうな予感だけはしています

ので、だれかご教授お願い致します…


## 感想

* テストコードが分散してしまう
* 挙句Androidに依存する部分は結局Junitベース
* それ以前になんかもっとある程度ちゃんとしたアプリの状態で試したほうがよいのでは…

とか色々あるけど

<blockquote class="twitter-tweet" lang="ja"><p>どうせAndroidTestCaseやInstrumentationTestCase使うことも少ないだろうし、Androidに依存しないような部分のテストさえ書きやすけりゃどうでもいいか <a href="https://twitter.com/search?q=%23%E6%9A%B4%E8%A8%80&amp;src=hash">#暴言</a></p>&mdash; 駄猫（社内ニート） (@daneko0123) <a href="https://twitter.com/daneko0123/statuses/443369130410799105">2014, 3月 11</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

という個人的なダメな思いもあるのでいいや


そうそう、[android-plugin](https://github.com/jberkel/android-plugin)を使った[g8のテンプレート](https://github.com/mackler/android-app.g8)だと、これと逆な作りになってましたよ

android-pluginとandroid-sdk-pluginどっちを使うのが良いのだろう…
→ コメント頂いている通り、現状後者のほうは結構マメにupdateされています

## とは言うものAndroidに多少は依存した部分もどうにかしたい

2014/05/10 追記

基本は依存する部分、しない部分を出来る限り分けたいですが、
それでも限度ありますよね。

ましてや依存する部分でも「ほぼ単なるロジックなんだよねこれ…」とかもあるかと

もちろんActivityとかに対するテストも含めてきちんと[robolectric](http://robolectric.org/)対応とかすればよいのですが、
とりあえず下記を試す価値があるかもしれません。

```scala
libraryDependencies ++= Seq(
  "org.specs2" %% "specs2" % "2.3.10" % "test",
  "org.robolectric" % "android-all" % "4.4_r1-robolectric-0"
)
```

あまり深く考えずに足してみたら割とうまいこと動いたので個人の備忘までに

上にも書いてますが、そのうち…そのうちちゃんとrobolectric対応を調べる…