テストとしてスクリーンショットを撮れるようにした
Android開発してて、いい加減テストをしたほうが良さげなので、テストコードを作成しようと思う。(イマゴロだけど・・・
まずはスクリーンショット撮れたら便利じゃね?ということで色々調査した結果、Spoonを採用した。
採用理由として、画像保存を端末内ではなく、テストの実行環境に保存してくれる。CIとか考えると便利。Square製というのも決め手の一つ。
Spoonの補助として、Robotiumを画面遷移とか、データ入力用に採用した。
開発環境
Android Studio v0.8.14
Mac OS X v10.10
実際にやってみた
ライブラリの設定
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.10.0'
}
}
apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.application'
apply plugin: 'spoon'
android {
compileSdkVersion 20
buildToolsVersion "20.0.0"
defaultConfig {
applicationId "com.github.shiraji.myapplication"
minSdkVersion 15
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.2.1'
androidTestCompile 'com.squareup.spoon:spoon-client:1.1.0'
}
Android Studioで簡単に起動したかったので、Spoonプラグインも導入した。
Spoonプラグインの設定のdependenciesはこのファイルに記載する。
実際にテストするActivityはHello WorldのレイアウトにEditTextを追加したもの。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView android:text="@string/hello_world" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edit_test_view"
android:layout_below="@+id/textView"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
それでは実際のテストコード
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
private Solo mSolo;
public MainActivityTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
mSolo = new Solo(getInstrumentation(), getActivity());
super.setUp();
}
@Override
protected void tearDown() throws Exception {
mSolo.finishOpenedActivities();
super.tearDown();
}
public void testMainActivity() {
Spoon.screenshot(getActivity(), "start");
mSolo.enterText((EditText)getActivity().findViewById(R.id.edit_test_view), "しらじ");
Spoon.screenshot(getActivity(), "after_edit");
}
}
setUpでRobotiumのSoloインスタンスを生成し、tearDownで開いた全アクティビティーをfinishしている。
testMainActivityが実際のテストで、起動直後にSpoonでスクリーンショットを撮影し、EditTextにしらじと入力し、再度スクリーンショットを撮影した。
スクリーンショットのタグ名はファイル名と同じ扱いなので、スペースなどは入力不可。
起動方法はSpoonプラグインを使っているので、Android StudioでGradle Tasksから実行すると
> Could not find class: apple.awt.CGraphicsEnvironment
こんな感じのエラーが出る。ただし、コマンドラインで./gradlew spoonDebugTestをするとしっかり動いてくれる。
調査しようかと思ったけど、別にコマンドで動くんだからそっち使えよってことで、気がむいたら調べる。
最終的に結果ファイルはapp/build/spoon以下に生成される。
実際に動かしたテストケースを端末別に、テストケースごとに保存してくれる。
ログも取得できる。
イマゴロだけど、夢が広がりだした。