web-dev-qa-db-ja.com

テスト用にandroidTestフォルダー内にDummyActivityを作成します

AndroidTestフォルダー内にダミーアクティビティを作成し、androidTestフォルダー内のAndroidManifestファイルでそのアクティビティを宣言しました。

私の基本的な意図は、再利用可能なフラグメントをフレームレイアウトコンテナを使用してダミーアクティビティに配置することでテストすることです。

androidTestフォルダー内のAndroidManifest.xml

<?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テストの経験はあまりありません。誰かが、いくつかの提案を手伝ってください。

23
Sreedhu Madhu

プロジェクトの構築中に生成されたAPKは2つあります。 1つ目はアプリケーションを含むAPKで、2つ目はテストを含むAPKです。アクティビティをテストフォルダーに配置すると、テストに使用される2番目のAPKになり、アプリケーションAPKには含まれません。これが、このエラーが発生する理由です(アプリケーションAPKにはそのようなアクティビティがないため)。

したがって、アクティビティをテストフォルダではなくソースに配置するのが唯一の方法です。複数のアプリケーションバリアントを作成できるため(詳細を参照 ここ )、本番環境でAPKを構築する場合、ダミーアクティビティは含まれません。

13

私はすでに ここでこの質問に答えました そしてそれを実装する簡単なプロジェクトへのリンクを配置しているので、その完全なソースコードを見ることができます:-)答えの私のコピーをここにコピーします。私はあなたの目標を達成したようです:

それは簡単です!一般に、リソースはsrc/androidTest/resフォルダーの下に置く必要があります。そしてそれはです!次に、それをsrc/androidTest/Javaファイルで使用できます。はい、本番APKでtestレイアウトを使用することはできませんが、テスト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