月別: 2014年10月

Android StudioでRobolectricを使いJUnit4によるユニットテストを行う

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

Android StudioでJunit4を使ったテストを実行する方法は、今のところ2通りあるみたいです。

  • TestRunnerを指定して行う(android-junit4を使う)
  • Robolectricを使う

TestRunnerを指定した方法だと、IDEでテストの実行結果が確認できるので便利です。ただし、設定がややこしいのが不便なところです。簡単に取り込める方法があれば教えて欲しいです。

対してRobolectricを使う場合は、テストの実行結果をブラウザで確認しなければならないというデメリットはありますが、導入方法が比較的簡単です。今回はRobolectricを使ってJunit4によるユニットテストを実施する手順を紹介します。

Qiitaのこちらの記事があってようやくまともに入れることができました。感謝感謝。

1. プロジェクトを作成する

Android StudioのメニューからFile > New Projectを選択し、新規プロジェクトを作成します。単にプロジェクトを作成するだけです。別に既存のプロジェクトを使うなら飛ばして問題無いです。

2. build.gradleの編集

プロジェクトルートのbuild.gradleにclasspath 'org.robolectric:robolectric-gradle-plugin:0.13.+'を追記します。(app/build.gradleではないです)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.13.2'
        classpath 'org.robolectric:robolectric-gradle-plugin:0.13.+'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

新規プロジェクトの場合、build.gradleがこうなればOKです。(この例ではAndroid Studio 0.8.14を使っています)

3. app/build.gradleの編集

やることは3つです。

  • apply plugin: ‘robolectric’の追加
  • dependenciesの追加
  • robolectricディレクティブの追加

apply pluginの追加

app/build.gradleの2行目(apply plugin: 'com.android.application'のすぐ下)にapply plugin: 'robolectric'を追加します。

dependenciesの追加

RobolectricとJunit4を追加をします。

    androidTestCompile 'org.robolectric:robolectric:2.3'
    androidTestCompile 'junit:junit:4.11'

robolectricディレクティブの追加

robolectric-gradle-pluginのサンプルを利用してコピペします。

そのままだとGradle Syncがうまくいかないので、一部削除しています。

robolectric {
    // configure the set of classes for JUnit tests
    include '**/*Test.class'
    exclude '**/espresso/**/*.class'

    // configure max heap size of the test JVM
    maxHeapSize = '2048m'

    // configure whether failing tests should fail the build
    ignoreFailures true

    // use afterTest to listen to the test execution results
    afterTest { descriptor, result ->
        println "Executing test for {$descriptor.name} with result: ${result.resultType}"
    }
}

最終的にapp/build.gradleはこんな感じになります。

apply plugin: 'com.android.application'
apply plugin: 'robolectric'

