难道测试北京、东京、伦敦的定位逻辑,真的要人跑过去?

文章封面

做地图类应用的时候,最头疼的就是测试定位逻辑。要测签到,得真的走到那个位置;要测跨城推荐,得真的换个城市;要测运动轨迹,得真的出去跑十公里。

不可能啊。总不能为了测个北京定位,专门飞一趟北京吧。

以前的办法是:自己在代码里写死经纬度,改一下编译跑一遍。但这样测不了轨迹变化,测不了连续移动,测不了速度变化。直到 DevEco Studio 加了位置模拟和 GPX 轨迹回放,这些问题才真正解决。

一、位置模拟解决了什么问题

先把场景理清楚:

测试场景以前怎么办现在怎么办
特定位置签到代码写死经纬度Manual 模拟静态位置
跨城推荐改代码换城市切换坐标模拟
运动轨迹真的出去跑GPX 回放轨迹
速度变化没法测GPX 控制速度
边界位置找不到边界点手动设置边界坐标

以前测定位,要么改代码,要么真跑。现在不用了,在工位上就能模拟各种位置和轨迹。

二、Manual 静态位置模拟

最简单的就是 Manual 模式:手动设置经纬度,模拟一个静态位置。

适合测什么?

  • 特定地点签到;
  • 附近的人推荐;
  • 门店位置展示;
  • 特定城市的内容。

设置很简单:打开 DevEco Studio 的位置模拟面板,输入经纬度,点开始,设备就认为你在那个位置了。

这段代码解决什么问题: 验证模拟位置是否生效。
文件: pages/LocationTest.ets
用途: 读取当前位置
接入位置: 页面启动时

import location from '@ohos.geoLocationManager';

async getCurrentLocation() {
  const loc = await location.getCurrentLocation();
  console.log(`纬度: ${loc.latitude}, 经度: ${loc.longitude}`);
  this.lat = loc.latitude;
  this.lng = loc.longitude;
}

跑一下,看打出来的经纬度是不是你设置的那个。是的话,说明模拟生效了。

三、GPX 轨迹回放是什么

静态位置只能测"在某个点"的情况。但很多场景是连续移动的:

  • 运动轨迹记录;
  • 导航路线;
  • 跨城移动;
  • 速度变化。

这时候就要用 GPX 轨迹回放了。

GPX 是一种轨迹文件格式,里面存了一系列经纬度点,每个点有时间戳。回放的时候,系统按时间顺序把这些点依次发给应用,模拟连续移动的过程。

你可以提前录好一条跑步的 GPX,或者自己编一条路线,导入进去,点回放,应用就以为你真的在沿着这条路线移动。

业务流程图

四、GPX 点位间隔为什么重要

GPX 文件里每个点的间隔很重要。

间隔效果
间隔太大移动跳变,轨迹不连续
间隔太小点太多,回放卡顿
间隔合理连续平滑移动

很多人做的 GPX 文件,点位间隔一两秒,回放的时候应用收到一个点,过两秒又收到一个点。轨迹就跳了。

要根据实际场景调整间隔:跑步的话间隔一两秒差不多,开车的话间隔可以长一点。

五、几个关键测试场景

用位置模拟,可以测这些以前很难测的场景:

场景怎么测
位置漂移模拟坐标在小范围内抖动
路线移动GPX 回放一条路线
跨城市从一个城市坐标切到另一个
速度变化GPX 点时间间隔调整
边界位置手动设置边界经纬度
信号丢失停止模拟看应用怎么处理

以前这些场景要么真跑,要么改代码。现在直接在位置模拟面板里设置就行。

六、几个容易踩的坑

第一个坑:只测试固定经纬度。只能测"在某个点"的情况,测不了连续移动。

第二个坑:GPX 点位间隔不合理。轨迹跳变,应用处理不对。

第三个坑:业务把位置更新频率写死。不管真实情况,每隔固定时间就要更新一次,模拟的时候很容易出问题。

第四个坑:模拟位置结束后忘记恢复真实定位。测完了,设备还停留在模拟位置,其他应用也受影响。

第五个坑:只验证 UI 不验证业务状态。界面显示对了,但业务逻辑没走通。

运行效果图

这次做位置测试最大的体会是:以前测定位全靠真跑,现在在工位上就能把各种场景都覆盖了。静态位置、动态轨迹、跨城移动、边界场景,全在 DevEco Studio 的位置模拟面板里搞定。不用再为了测个定位专门跑出去。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