Android - 用于接收GCM推送通知的自动化测试

时间:2018-03-26 16:46:02

标签: android uiautomator

如何为接收GCM通知添加测试覆盖率?测试场景:我的应用程序在后台,通知到达,检查它是否显示,点击通知打开应用程序。当我手动测试时,它在模拟器中工作。我得到了Android Notification Not Showing On API 26所以需要一个测试来检测破损。我看到了此How to detect headsup notification in uiautomator?,但它没有显示如何为我的应用创建通知。

更新 我想出了如何创建由接收器处理的意图。

    // app already started and in background
    Intent intent = new Intent();
    intent.setAction("com.google.android.c2dm.intent.RECEIVE");
    intent.putExtra("from", "1234567890");
    intent.putExtra("message", "Android may be hard, but iOS is even harder");
    Context context = InstrumentationRegistry.getInstrumentation().getContext();
    context.sendBroadcast(intent); 

我的接收者和听众:

    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!--category tag not required if min SDK 16 or higher-->
        </intent-filter>
    </receiver>

    <service
        android:name=".gcm.MyGcmListenerService"
        android:permission="com.google.android.c2dm.permission.RECEIVE"
        android:exported="true" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

1 个答案:

答案 0 :(得分:1)

解决方案涉及搞清楚一些事情。

  1. 在AndroidManifest.xml中,对于receiver元素,SDK 16及更高版本将忽略category标记。
  2. 显示的通知可能因app位于前台或后台而有所不同。
  3. 用于查找通知的UISelector具有与上面链接中的示例不同的className。首先使用&#34; textContains&#34;方法,然后优化您的选择器。
  4. 我们的GcmListenerService忽略了没有指定from的消息,因此不得不在&#34;中添加&#34;我的意图。
  5. 我找不到在https://console.firebase.google.com上查看现有GCM消息的方法,因此让我的Intent与服务器发送的内容相匹配是试错的(例如,来自字段未由服务器明确设置)应用)
  6. 检查是否显示通知很棘手,因为无法使用Android Studio Layout Inspector检查通知抽屉。因此找到元素是反复试验的。我这样做了:

        UiSelector textSelector = new UiSelector().textContains("some text in my message");
        UiObject notificationText = device.findObject(textSelector);
    

    然后输出UiObjects的属性,这样我就可以使选择器更具体(添加packageName和className)。

    我的测试意图和接收器/服务元素的代码在问题的更新部分。