14

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.Instrumentatio‌​nTestRunner} 
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'
4

4 に答える 4

3

以下のように、テスト アクティビティの onFinish で System.exit(0) を使用すると、このエラーが発生していました。

@Override
    public void finish() {
        super.finish();
        System.exit(0);

    }

Main アクティビティの onFinish メソッドを確認してください。

于 2012-10-12T11:32:12.537 に答える
1

Android インストルメンテーションを実行しているときにも、同様の問題が発生しました。最終的に、問題はSystem.exit(0)にあるという結論に達しました。

さて、その理由、なぜそれが問題を引き起こすのか、そのドキュメントによると

VM の実行を停止し、プログラムを終了します。

System.exit (0)が実行されると、このコードの後に​​記述された他のすべてのコードがスキップされ、アクティビティ クラスがファイナライズされ、ガベージ コレクションに進みます。インストルメンテーションはアクティビティ ライフサイクル メソッドに依存しているため、アクティビティ クラスはガベージ コレクションであり、オブジェクト自体が存在しない場合、そのメソッドを呼び出す機会はありません。

したがって、アプリケーションの単体テストを行う場合は System.exit(0) の使用を避け、代わりにfinish()メソッドを使用してください。

于 2014-08-04T11:14:36.423 に答える
1

私もこのエラーに遭遇しました。しかし、最終的にテスト スイートが実行されたことがわかりました。唯一の問題は、テスト コードのアサートが失敗したことでした。

LogCat を調べて、これらのタグ付きの「TestRunner」メッセージを除外したところ、他のテスト ログの中にアサーション エラー メッセージが見つかりました。

于 2013-04-22T18:49:23.280 に答える
0

他の誰かが Robotium を使用していてエラーが表示された場合:tearDown開いているアクティビティを忘れたため、上記のエラーが発生しました。

public void tearDown() throws Exception {
    solo.finishOpenedActivities();
}
于 2016-01-05T16:47:43.567 に答える