集成测试的颤振位置权限不起作用

Kab*_*bir 6 android integration-testing android-permissions flutter

我正在尝试为我的位置应用程序编写内容integration_test。我需要允许我的integration_test 的位置权限。

我已经ANDROID_SDK_ROOT在我的windows环境变量中设置了。我已经从命令提示符和 Android Studio 终端进行了测试,两者都显示良好。https://i.ibb.co/4gDPs3Z/echo-android-sdk-root.jpg

不幸的是,我 ANDROID_SDK_ROOTnull. Platform.environment我已附上屏幕截图https://i.ibb.co/t2Y3fBc/android-sdk-root-not-found.jpg

如果我硬编码envVars到我的 Windows 机器的 Android 位置C:/Users/User/AppData/Local/Android/Sdk/platform-tools/adb.exe,那么它会抛出错误

No such file or directory Command: C:/Users/User/AppData/Local/Android/Sdk/platform-tools/adb.exe shell pm grant com.dealerapp.mlink android.permission.ACCESS_COARSE_LOCATION

下面是我的源代码

Future<void> grantLocationPermission() async{

    final Map<String, String> envVars = Platform.environment;
    print('evnVars = $envVars');
    print('ANDROID_SDK_ROOT = ${envVars['ANDROID_SDK_ROOT']}');
    final String adbPath = envVars['ANDROID_SDK_ROOT']! + '/platform-tools/adb.exe';
    
    await Process.run(adbPath, [
      'shell',
      'pm',
      'grant',
      'com.abcd.efgh', //my app package
      'android.permission.ACCESS_COARSE_LOCATION'
    ]);
    await Process.run(adbPath, [
      'shell',
      'pm',
      'grant',
      'com.abcd.efgh', //my app package
      'android.permission.ACCESS_FINE_LOCATION'
    ]);
    await integrationDriver();
}
Run Code Online (Sandbox Code Playgroud)

任何建议将不胜感激。提前致谢。

小智 7

这是行不通的,因为 envVars 会给你执行它的系统的环境变量。由于您在模拟器中执行,因此平台是 Android [print(Platform.isAndroid)并参见]此外,如果您进行调试,您将看到环境变量未设置。

正如您可能已经想到的,集成测试无法与本机弹出窗口交互。所以以下是我发现解决这个问题的唯一方法

  1. 有测试驱动程序:我只能使用以下步骤解决问题
  • 创建文件夹“test_driver”
  • 添加文件“integration_test_driver.dart”
  • 将以下内容添加到文件中
Future<void> main() async {
  await Process.run(
   'adb',
   [
     'shell',
     'pm',
     'grant',
     'com.example.<your app name>', // TODO: Update this
     'android.permission.ACCESS_COARSE_LOCATION'
   ],
 );
 // TODO: Add more permissions as required
 await integrationDriver();
}
Run Code Online (Sandbox Code Playgroud)
  • 创建文件夹“integration_test”
  • 添加文件“app_test.dart”并在此处添加您的测试
  • 使用命令运行测试
    flutter drive --driver=test_driver/integration_test_driver.dart --target=integration_test/app_test.dart
  • 您只需执行一次此操作,之后直接从测试资源管理器运行测试将不会显示弹出窗口
  • 要再次显示对话框,请在终端中使用以下命令撤销权限
    adb shell pm revoke com.example.aries_fe android.permission.ACCESS_COARSE_LOCATION
  1. 粗暴的方式(不建议)
    1. 找到 x,y 坐标,您可以在其中看到要在弹出窗口中单击的选项
    2. 调用tester.tapAt(const Offset(x,y))你的测试

笔记:

  • 具有以下行的脚本不起作用。我想知道为什么这不起作用。将进一步调查此事。
adb shell pm grant com.example.<your app name> android.permission.ACCESS_COARSE_LOCATION 
flutter test integration_test/login_test.dart
Run Code Online (Sandbox Code Playgroud)
  • setUpApp()也不行。