準備ができたようなので動作確認含めて先日でっち上げたハロワのテストを云々してみることに。とりあえず本体とテストプロジェクトを clone してきて以下。
$ cd HelloWorld
$ android update project -p .
$ cd HelloWorldTest
$ android update test-project -m ../HelloWorld -p .
で、以下を実行したのですが例外ダンプ吐いて止まる。
$ ant clean debug install test
どうも debug で死亡している模様。
ダンプ見るに debug.keystore が無いのかどうか。
at com.android.sdklib.build.ApkBuilder.getDebugKey(ApkBuilder.java:272)
で ~/.android の中を見てみるに debug.keystore は存在するけれど、0 byte という始末。以下で作成らしい。
$ keytool -genkey -v -keystore debug.keystore -alias androiddebugkey ¥
-keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"
できたソレを ~/.android に放り込んで ant debug はパスしました。
emulator
以下コマンドにて作成。
$ android create avd --force -n test -t android-15 -abi armeabi-v7a
で、別端末にて起動。
$ emulator -avd test -no-skin -no-audio -no-window
一応確認。動いてます。
$ adb devices
List of devices attacked
emulator-5554 offLine
大丈夫かな。これで ant install debug してみるに成功。emulator に HelloWorld および HelloWorldTest な apk が云々、というメセジが出力されている。
試験実行
がしかし、ant test で NG でした。出力メセジが以下。BUILD SUCCESSFUL て。
$ ant test
Buildfile: /home/rms/HelloWorldTest/build.xml
-check-env:
[checkenv] Android SDK Tools Revision 22.3.0
[checkenv] Installed at /usr/local/adt-bundle-linux-x86_64-20131030/sdk
-setup:
[echo] Project Name: MainActivityTest
[gettype] Project Type: Test Application
-test-project-check:
test:
[echo] Running tests ...
[exec] INSTRUMENTATION_STATUS: id=ActivityManagerService
[exec] INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.example.helloworld.test/android.test.InstrumentationTestRunner}
[exec] INSTRUMENTATION_STATUS_CODE: -1
[exec] android.util.AndroidException: INSTRUMENTATION_FAILED: com.example.helloworld.test/android.test.InstrumentationTestRunner
[exec] at com.android.commands.am.Am.runInstrument(Am.java:586)
[exec] at com.android.commands.am.Am.run(Am.java:117)
[exec] at com.android.commands.am.Am.main(Am.java:80)
[exec] at com.android.internal.os.RuntimeInit.finishInit(Native Method)
[exec] at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:238)
[exec] at dalvik.system.NativeStart.main(Native Method)
BUILD SUCCESSFUL
で、stackoverflow あたりで AndroidManifest 見れ、という風なリプを確認して中身を見てみるに以下な記述となっておりました。
<instrumentation
android:name="com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
android:targetPackage="com.example.helloworld" />
むむ、このエントリによれば、espresso な jar の中にあるのかどうか。
って
なんとなくどっかで見たことあるような気がしてたんですが、ソースを確認してみたら以下が抜けてました。抜けてたとゆーよりも commit 作って push してなかったよ。
@Override
public void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
mInstrumentation = getInstrumentation();
setActivityInitialTouchMode(false);
}
追加してリトライ。でも駄目。むむむむ。
つうかエラーの出力をよくよく見てみるに android.test.InstrumentationTestRunner を探しているように見えます。使ってるのはこいつじゃないのに。
別件対応後
再度着手。どうも sdk 由来の build.xml (自動作成された build.xml から import している模様) に以下な記述があるらしい。
<target name="test" depends="-test-project-check"
description"Runs tests from the package defined in test.package property">
<property name="test.runner" value="android.test.InstrumentationTestRunner" />
これこれ、これを書き替えたいのだけどな。で、local.properties というファイルに以下を追加して実行してみました。
test.runner=com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner
例外吐いて終わってますが、明らかにこれまでとは違っているご様子。試験の実装が微妙なのかどうか。とは言え、一応テストは動いてます。
[exec] Test results for GoogleInstrumentationTestRunner$BridgeTestRunner=.E
[exec] Time: 20.892
[exec]
[exec] FAILURES!!!
[exec] Tests run: 1, Failures: 0, Errors: 1
まだやったね、って言えないあたりが非常に微妙ですが。
とりあえず把握できているのは RootViewPicker#get というメソドで例外を throw しているらしく、findRoot(rootMatcher) したものが ready になっていない模様。
今思い出したのですが
よくよく考えてみるに、未だ試験パスしたのって見たことない気がする。そして夢では見たような気がする。とほほ。
一応リモートで動くようになっているはずなので、今後は手元の貧弱な MBA ではなくてこちらで試験を云々な方向で考えてます。また、環境構築含め、諸々について纏めなエントリも投入の方向。完了、って訳ではないのですがここで一旦エントリ投入します。何かあれば追記するかもしれません。
参考にさせて頂いたエントリ
感謝を込めて以下に列挙を。