mocking - 带有模拟位置的 Espresso :避免 Google 的体验弹出窗口
问题描述
我正在使用 Espresso 在使用用户位置的基于地图的应用程序上进行一些 UI 测试。
设置
- MapBox 用于地图组件,此处未使用 Google Map 组件。
- Google Play 服务库用于本地化目的
- 使用 Espresso 进行测试
- 用于伪造位置的模拟(可以在这里找到:如何编写模拟 GPS 位置的 Espresso 测试并在 Google 测试实验室中使用它们?)
- 测试在虚拟设备上的 Firebase 测试实验室中远程运行。
实际结果/问题
它有效:然后将用户位置伪造为我编码的纬度。但过了一会儿,我遇到了一些麻烦。经过几次测试后,我得到了一个似乎是由com.google.android.gms:play-services
嵌入在我们的应用程序中触发的系统弹出窗口。
消息是“为了获得更好的体验,请打开使用 Google 定位服务的设备定位。” 如下图所示:
因此,模拟代码似乎以某种方式触发了此弹出窗口,然后破坏了所有剩余的测试,因为弹出窗口在单击其中一个按钮之前不会关闭。
UI Automator:不是一个合适的解决方案
我知道我可以使用 UI Automator 添加一些代码来验证弹出窗口,但我想避免这种解决方法,因为:
- 我不知道是什么触发了这个弹出窗口(似乎是随机的)
- 我不想在仅为该弹出窗口运行每个测试之前运行一些蹩脚/重复的代码。
- 实际上,我没有使用 UI Atomator 进行测试,也不想将另一个库导入到我的项目中。
请注意,我无法在我的设备或模拟器上重现此问题,但只有在我在 gcloud(Firebase 测试实验室)上运行测试时...
问题
你有没有遇到过这个问题?您知道如何避免此弹出窗口或任何不涉及 UI Automator 的解决方法吗?
还有一件事
请记住,我在未登录任何 Google 帐户的虚拟设备上远程运行测试。此外,我无权访问设备系统/设置,但最终我应该能够使用 ADB 命令来获取一些权限或将一些设置应用于系统。
坏消息
实际上,虚拟设备上的 Firebase 测试实验室部分支持模拟位置。有关更多信息,请参阅下面的评论。
因此,根据用例,切换到真实设备可以解决您的问题,就像本主题中提到的问题一样。
解决方案
您看到的可能是 Firebase 测试实验室中的错误,如果它发生在某些设备上但适用于其他设备。例如,可以在物理三星设备上工作,但不能在物理 HTC 设备上工作。或者适用于所有物理设备,但不适用于虚拟设备。
由于我无法直接在 Stack Overflow 上向您发送消息,因此我鼓励您加入https://firebase-community.slack.com/上的 Firebase 测试实验室 Slack 频道 (#test-lab) 。
Firebase 工程师将积极调查您看到的问题,并直接查看您在项目中运行的测试运行。
推荐阅读
- angularjs - Angularjs:使用 ng-class 的性能
- powershell - 如何删除txt文件中所有前缀为913-的电话号码
- java - Spring Boot & Kafka - 尝试以错误格式使用消息时出现“错误反序列化键/值”循环
- logging - 如何配置 MFP 服务器日志级别?
- python - 如何在 Jupyter 中获取单个字符输入?
- angularjs - md-chips 中的 $index 不会在 AngularJS 中更新
- mysql - MySQL InnoDB 死锁
- c - wolfcryp RSA 解析密钥分段失败
- asp.net - 数据存储库中 Where 方法的模拟在存储库中的实际实现中返回 null
- c++ - Vscode/C++ - cout 无法输出完整的句子,也无法与整数连接