Android Studio Robolectric

New Resource :

目前在網路上的 Android Studio unit test 的範例可以說是少得可憐,尤其是 Android StudioGradle 這兩個大傢伙不斷低更新,要找到比較符合現狀的組合又更少了。

android-unit-testandroid-studio-unit-test-plugin 這兩個 repo 來設置 Robolectric 是我目前看到最簡單的設定。

建置環境:


Step 1 安裝 AS 外掛

安裝Android Studio Unit Test Plugin

Preferences -> Plugin -> Install plugin from disk

接著重開 AS

Step 2

Android-studio-unit-test-plugin Requirements
  • Android Studio 0.6.0+
  • Android Gradle Plugin 0.11.0+
  • JCAndKSolutions’ android-unit-test gradle plugin 1.5.0+

app/src 底下新增目錄 test/java/full/package/name/test

例如 Package Name 為 yume190.com.tester

所以就新增 test/java/yume190/com/tester/test 目錄

於是目錄結構就會變成這樣

這個時候會看見 package 分散成多個資料夾。(代表AS不認得test 資料夾)

所以要開始設定 android-unit-test gradle plugin

project/build.gradle 新增 classpath 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1'

project/build.gradle
1
2
3
4
5
6
7
8
9
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
classpath 'com.github.jcandksolutions.gradle:android-unit-test:2.1.1'
}
}

app/build.gradle 的 android 區塊下面加入 apply plugin: 'android-unit-test'

接著新增 dependencies

testCompile 'junit:junit:4.11'
testCompile 'org.robolectric:robolectric:2.4'
app/build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apply plugin: 'com.android.application'

android {
// ...
}

apply plugin: 'android-unit-test'

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.2'

testCompile 'junit:junit:4.11'
testCompile 'org.robolectric:robolectric:2.4'
}

此時 Sync 一下

android-unit-test gradle plugin 安裝成功

PS : 其實android-unit-test第四點之後也都很重要,例如受測的 class 要放在哪個目錄,以及命名必須是xxTest.java等等…。

Step 3 加入Test

這邊先放一個不能過的測試,at src/test

# 可以先用 gradle tasks 查看所有任務
# 看看有沒有叫做 test 的 task
# 然後用下面的指令跑測試
gradle test
YumeTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package yume190.com.tester10.test;

import android.test.AndroidTestCase;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.RobolectricTestRunner;

@RunWith(RobolectricTestRunner.class)
@Config(emulateSdk = 18)
public class YumeTest extends AndroidTestCase {

@Test
public void testYume1() throws Exception{
assertEquals(1,2);
}

@Test
public void testYume2() throws Exception{
assertEquals(1,1);
}

}

Step 4 搭配AS IDE

  1. Add tasks.findByName(“assembleDebug”).dependsOn(“testDebugClasses”) to your build.gradle to force the test classes to be compiled whenever your project is compiled.
  2. Go to Edit Configurations and add a new gradle configuration that runs the task testClasses. Then in your junit configuration, below Before launch, click + -> Run Another Configuration and add the gradle configuration you just created.

edit configurations做設定

新增一個 gradle

新增 JUnit

tasks.findByName("assembleDebug").dependsOn("testDebugClasses")加入app/build.gradle

app/build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apply plugin: 'com.android.application'

android {
// ...
}

apply plugin: 'android-unit-test'

tasks.findByName("assembleDebug").dependsOn("testDebugClasses")

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.2'

testCompile 'junit:junit:4.11'
testCompile 'org.robolectric:robolectric:2.3'
}

Run & 收工

自己弄的Sample

其他Source :