0

很长一段时间以来,我都可以通过阅读 StackOverflow 上的许多不同帖子来解决我的问题,但现在我的问题变得非常有趣。我被卡住了,也许有人可以给我一些提示:

我想使用ActivityInstrumentationTestCase2测试 Android 应用程序。我的测试场景如下:我的 Android 设备上的数据库中有几个测试数据集(十六进制字符串,编码有效和无效的 NDEF 消息)。我为数据库中的每个行条目生成了一个 java 文件,其中包含对我要测试的应用程序的调用。

以下是这些功能之一的示例:

public void testNdefPush0() {

    Intent intent = new Intent(NfcAdapter.ACTION_TAG_DISCOVERED);
    NdefMessage[] msg;
    try {
        msg = new NdefMessage[] { new NdefMessage(new byte[] { (byte) 0xD1,
                (byte) 0x02, (byte) 0x1F, (byte) 0x53, (byte) 0x70,
                (byte) 0x91, (byte) 0x01, (byte) 0x0D, (byte) 0x00,
                (byte) 0x6E, (byte) 0x66, (byte) 0x63, (byte) 0x2D,
                (byte) 0x66, (byte) 0x6F, (byte) 0x72, (byte) 0x75,
                (byte) 0x6D, (byte) 0x2E, (byte) 0x6F, (byte) 0x72,
                (byte) 0x67, (byte) 0x51, (byte) 0x01, (byte) 0x0A,
                (byte) 0x55, (byte) 0x67, (byte) 0x6F, (byte) 0x6F,
                (byte) 0x67, (byte) 0x6C, (byte) 0x65, (byte) 0x2E,
                (byte) 0x63, (byte) 0x6F, (byte) 0x6D }) };
    } catch (Exception e) {
        throw new RuntimeException("Failed to create NdefMessage", e);
    }
    intent.putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, msg);

    setActivityIntent(intent);

    solo = new Solo(getInstrumentation(), getActivity());

}

如您所见,我使用了 Robotium 框架,并按照他们的常见问题解答和教程进行了所有设置(特别是:https ://code.google.com/p/robotium/wiki/RobotiumForAPKFiles )

我正在使用专门的Instrumentation Runner,它能够将结果写入 xml 文件,并且似乎适合我的需要;这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="de.nfc"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <instrumentation
        android:name="pl.polidea.instrumentation.PolideaInstrumentationTestRunner"
        android:targetPackage="se.anyro.nfc_reader" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

到目前为止我已经尝试/取得的成就:

  • 我想测试的应用程序是第三方应用程序,所以我用我的调试密钥重新签署了它们。(作品)
  • 由于我想测试不同的应用程序,我在手机上实现了包含测试用例的 Java 文件的生成;因此,通过按钮单击包含*.java我所有测试的文件(构造函数、setUp()、testNdefPush0() ... testNdefPush100()、tearDown())并Manifest.xml在手机上生成一个合适的文件。然后将这些文件拉到PC上,在测试项目中编译(ant clean, ant debug, ant install -r /path/to/target.apk)并安装到手机上
  • 我可以使用 adb shell 运行测试:

    adb -d shell am instrument -w -r -e class de.nfc.tests.NfcTestCase -e junitOutputDirectory /mnt/sdcard/ de.nfc/pl.polidea.instrumentation.PolideaInstrumentationTestRunner

  • 如果测试数据有效,则仪器工作并生成一个 xml 文件,其中包含 sdcard 上的结果。

  • 如果测试数据无效(参见示例) Instrumentation 崩溃并且无法继续进行以下测试:

    INSTRUMENTATION_RESULT:longMsg=java.lang.NullPointerException:无法启动活动 ComponentInfo{se.anyro.nfc_reader/se.anyro.nfc_reader.TagViewer}:java.lang.NullPointerException

问题

我怎样才能实现,失败的测试被记录为失败,JUnit 继续进行以下测试。

我在这里发现了一个类似的问题Android JUnit test suite hangs after Activity throws NullPointerException in one test case,但到目前为止没有回复:(

有没有人通过向他们传递测试数据来测试(第三方)应用程序Intent并且可以分享/提供一些建议/经验?

我确实希望我把问题说清楚了,因为它的设置非常复杂,我希望我为不熟悉该主题的人提到了所有相关事实(你知道森林和树木;))如果没有,请不要介意问,我会尝试解释:D

4

1 回答 1

0

这是我们处理问题的方式:我们使用python parse来解析“dexdump test.apk”的结果来解析出所有的测试类/方法,我们一个一个地运行它们。

看一下 dexdump 结果,很明显。解析器只需要不到 200 行代码,应该在一天内完成。要求是您没有复杂的测试用例类层次结构,否则您需要从 dexdump 构建层次结构来确定需要运行哪些测试。

于 2012-11-16T21:30:54.317 回答