如何编写模拟GPS位置的Espresso测试,并在Google Testlab中使用它们?

时间:2018-09-21 09:03:19

标签: android android-espresso android-testing android-location firebase-test-lab

我用Espresso Recorder记录了浓咖啡测试。我想测试我的应用中的一些位置更改。

目前,我正在使用以下代码来模拟位置:

LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy( Criteria.ACCURACY_FINE );

String mocLocationProvider = LocationManager.GPS_PROVIDER;//lm.getBestProvider( criteria, true );

lm.addTestProvider(mocLocationProvider, false, false,
        false, false, true, true, true, 0, 5);
lm.setTestProviderEnabled(mocLocationProvider, true);

Location loc = new Location(mocLocationProvider);
Location mockLocation = new Location(mocLocationProvider); // a string
mockLocation.setLatitude(-26.902038);  // double
mockLocation.setLongitude(-48.671337);
mockLocation.setAltitude(loc.getAltitude());
mockLocation.setTime(System.currentTimeMillis());
mockLocation.setAccuracy(1);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    mockLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
lm.setTestProviderLocation( mocLocationProvider, mockLocation);

我还向调试清单文件添加了权限:

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

但不幸的是,我仍然收到安全异常:

java.lang.SecurityException: mypackage.test from uid not allowed to perform MOCK_LOCATION

我想使用Google Firebase测试实验室中的模拟位置来运行记录的测试用例。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

基本上,您必须在devs选项中启用该应用程序(选择模拟位置应用程序)。由于您无法控制Google平台上的设备,因此必须使用ADB命令将其启用。

appops set {yourPackageName} android:mock_location allow

例如,这就是我在@before函数中进行模拟位置测试的过程:

@Before
fun grantPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        with(getInstrumentation().uiAutomation) {
            ...
            executeShellCommand("appops set " + InstrumentationRegistry.getTargetContext().packageName + " android:mock_location allow")
            Thread.sleep(1000)
            ...
        }
    }
}

基于这种方法,请注意,如果插入任何新设备,您还可以为gradle任务创建一个片段,以在工作站上自动执行该片段。参见例如:How to set Allow Mock Location on Android Device before executing AndroidTest with uiautomator and espresso?

希望获得帮助!