2012-03-27 3 views
11

내 안드로이드 응용 프로그램 테스트에 문제가 있습니다.
나는 2 개의 testCase 클래스를 가지고 있는데, 만약 그것들을 따로 실행한다면 아무런 문제가 없다. 테스트는 끝날 때까지 실행된다.테스트 실행 실패 : '공정 충돌'로 인해 계측 실행에 실패했습니다. 여러 Android 활동을 테스트 할 때

첫 번째 테스트 클래스 : 내가 할 경우하지만

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.' 

내 두 testClasses에 대해 우는 소리를 참조하는 메시지를 가지고 내 테스트 프로젝트의 "마우스 오른쪽 버튼으로 클릭"와 "안드로이드 Junit와 테스트로 실행"을 선택

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); 
    } 
} 

두 번째 :

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); 
    } 
} 

내 테스트, 그렇게 복잡하지 않습니다 볼 수 있듯이 심지어 "WIP 경우 전자 사용자 데이터 "에뮬레이터를 실행할 때 두 테스트를 실행하면 동일한 메시지가 나타납니다.
아, 그런데, 에뮬레이터는 안드로이드 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' 
+0

테스트 중 이러한 두 가지 활동이 계측중인 실제 앱에서 올바르게 시작될 수 있는지 확인하십시오 (즉, 런타임 오류가 누출되지 않음). Logcat에서 더 흥미로운 메시지를 얻을 수 있는지 확인하십시오. – yorkw

+0

안녕하세요, 귀하의 의견을 주셔서 감사합니다, 계측에서 두 활동은 응용 프로그램에서 제대로 시작됩니다. 앱을 실행할 때 예외는 없습니다. 두 테스트를 분리하여 실행하면 예외가 발생합니다. 동시에 두 testClass를 모두 실행하는 경우에만 예외가 발생합니다. –

+0

이 메시지가 나타날 때 Logcat에 자세한 정보가 표시되어야합니다. _Instrumentation run failed 'Process crashed. 콘솔에 표시됩니다. Logcat을 게시하면 문제를 조사하는 데 도움이됩니다. – yorkw

답변

4

내가이 오류를 가져 오는 데 사용 나는 아래처럼 내 테스트 활동의 onFinish에 (0)을 System.exit를 사용했을 때

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

    } 

그래서 자신의 메인 활동의 onFinish 방법을 선택합니다.

1

이 오류도 발생했습니다. 그러나, 나는 내 테스트 스위트가 실행되었다는 것을 알아 냈다. 유일한 문제는 내 테스트 코드의 주장이 실패했다는 것이다.

LogCat을 조사하여 태그가 붙은 "TestRunner"메시지를 필터링하고 다른 테스트 로그 중에서 어설 션 오류 메시지를 발견했습니다.

1

내 안드로이드 계측을 실행할 때도 비슷한 문제가 발생했습니다. 결국 나는 문제가 System.exit (0)이라는 결론을 내 렸습니다.

자, 문제 가 발생하는 이유는 그 문서에 따르면

Causes the VM to stop running and the program to exit.

이 코드 이후에 기록 된 모든 다른 코드를 실행됩니다 (0) 을 System.exit는 생략하고 활동 클래스는지면 완료되고 쓰레기 수거로갑니다. Instrumentation은 액티비티 라이프 사이클 메소드에 의존하기 때문에, 액티비티 클래스는 가비지 컬렉팅된다. 객체 자체가 존재하지 않으면 메소드를 호출 할 기회가 없다.

응용 프로그램의 단위 테스트를 수행하려면 System.exit (0)을 사용하지 말고 finish() 메서드를 대신 사용하십시오.

0

다른 누구도 Robotium을 사용하고 있는데 오류가 발생했습니다 : tearDown 열린 활동을 잊어 버렸고 이로 인해 위에서 설명한 오류가 발생했습니다.

public void tearDown() throws Exception { 
    solo.finishOpenedActivities(); 
}