在 android 测试文件夹中创建虚拟活动以进行测试
Create DummyActivity inside androidTest folder for testing
我在 androidTest 文件夹中创建了一个虚拟 activity 并在 androidTest 文件夹的 AndroidManifest 文件中声明了 activity。
我的基本意图是通过将可重用片段放入带有框架布局容器的虚拟 activity 中来测试它。
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>
我的测试class
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");
}
当我 运行 我的测试 class 它抛出了异常,
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.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.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.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.access1(MonitoringInstrumentation.java:90)
at android.support.test.runner.MonitoringInstrumentation.call(MonitoringInstrumentation.java:353)
at android.support.test.runner.MonitoringInstrumentation.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 包含测试。如果您将 activity 放在测试文件夹中,它将位于用于测试的第二个 APK 中,而您的应用程序 APK 不包含它。这就是您收到此错误的原因(因为您的应用程序 APK 没有这样的 activity)。
所以你唯一的办法就是把你的 activity 不放在测试文件夹中,而是放在源代码中。您可以创建多个应用程序变体(请参阅详细信息 here),因此当您在生产环境中构建 APK 时,您的虚拟 activity 将不会包含在其中。
我已经 answered this question here 并将 link 放置到一个实现它的简单项目中,因此您甚至可以看到完整的源代码:-) 我将复制我的答案在这里,因为我似乎达到了你的目的:
That's easy! In general, you should just put your resources under the
src/androidTest/res
folder. And that is! Then you can use it in your
src/androidTest/java
files. Yes, you can't use test layouts in
your production APK, but you can use your test layouts in your test
APK.
There're some problems that might confuse you. For instance
autocompletion works well not so very often, but, anyway, it builds
and works.
这是完整的测试树,所以你可以看到我在测试项目中有那个 activity 并且不要污染主要的 :-) 如果仍然有问题,请随时提问: -)
$ 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
而且,是的,我无法回答你的特定问题,因为在我这边一切正常,我看不到你的完整项目:-)我只想说它有效,你绝对不需要将您的测试活动转移到非测试项目。欢迎提问/post代码:-)
我在 androidTest 文件夹中创建了一个虚拟 activity 并在 androidTest 文件夹的 AndroidManifest 文件中声明了 activity。
我的基本意图是通过将可重用片段放入带有框架布局容器的虚拟 activity 中来测试它。
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>
我的测试class 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");
}
当我 运行 我的测试 class 它抛出了异常,
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.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.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access[=12=]0(ParentRunner.java:58)
at org.junit.runners.ParentRunner.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.access1(MonitoringInstrumentation.java:90)
at android.support.test.runner.MonitoringInstrumentation.call(MonitoringInstrumentation.java:353)
at android.support.test.runner.MonitoringInstrumentation.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 包含测试。如果您将 activity 放在测试文件夹中,它将位于用于测试的第二个 APK 中,而您的应用程序 APK 不包含它。这就是您收到此错误的原因(因为您的应用程序 APK 没有这样的 activity)。
所以你唯一的办法就是把你的 activity 不放在测试文件夹中,而是放在源代码中。您可以创建多个应用程序变体(请参阅详细信息 here),因此当您在生产环境中构建 APK 时,您的虚拟 activity 将不会包含在其中。
我已经 answered this question here 并将 link 放置到一个实现它的简单项目中,因此您甚至可以看到完整的源代码:-) 我将复制我的答案在这里,因为我似乎达到了你的目的:
That's easy! In general, you should just put your resources under the
src/androidTest/res
folder. And that is! Then you can use it in yoursrc/androidTest/java
files. Yes, you can't use test layouts in your production APK, but you can use your test layouts in your test APK.There're some problems that might confuse you. For instance autocompletion works well not so very often, but, anyway, it builds and works.
这是完整的测试树,所以你可以看到我在测试项目中有那个 activity 并且不要污染主要的 :-) 如果仍然有问题,请随时提问: -)
$ 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
而且,是的,我无法回答你的特定问题,因为在我这边一切正常,我看不到你的完整项目:-)我只想说它有效,你绝对不需要将您的测试活动转移到非测试项目。欢迎提问/post代码:-)