Создайте 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, кто-нибудь, пожалуйста, помогите с некоторыми предложениями.
Ответы
Ответ 1
Во время создания проекта создается 2 APK. Сначала APK с приложением, а второй APK содержит тест. Если вы поместите свою активность в тестовую папку, она будет во втором APK, который используется для тестирования, и ваше приложение APK не содержит его. Вот почему вы получаете эту ошибку (потому что ваше приложение APK не имеет такой активности).
Таким образом, единственный способ для вас - поместить вашу активность не в тестовую папку, а в источники. Вы можете создать несколько вариантов приложений (см. Подробности здесь), поэтому, когда вы создаете свой APK в своей продукции, ваша фиктивная активность не будет включена в нее.
Ответ 2
Я уже ответил на этот вопрос здесь и помещает ссылку на простой проект, который его реализует, поэтому вы можете увидеть полный исходный код для этого:-) я "Скопируй мой ответ здесь, потому что кажется, что я достиг своей цели:
Это просто! В общем, вы должны просто разместить свои ресурсы под 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
И да, я не могу ответить на ваш конкретный вопрос, потому что на моей стороне все работает, и я не вижу вашего полного проекта:-) Я просто хочу сказать, что он работает, и вам определенно не нужно двигаться ваши тестовые действия в не-тестовые проекты. Не стесняйтесь задавать вопросы/размещать код: -)
Ответ 3
Комментарий к ответу @Slava. Его код работает, потому что нет отдельного apk для библиотеки Android. Таким образом, его решение заканчивается одним apk-тестом, а основной apk отсутствует, поэтому PackageManager правильно разрешает действия.