Androidアプリケーションのテストで問題が発生しました。
2つのtestCaseクラスがありますが、別々に実行しても問題ありません。テストは最後まで実行されます。しかし、テストプロジェクトを「右クリック」して、「Run as Android Junit Test」を選択すると、メッセージが表示されます。
Launching instrumentation Android.test.InstrumentationTestRunner on device emulator-5554
[2012-03-27 15:56:27 - matroussedemaquillageTest] Collecting test information
[2012-03-27 15:56:31 - matroussedemaquillageTest] Test run failed: Instrumentation run failed due to 'Process crashed.'
私の2つのtestClassesについては以下を参照してください。
最初のテストクラス
package fr.smardine.matroussedemaquillage.test;
import Android.test.ActivityInstrumentationTestCase2;
import Android.widget.ImageSwitcher;
import fr.smardine.matroussedemaquillage.EntryPoint;
public class EntryPointTest extends
ActivityInstrumentationTestCase2<EntryPoint> {
private EntryPoint mActivity;
private ImageSwitcher mSwitcher;
public EntryPointTest() {
super("fr.smardine.matroussedemaquillage",
fr.smardine.matroussedemaquillage.EntryPoint.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void test2() {
assertEquals(2, 2);
}
}
そして2番目:
package fr.smardine.matroussedemaquillage.test;
import Android.test.ActivityInstrumentationTestCase2;
import Android.widget.ImageView;
import fr.smardine.matroussedemaquillage.Main;
public class MainTest extends ActivityInstrumentationTestCase2<Main> {
private Main mActivity;
private ImageView btRemplir;
private ImageView btPerime;
private ImageView btNotes;
public MainTest() {
super("fr.smardine.matroussedemaquillage",
fr.smardine.matroussedemaquillage.Main.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void test1() {
assertEquals(1, 1);
}
}
ご覧のとおり、テストはそれほど複雑ではありません。エミュレーターを起動するときに「ユーザーデータをワイプ」しても、2つのテストを実行すると同じメッセージが表示されます。
ちなみに、エミュレーターはAndroid 2.1で実行され、これは私のAndroidManifest.xmlファイルです。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="fr.smardine.matroussedemaquillage.test"
Android:versionCode="1"
Android:versionName="1.0" >
<uses-sdk Android:minSdkVersion="7" Android:targetSdkVersion="7" />
<instrumentation
Android:name="Android.test.InstrumentationTestRunner"
Android:targetPackage="fr.smardine.matroussedemaquillage" />
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name" >
<uses-library Android:name="Android.test.runner" />
</application>
</manifest>
編集:私のログ猫:
I/ActivityManager(64): Start proc fr.smardine.matroussedemaquillage for added application fr.smardine.matroussedemaquillage: pid=510 uid=10029 gids={3003, 1015}
D/ddm-heap(510): Got feature list request D/dalvikvm(510): GC freed 5427 objects / 420224 bytes in 90ms
D/dalvikvm(510): GC freed 6498 objects / 506616 bytes in 79ms
D/dalvikvm(510): GC freed 7048 objects / 567464 bytes in 90ms
D/dalvikvm(510): GC freed 8628 objects / 503840 bytes in 73ms
I/System.out(510): Failed to open test.properties
I/AndroidRuntime(510): AndroidRuntime onExit calling exit(-1) –
D/Zygote(30): Process 510 exited cleanly (255)
I/ActivityManager(64): Process fr.smardine.matroussedemaquillage (pid 510) has died.
W/ActivityManager(64): Crash of app fr.smardine.matroussedemaquillage running instrumentation ComponentInfo{fr.smardine.matroussedemaquillage.test/Android.test.InstrumentationTestRunner}
D/ActivityManager(64): Uninstalling process fr.smardine.matroussedemaquillage
D/AndroidRuntime(504): Shutting down VM
D/dalvikvm(504): DestroyJavaVM waiting for non-daemon threads to exit
D/dalvikvm(504): DestroyJavaVM shutting VM down
D/dalvikvm(504): HeapWorker thread shutting down
D/dalvikvm(504): HeapWorker thread has shut down
D/jdwp(504): JDWP shutting down net...
D/jdwp(504): Got wake-up signal, bailing out of select
I/dalvikvm(504): Debugger has detached; object registry had 1 entries
D/dalvikvm(504): VM cleaning up
D/dalvikvm(504): LinearAlloc 0x0 used 643668 of 5242880 (12%)
I/dalvikvm(504): JNI: AttachCurrentThread (from ???.???)
E/AndroidRuntime(504): ERROR: thread attach failed'
以下のように、テストアクティビティのonFinishでSystem.exit(0)を使用すると、このエラーが発生していました。
@Override
public void finish() {
super.finish();
System.exit(0);
}
したがって、メインアクティビティのonFinishメソッドを確認してください。
私もこのエラーに遭遇しました。しかし、テストスイートが実行されたことがわかりました。唯一の問題は、テストコードのアサートが失敗したことでした。
LogCatを調べて、タグ付けされた「TestRunner」メッセージを除外し、他のテストログの中でアサーション失敗メッセージを見つけました。
Androidインストルメンテーションを実行しているときにも同様の問題が発生しました。最終的に、問題はSystem.exit(0)であるという結論に達しました。
さて、その理由、それが問題を引き起こす理由そのドキュメントによると
VMの実行を停止し、プログラムを終了させます。
System.exit(0)が実行されると、このコードの後に記述された他のすべてのコードがスキップされ、アクティビティクラスが終了し、ガベージコレクトに進みます。インストルメンテーションはアクティビティライフサイクルメソッドに依存しているため、アクティビティクラスはガベージコレクションであり、オブジェクト自体が存在しない場合、そのメソッドを呼び出す可能性はありません。
したがって、アプリケーションの単体テストを実行する場合は、System.exit(0)の使用を避け、代わりにfinish()メソッドを使用してください。
他の誰かがRobotiumを使用していて、エラーが発生した場合:開いたアクティビティをtearDown
するのを忘れたため、上記のエラーが発生しました。
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}