13

Ich habe eine Dummy-Aktivität in androidTest Ordner erstellt und deklarierte diese Aktivität in AndroidManifest-Datei im Ordner androidTest.Erstellen DummyActivity in androidTest Ordner zum Testen

Meine grundlegende Absicht ist es, ein wiederverwendbares Fragment zu testen, indem Sie es in eine Dummy-Aktivität mit einem Framelayout-Container einfügen.

AndroidManifest.xml innerhalb androidTest Ordner

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.droid.test" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk 
     android:minSdkVersion="18" 
     tools:overrideLibrary="android.support.test.uiautomator.v18" /> 
    <instrumentation 
     android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.droid" /> 

    <application> 
     <uses-library android:name="android.test.runner" /> 
     <activity 
      android:name="com.droid.DummyActivityForTest" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Meine Testklasse TestWidgets.java

public class TestWidgets extends ActivityInstrumentationTestCase2<DummyActivityForTest> { 
    private AppCompatActivity mActivity; 

    public TestWidgets() { 
     super(DummyActivityForTest.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 
     mActivity = getActivity(); 
    } 

    @Test 
    public void testAddSpecializationClick() { 
     onView(withId(R.id.widgets_rv)).perform(
       RecyclerViewActions.actionOnItemAtPosition(4, click())); 
     Assert.fail("Not Implemented"); 
    } 

Wenn ich meine Testklasse seine Wurf unter Ausnahme ausgeführt,

java.lang.RuntimeException: Could not launch activity 
at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:373) 
at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119) 
at android.test.InstrumentationTestCase.launchActivity(InstrumentationTestCase.java:97) 
at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:104) 
at com.practo.droid.home.TestWidgets.setUp(TestWidgets.java:48) 
at junit.framework.TestCase.runBare(TestCase.java:132) 
at junit.framework.TestResult$1.protect(TestResult.java:115) 
at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77) 
at junit.framework.TestResult.run(TestResult.java:118) 
at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55) 
at junit.framework.TestCase.run(TestCase.java:124) 
at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63) 
at junit.framework.TestSuite.runTest(TestSuite.java:243) 
at junit.framework.TestSuite.run(TestSuite.java:238) 
at android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103) 
at android.support.test.internal.runner.junit3.AndroidTestSuite.run(AndroidTestSuite.java:69) 
at android.support.test.internal.runner.junit3.JUnit38ClassRunner.run(JUnit38ClassRunner.java:90) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) 
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879) 
Caused by: java.lang.RuntimeException: Unable to resolve activity for: Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.practo.droid/.DummyActivityForTest } 
at android.app.Instrumentation.startActivitySync(Instrumentation.java:385) 
at android.support.test.runner.MonitoringInstrumentation.access$201(MonitoringInstrumentation.java:90) 
at android.support.test.runner.MonitoringInstrumentation$5.call(MonitoringInstrumentation.java:353) 
at android.support.test.runner.MonitoringInstrumentation$5.call(MonitoringInstrumentation.java:350) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 

Ich habe nicht viel Erfahrung in Android-Tests, jemand bitte helfen Sie mit einigen Vorschlägen.

Antwort

7

Beim Erstellen des Projekts werden 2 APK generiert. Zuerst ist APK mit Anwendung und zweite APK enthält Test. Wenn du deine Aktivität in den Testordner legst, wird sie in der zweiten APK gespeichert, die für den Test verwendet wird, und deine APK-Anwendung enthält sie nicht. Aus diesem Grund erhalten Sie diesen Fehler (weil Ihre APK-Anwendung keine solche Aktivität aufweist).

Also die einzige Möglichkeit für Sie ist, Ihre Aktivität nicht in Testordner, sondern in Quellen. Sie können mehrere Anwendungsvarianten erstellen (siehe Details here). Wenn Sie also Ihr APK in der Produktion erstellen, wird Ihre Dummy-Aktivität nicht darin enthalten sein.

+0

Dank @Vyacheslav, Aromen hilft hier ... Ich werde es versuchen –

1

Ich habe bereits answered this question here und legt einen Link zu einem einfachen Projekt, das es implementiert, so dass Sie sogar den vollständigen Quellcode dafür sehen können :-) Ich werde meine Antwort hier kopieren, weil es scheint, dass ich Ihre erreicht habe Ziel:

Das ist einfach! Im Allgemeinen sollten Sie Ihre Ressourcen einfach unter den Ordner src/androidTest/res legen. Und das ist! Dann können Sie es in Ihren src/androidTest/java Dateien verwenden. Ja, Sie können nicht verwenden Test Layouts in Ihre Produktion APK, aber können Sie Ihre Test-Layouts in Ihrem Test verwenden APK.

Es gibt einige Probleme, die Sie verwirren könnten. Zum Beispiel Autovervollständigung funktioniert nicht so sehr oft, aber jedenfalls baut es und funktioniert.

Es ist der komplette Testbaum, Sie können so sehen, dass ich diese Tätigkeit innerhalb des Testprojekts haben und verschmutzen nicht die wichtigste :-) Fragen Fühlen Sie sich frei zu fragen, ob noch etwas falsch :-)

ist

Und, ja, ich kann deine Frage nicht beantworten, weil auf meiner Seite alles funktioniert und ich dein komplettes Projekt nicht sehen kann :-) Ich will nur sagen, dass es funktioniert und du definitiv nicht müssen Ihre Testaktivitäten in Nicht-Test-Projekte verschieben. Fühlen Sie sich frei, Fragen zu stellen/den Code :-)