android {
    compileSdkVersion 21
    buildToolsVersion "21.0.2"

    defaultConfig {
        applicationId "jp.gcreate.sample.samplerobolectric"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
    androidTestCompile 'org.robolectric:robolectric:2.3'
    androidTestCompile 'junit:junit:4.11'
}

robolectric {
    // configure the set of classes for JUnit tests
    include '**/*Test.class'
    exclude '**/espresso/**/*.class'

    // configure max heap size of the test JVM
    maxHeapSize = '2048m'

    // configure whether failing tests should fail the build
    ignoreFailures true

    // use afterTest to listen to the test execution results
    afterTest { descriptor, result ->
        println "Executing test for {$descriptor.name} with result: ${result.resultType}"
    }
}

JUnit4によるテストをしてみる

とりあえずJUnit4を使ったテストができるか試してみます。ここではTrueを返すだけのtest()メソッドを持ったクラスを作ります。

テスト対象クラス

public class Sample {
    public boolean test(){
        return true;
    }
}

テストコードを作成する

androidTest/java/(パッケージ)/SampleTest.javaを作成します。勝手が分かっている方なら直接作った方が早いと思います。が、今回はIDEにある程度作って貰う方法を紹介します。

作成したテスト対象クラス(今回はSample.java)をエディタで開いた状態で、右クリックしGo To > Testを選びます。

右クリックGoTo Test

その後小さいダイアログが出てくるので、Create New Testをクリックします。

Create New Test

そうするとテストコードを自動生成してくれるウィザードが立ち上がるので、JUnit4を選んでやります。(他にもJUnit3やら作成してくれます)

Create TestでJUnit4を選ぶ

画像はSampleTestTestになっていますが、今回の例で言うとSampleTestになっているはずです。(SSとったときは対象クラスの名前がSampleTestだったんです・・・)

JUnit4にチェックを付ける以外は特に何もしなくてOKです。Memberのところにチェックをつけると、自動的にテストメソッドまで作ってくれます。

その後、テストコードをどこに配置するか聞いてくるので、androidTestとなっているディレクトリを選んでやればOKです。(デフォルトで選ばれているディレクトリを指定してやれば大丈夫だと思います)

androidTestとなっているディレクトリを選ぶ

後は作成されたテストコードのクラス名の前に、@RunWith(RobolectricTestRunner.class)を追記します。

テストコードはこんな感じになりました。

import org.junit.Test;

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.*;

@Config(emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)
public class SampleTest {

    @Test
    public void とりあえず失敗するテスト(){
        Sample sut = new Sample();
        assertThat(sut.test(),is(false));
    }

    @Test
    public void とりあえず成功するテスト(){
        Sample sut = new Sample();
        assertThat(sut.test(),is(true));
    }

isが赤字になってしまいますが、org.hamcrest.core.Is.isをstatic importすればOKです。

実行はターミナルで./gradlew clean testと入力してエンターです。(gradlewが置いてあるディレクトリで実行すること)

毎回コマンドを打つのが面倒くさい場合、Android StudioのメニューからRun > Edit configrations ...で+ボタンを押しGradleを追加、Gradle Projectにプロジェクトルートを追加、Tasksにclean testと入力したものを作ります。後はGUIからこれを選んで実行してやれば、毎回コマンド入力しなくても同じことができます。

Edit configrationsでGradleを追加

Gradle projectにプロジェクトルートを選択、Tasksにclean testを入力

作成したGradle実行環境を選んで再生ボタン押す

テストの結果はプロジェクトルート/app/build/test-report/debug/index.htmlに出力されます。いちいちブラウザで確認しないといけないのは若干面倒くさくはあります。

ちなみに初期状態で作られているApplicationTest.javaのせいで余計なエラーが出ます。

JUnit4実行結果

ApplicationTest.javaを削除すれば出てこなくなります。

@Config(emulateSdk = 18)について

targetSdkVersionを19以上にしていると、Robolectric does not support API level 19, sorry!というエラーが表示されます。この場合は、テストコードに@Config(emulateSdk = 18)@RunWithの前に追記することで回避できます。

API19以上に依存するクラスをテストしたい場合は、Robolectricが対応するのを待つか、それまではRobolectricを使わずにテストするしかないみたいです。

参考:Stack over flow

Android StudioでJDKのパスを指定する

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

久しぶりにAndroid Studioでサンプルアプリを作ろうとしたら、JDK7を使えと怒られてしまいました。

設定を確認すると、JDK6を使うように設定されていました。

Project Structure

Project Structureはcmd + ;で開きます。

JDKは1.8をインストールしていたはず・・・と思って確認すると、やっぱり1.8がインストールされていました。

コマンドプロンプトでJDKのバージョン確認

コマンドプロンプトを開いてjava -versionでインストールされているJavaのバージョンが確認できます。(正確にはJREのバージョンの確認ですけど)

しかし、/System/Library/Java/JavaVirtualMachinesにはJDK6しかない。調べてみると、JDK1.7以降ではインストールされているディレクトリが異なる模様。

それぞれのJDKのディレクトリを確認するには、コマンドプロンプトで/usr/libexec/java_home -v バージョンで、JDKのバージョンごとのインストールされているディレクトリが確認できます。

java_homeコマンドでインストールされているディレクトリを確認

とりあえずJDK7を使えというエラーメッセージだったので、JDK7のディレクトリを指定してやることでエラーメッセージが消えました。

JDK7を使えというエラーメッセージ

ちなみに、JDK7はOracleのサイトからダウンロードできます。

Android Studio 0.8.14がリリースされています

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

Android Studio 0.8.14がリリースされています。

主にAndroid 5.0 Lolipopへの対応強化が内容の、0.8.13からのバグフィクスリリースのようです。

XMLエディタでLolipopで新たに追加された要素を扱えるようになったみたいです。

私の場合Lolipopの更新情報追わないとなぁ・・・というレベルで止まっているので何がどうすごくなったのかよく分かっていません。そもそもAndroid Studioに触る時間がないのを何とかしないといけないレベルです・・・。

Android Studio 0.8.14へのアップデートは0.8.12をインストールする必要があるので、その点だけはご注意を。

詳しくはリリースノートを参照してください。

Android Studio0.8.13がリリースされています

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

Android Studio 0.8.13がリリースされています。

Android 5.0 Lolipopがらみのアップデートと、0.8.12からのバグフィクスが主な更新内容ということです。

0.8.13へ更新するためにはAndroid Studioを0.8.12にバージョンアップする必要があります。(0.8.12からのパッチによるアップデートのみ)

詳しくはリリースノートを確認して下さい。

特定のブロックを選択するのに便利なショートカット

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

例えば<Button>タグのブロックを選択したりだとか、LinearLayoutの中身を選択したりだとか、そういう選択の仕方をする際に覚えておくと便利なショートカットです。

opt + ↓で選択範囲を1段階狭くし、opt + ↑で選択範囲を1段階広くします。

選択範囲を増やす・減らす

XMLだけでなく、Javaのコードでifブロックだけを選択したりするのにも利用できます。これでまた1つマウスの呪縛から解き放たれましたね。

Android Studio 0.8.12がリリースされています

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

Android Studio 0.8.12がCanary Channelでリリースされています。

Canary Channelでリリースといっても、今回はパッチ形式での配布ではないので通知がきていないかもしれません。今回のバージョンアップでは、新たにAndroid Studioをまるごとダウンロードする必要があります。(バグへの対応のため、パッチ形式による提供はできなかったそうです)

0.8.12での変更点

新しくなったAVDマネージャー

新しくなったAVDマネージャー

画面サイズが分かりやすく表示されているのがありがたいですね。見た目が今風になっているだけでなく、設定がしやすくなったように思います。

Gradle WrapperがHTTPSで通信するようになった

Mavenのリポジトリ(JCenter)からライブラリを取得したりする際に、HTTPSで通信するようになったようです。セキュリティ面の強化ということなんでしょうかね。

レイアウトXMLエディターの初期画面をTEXTモードに

Prefer XML Editor

新しくレイアウトXMLファイルを作成した際に、エディタがグラフィカルモードではなくテキストモードで開かれるようになります。GUIでデザインなんかしないよという人にはありがたい機能かもしれません。

その他いろいろ

string.xmlからTranslation Editorが開けるようになったり、新規プロジェクト作成時にプロジェクトビューがAndroid Project viewがデフォルトで選ばれるようになったり(今まではProject viewがデフォルト)しているようです。

詳細は0.8.12のリリースノートを参照してください。

以前のバージョンのAndroid Studioと共存させる方法

Macの場合の話ですが、今まで使っていたAndroid Studio.appの名前を変更するだけで、Android Studioの旧バージョンと新しいバージョンを共存させることができます。

Android Studio旧バージョンのバックアップ

分かりやすいようにバージョンを後ろに追記してやるのがいいと思います。名前がAndroid Studioと被らなければいいので、別にAndroid Studioあ.appとかでも問題ないです。

Android Studioでテスト用のディレクトリ名を確認する方法

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

テストコードを配置するディレクトリ名は、以前はinstrumentalTestという名前でした。しかし現在ではandroidTestという名前になっています。

Googleで検索すると、未だに「instrumentalTestというディレクトリを作成しよう」という情報もあるので注意が必要です。

と言っても、最近のAndroid Studioは最初からテスト用のディレクトリを用意してくれるようになったので、自分でテスト用ディレクトリを用意する必要性もなくなっています。

ちなみに自分の使っているAndroi dStudioのテスト用ディレクトリ名が何なのかは、app/app.imlを確認すればわかると思います。

app/app.iml

<sourceFolder ... isTestSource="true" />というタグを見れば、テスト用のディレクトリがandroidTestであることが分かります。

もし古いバージョンのAndroid Studioを使っている場合は、ここを見ることでディレクトリ名として何を使えばいいのかが分かります。

編集したいファイルへ素早く移動する方法

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

エディタタブがたくさん開かれていくと、編集したい対象を探すのに苦労します。タブを1つずつショートカットキー使って移動していくのもいいのですが、それはそれで現在地を見失いがちで困りモノです。

Android Studioで現在開かれているファイルの一覧を表示したりできないのかなと思ったのですが、そのものズバリな機能は見当たりませんでした。とり得る対策は以下の2つかなと思います。

隠れているタブを表示する

Android StudioのメニューのWindow > Editor tabsの中にshow hidden tabsというものがあります。これを選択することで、ウィンドウ中に表示しきれていないタブを表示させることができます。

show hidden tabs

ちなみに初期設定ではショートカットが割り当てられていないので、私はcmd + shift + Pを割り当ててみました。タブの移動ショートカットの隣にあるので押しやすいかなと思っただけなんですけどね。

Keymapの設定

ファイル一覧から選択する

cmd + oを押すとこのような検索窓が開きます。ここで編集したいクラス名を入力してやると、対象のクラスに移動することができます。

Navigate class

レイアウトXMLをいじりたいといった場合には、検索対象をクラスではなくファイルにしてやると選べます。ショートカットはcmd + shift + oです。ただしファイルにすると、画像ファイルなども引っかかるようになるので、逆に探しにくいかもしれません。

さらにcmd + opt + oではSymbol検索になります。これはメソッド名やフィールド名などで検索を行うことができます。いじりたいメソッド名がはっきりしている場合はこれを使うと楽かもしれません。

IdeaVimでxキーで文字削除する際にレジスタを汚さないようにする

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

OSの機能(cmd + xcmd + v)ではなくIdeaVimのddを使う場合に、移動先にゴミがあったのでxキーで削除して、いざペーストしようとしたら、xキーで削除したゴミが貼り付けられてしまった。「なんでだよムキーっ」とイラッとした経験を持つ人はきっと多いはずです。

そんなことにならないように、xキーで文字削除する際にレジスタを書き換えないようにする設定です。正確に言うと、IdeaVimではなくVimの設定の話ですけどね。

~/.ideavimrcを作成して以下の2行を書くだけ。

nnoremap x "_x
vnoremap x "_x

意味としてはノーマルモードとビジュアルモードにおいて、Xキーのキーマッピングを"_xに書き換えるという意味です。

"_とはなんぞやという話ですが、これはブラックホールレジスタという特殊なレジスタを表しています。Xキーのデフォルトの挙動は、1文字デフォルトのレジスタに移動するというものですが、この移動先をブラックホールレジスタに指定してやるという意味になります。

Android Studioで使われているショートカットキーを調べる

この記事は最終更新から3ヶ月以上が経過しています。情報が古い可能性があります。

Android Studioで使われているショートカットキーは、Preference > Keymapで確認することができます。

cmd + ,でPreferencesを開き、Keymapを選択すると、Android Studioで使われているショートカットキーを確認したり、自分でカスタマイズしたりすることができます。

ちなみにこのキーマップの設定ですが、「間違えて押してしまったショートカットキーで何か動作したけど、一体何をやっているのかわからない」というものを調べることにも使えます。

検索窓の隣にある虫眼鏡のアイコンを押すと、ショートカットキーから機能を検索することができます。逆引き検索ができるんですね。

ショートカットキーから機能を調べる

この機能を利用することで、ショートカットキーが割り当てられている機能を探したり、何も割り当てられていないショートカットキーを探したりすることができます。