很长一段时间以来,我都可以通过阅读 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