Создайте DummyActivity внутри папки androidTest для тестирования

Я создал фиктивную активность в папке androidTest и объявил эту активность в файле AndroidManifest в папке androidTest.

Мое основное намерение состоит в том, чтобы проверить фрагмент многократного использования, помещая его в фиктивную операцию с контейнером framelayout.

AndroidManifest.xml внутри папки androidTest

<?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> 

Мой тестовый класс 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"); } 

Когда я запускаю свой тестовый класс, он бросает ниже исключения,

 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) 

У меня нет большого опыта тестирования Android, кто-нибудь, пожалуйста, помогите с некоторыми предложениями.

Во время строительства проекта создается 2 АПК. Сначала APK с приложением, а второй APK содержит тест. Если вы поместите свою активность в тестовую папку, она будет во втором APK, который используется для теста, и ваше приложение APK его не содержит. Вот почему вы получаете эту ошибку (потому что ваше приложение APK не имеет такой активности).

Таким образом, единственный способ для вас состоит в том, чтобы поместить вашу активность не в тестовую папку, а в источники. Вы можете создать несколько вариантов приложений (см. Подробности здесь ), поэтому, когда вы создаете APK в процессе производства, ваша фиктивная активность не будет включена в нее.

Я уже ответил на этот вопрос здесь и разместил ссылку на простой проект, который его реализует, поэтому вы можете даже увидеть полный исходный код для этого 🙂 Я скопирую мой ответ здесь, потому что кажется, что я достиг своей цели :

Это легко! В общем, вы должны просто поместить свои ресурсы в папку src/androidTest/res . И это! Затем вы можете использовать его в своих src/androidTest/java . Да, вы не можете использовать тестовые макеты в своем производстве APK, но вы можете использовать тестовые макеты в своем тестовом APK .

Есть некоторые проблемы, которые могут вас смутить. Например, автозаполнение работает не так часто, но, во всяком случае, оно строит и работает.

Это полное тестовое дерево, поэтому вы можете видеть, что у меня есть эта активность внутри тестового проекта и не загрязняйте главный 🙂 Не стесняйтесь задавать вопросы, если что-то по-прежнему не так 🙂

 $ tree androidTest/ androidTest/ ├── AndroidManifest.xml ├── java │  └── ru │  └── egslava │  └── lib_phone │  ├── MainActivityTest.java │  ├── TestActivity.java │  └── actions │  ├── HintViewAction.java │  ├── KeepHintViewAction.java │  └── SetTextViewAction.java └── res ├── layout │  └── activity_main.xml └── values └── styles.xml 

И, да, я не могу ответить на ваш конкретный вопрос, потому что на моей стороне все работает, и я не вижу вашего полного проекта 🙂 Я просто хочу сказать, что он работает, и вам определенно не нужно перемещать ваши тестовые действия К не-тестовым проектам. Не стесняйтесь задавать вопросы / размещать код 🙂