Robolectric
官网文档少得可怜,最初使用 Android Studio + Gradle,发现各种坑,最后还是选择 Eclipse + Maven
网上这方面的教程也几乎没有,即使有也是很早之前的。。没办法,只能自己摸索了,庆幸的是对 Instrumentation 比较熟悉,于是尝试着参考建立 Android JUnit 项目的方法来建立 Roboletirc 测试项目,最后是跑通了,这里分享下。
你可能以下面的内容作为参考,去搭建的时候还会遇到些坑,这可能是由于某些地方的环境有差异,可以留言,共同解决!
OK,接下来记录下我在 Mac 上的搭建步骤。其他系统可以参考。
各种软件版本:
JDK:1.8
Maven:3.2.5
Roboletric:3.0-SNAPSHOT
Robolectric 简介
其实很早就知道这个框架,但一直忍着没去碰它,而是选择先去熟悉了下 Instrumentation,这两天才忍不住……
Instrumentation
与 Roboletric
都是针对 Android 进行单元测试的框架,前者在执行 case 时候是以 Android JUnit 的方式运行,因此必须在真实的 Android 环境中运行(模拟器或者真机),而后者则是以 Java Junit 的方式运行,这里就脱离了对 Android 环境的依赖,而可以直接将 case 在 JVM 中运行,大赞~,因此很适合将 Roboletric 用于 Android 的测试驱动开发。
网上其实还是比较多关于 Roboletric 的文章的,但是。。尼玛,里面都是贴点官网的示例代码,对于整个环境的搭建,却没多少提及的。。环境是最主要的,环境 OK 了,示例代码我到官网复制就OK。。
我搭建的过程是单独建立一个 Maven 测试项目,测试项目依赖于 Android 项目,测试项目是与被测项目分离的。下面详细贴下:
新建 Android Project
新建 Android 项目(项目名我取为 roboletric),该项目作为被测对象,这里不帖代码,代码很简单,该示例的主界面是一个 TextView,显示的内容为 Hello world!
,界面中还有一个 Button,点击 Button,TextView 的内容会变为 Hello xuxu
,呵呵。。
具体也可以参考这篇文章的内容: Android Instrumentation 简介
其中我对 sdk 的配置了 min sdk 为 16
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="19" />
新建 Test Project
这里我新建了一个 Maven Project
File> New > Other > Maven Project ,跟 Appium 里面使用 Java 写脚本,建立 Maven 项目是相同的。
我建立的测试项目 roboletrictest,pom.xml 的内容我这里贴下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>roboletrictest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>roboletrictest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.robolectric</groupId>
<artifactId>robolectric</artifactId>
<version>3.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
依赖配置成功后会自动添加所有的依赖:
配置 Test Project
配置 roboletrictest 的 Build Path
- 右键项目(roboletrictest) > Build Path > Configure Build Path
- 在
Project
选项中 add 被测项目(roboletric) - 在
Libraries
中 Add External JARs,添加对应的 android.jar,android.jar 在 sdk 中(需要下载)
完成 Test Case
- 在
src/test/java
目录下 new 一个 package,对应被测项目(com.example.roboletric.test) -
在包里面 new 一个 JUnit Test Case,使用 Junit 4,Class Name 为 MainActivityTest
-
MainActivityTest 的代码:
package com.example.roboletric.test; import static org.junit.Assert.*; import android.app.Activity; import android.widget.Button; import android.widget.TextView; import org.junit.*; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import com.example.roboletric.MainActivity; @RunWith(RobolectricTestRunner.class) // 设置被测项目的AndroidManifest.xml @Config(manifest = "../roboletric/AndroidManifest.xml") public class MainActivityTest { // 引用待测Activity private Activity mActivity; // 引用待测Activity中的TextView和Button private TextView textView; private Button button; @Before public void setUp() { // 获取待测Activity mActivity = Robolectric.setupActivity(MainActivity.class); // 初始化textView和button textView = (TextView) mActivity.findViewById(com.example.roboletric.R.id.textView); button = (Button) mActivity.findViewById(com.example.roboletric.R.id.button); } //测试初始化条件 @Test public void testInit() throws Exception { assertNotNull(mActivity); //判断应用包名 assertEquals("com.example.roboletric", mActivity.getPackageName()); //判断界面默认显示的内容 assertEquals("Hello world!", textView.getText().toString()); } //测试button按钮 @Test public void testButton() throws Exception { assertNotNull(button); //点击button button.performClick(); //判断点击后TextView显示的内容是否改变 Assert.assertEquals("Hello xuxu!", textView.getText().toString()); } }
Run Test Case
右键 MainActivityTest > Run As > JUnit Test