【问题标题】:Is it possible to define Activity inside Android test project and run a test against it?是否可以在 Android 测试项目中定义 Activity 并对其进行测试?
【发布时间】:2012-03-01 15:03:31
【问题描述】:

我正在为我的 Android 应用程序中的一个组件编写测试。该组件使用活动来制作一些报告。所以我需要一个活动来测试组件(丑陋的架构),我认为在测试项目中创建一个虚拟活动比创建从ActivityInstrumentationTestCase2<TestActivity>继承的测试更容易,但由于某种原因我总是得到@987654322 @异常。

测试活动已添加到清单文件中,并且包似乎设置正确。

我尝试将它放在 com.xxx(应用程序包)和 com.xxx.test 包中,但没有成功。但是当我将 TestActivity 移动到目标应用程序中时,一切正常。所以我开始想知道测试项目和我的应用程序之间有什么区别,甚至可以在测试项目中进行活动。

【问题讨论】:

    标签: android junit


    【解决方案1】:

    是的,这是可能的,但不推荐,正如 official dev guide 中所述:

    一旦您创建了一个测试项目,您就可以使用一个测试包来填充它。这个包不需要一个活动,但如果你愿意,你可以定义一个。虽然您的测试包可以组合 Activity 类、测试用例类或普通类,但您的主要测试用例应该扩展 Android 测试用例类或 JUnit 类之一,因为它们提供了最好的测试功能。

    为此,您需要:

    1. 在测试项目的 AndroidManifest.xml 中定义您的虚拟活动。
    2. 在测试中将检测 targetPackage 点更改为自身 项目的 AndroidManifest.xml。 (被测 Activity 类必须 在检测 targetPackage 下)。

    假设我有一个测试项目 com.example.test 包含两个类 DummyActivity 和 DummyActivityTest,那么如果你想使用 DummyActivityTest 测试 DummyActivity,你需要像这样定义你的测试项目的 AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.test"
        android:versionCode="1"
        android:versionName="1.0" >
    
    <uses-sdk android:minSdkVersion="10" />
    
    <!-- targetPackage point to test project itself -->
    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.test" />
    
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
        <activity
            android:name=".DummyActivity"
            android:label="@string/app_name" >
        </activity>
    </application>
    

    【讨论】:

    • 当我将 targetPackage 更改为 self 时,它开始在 InstrumentationTestRunner.onCreate 出现 NoSuchMethodException 失败
    • 我在使用这种方法时遇到了麻烦;我认为如果 /manifest/@package 与 /manifest/instrumentation/@android:targetPackage 相同,则测试将有效地替换被测应用程序,从而无法引用其类。我得到了 ClassNotFoundExceptions。
    • 我通过在 androidTest 目录中添加一个额外的 AndroidManifest.xml 来使用这种方法。但是对于较新版本的 Android Studio,我现在使用的是 2.3.1,不需要 &lt;instrumentation&gt; 元素。
    【解决方案2】:

    测试项目和activity可以共存,把目标包名作为测试项目的包名

    【讨论】:

    • 感谢您的回复。我已经按照您的建议进行了尝试,但现在我在 android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests.testSuiteConstructionFailed(TestSuiteBuilder.java:239) 得到 java.lang.RuntimeException: Exception during suite construction
    猜你喜欢
    • 2018-06-26
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    相关资源
    最近更新 更多