13

Я создал фиктивную активность в папке androidTest и объявил эту активность в файле AndroidManifest в папке androidTest.Создайте DummyActivity внутри папки 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, кто-нибудь, пожалуйста, помогите с некоторыми предложениями.

ответ

7

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

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

+0

Спасибо @Vyacheslav, ароматы здесь помогают ... Я попробую –

1

Я уже answered this question here и размещает ссылку на простой проект, который его реализует, поэтому вы можете увидеть полный исходный код для этого :-) Я скопирую ответ на этот вопрос, потому что кажется, что я достиг своего Цель:

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

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

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

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

Смежные вопросы