Android 13 GTS GtsPermissionControllerHostTestCases Test Failed

本文主要是介绍Android 13 GTS GtsPermissionControllerHostTestCases Test Failed,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android13 平板项目测试GtsPermissionControllerHostTestCases Failed,失败日志如下:

java.lang.AssertionError: on-device tests failed:
com.android.gts.permissioncontroller.PermissionControllerTest29#testGranted:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.test.uiautomator.UiObject2.isChecked()' on a null object reference
at com.android.gts.permissioncontroller.BasePermissionsTest.setPermissionGrantState(BasePermissionsTest.java:527)
at com.android.gts.permissioncontroller.BasePermissionsTest.setPermissionGrantState(BasePermissionsTest.java:502)
at com.android.gts.permissioncontroller.BasePermissionsTest.grantPermissions(BasePermissionsTest.java:393)
at com.android.gts.permissioncontroller.BasePermissionsTest.grantPermission(BasePermissionsTest.java:389)
at com.android.gts.permissioncontroller.PermissionControllerTest29.testGranted(PermissionControllerTest29.java:103)at android.permissioncontroller.gts.Utils.runDeviceTests(Utils.java:130)at android.permissioncontroller.gts.Utils.runDeviceTests(Utils.java:80)at android.permissioncontroller.gts.Utils.runDeviceTestsAsCurrentUser(Utils.java:44)at android.permissioncontroller.gts.PermissionControllerHostTest.testGrantAppPermissionFragment(PermissionControllerHostTest.java:229)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:568)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:61)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)at com.android.tradefed.testtype.DeviceJUnit4ClassRunner.runChild(DeviceJUnit4ClassRunner.java:111)at com.android.tradefed.testtype.DeviceJUnit4ClassRunner.runChild(DeviceJUnit4ClassRunner.java:63)at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.ParentRunner.run(ParentRunner.java:413)at com.android.tradefed.testtype.DeviceJUnit4ClassRunner.run(DeviceJUnit4ClassRunner.java:147)at com.android.tradefed.testtype.junit4.ExceptionThrowingRunnerWrapper.run(ExceptionThrowingRunnerWrapper.java:43)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.android.tradefed.testtype.HostTest.runJUnit4Tests(HostTest.java:736)at com.android.tradefed.testtype.HostTest.runTestClasses(HostTest.java:616)at com.android.tradefed.testtype.HostTest.run(HostTest.java:564)at com.android.compatibility.common.tradefed.testtype.JarHostTest.run(JarHostTest.java:56)at com.android.tradefed.testtype.suite.GranularRetriableTestWrapper.intraModuleRun(GranularRetriableTestWrapper.java:379)at com.android.tradefed.testtype.suite.GranularRetriableTestWrapper.run(GranularRetriableTestWrapper.java:289)at com.android.tradefed.testtype.suite.ModuleDefinition.run(ModuleDefinition.java:595)at com.android.tradefed.testtype.suite.ITestSuite.runSingleModule(ITestSuite.java:951)at com.android.tradefed.testtype.suite.ITestSuite.run(ITestSuite.java:828)at com.android.tradefed.invoker.InvocationExecution.runTest(InvocationExecution.java:1359)at com.android.tradefed.invoker.InvocationExecution.runTests(InvocationExecution.java:1138)at com.android.tradefed.invoker.TestInvocation.prepareAndRun(TestInvocation.java:626)at com.android.tradefed.invoker.TestInvocation.performInvocation(TestInvocation.java:278)at com.android.tradefed.invoker.TestInvocation.invoke(TestInvocation.java:1357)at com.android.tradefed.command.CommandScheduler$InvocationThread.run(CommandScheduler.java:686)

观察日志,大概意思是某个view是空,导致改测试项没继续下去,反编译该测试apk,查看源码如下:

代码很简单,就是去测试app会去申请CALENDAR 权限,具有权限以后,从日历的数据库查询一条数据,查询成功,该测试项视为PASS

申请权限,其实就是会跳转权限管理界面,也就是APP的详情界面--》Permissions-->权限列表,找到CALENDAR 权限,然后点击进去允许。。

我们失败的原因是最后一个界面的允许权限,没获取到对应的控件。仔细看下这块找控件的代码,其实是根据权限--》label-->然后找到这个view--》点击进去

我们这里就是

android.permission.READ_CALENDAR--》CALENDAR根据这个label找到view..

其实这里我们就能找到问题了,如果一个界面上有两个TextView的名字都是CALENDAR,那这里就不一定会是权限列表的那个TexviewView,接着就不会进到第三个界面,也就会造成测试报错那样,找不到getDenyButton()isChecked,也就终止了测试。

因为我们的是平板项目,Android12以后的大屏或者平板项目,底部的导航栏会变成显示一个任务栏,从 NavigationBar 变成 Taskbar ,Taskbar 允许一部分app常驻于此;

可以看到不管点进哪个app,底部都有个TaskBar,而且我们的TaskBar 常驻的app里面刚好有App叫CALENDAR,这就会导致我们在测试的时候,第二个界面就会点击到底部TaskBar的CALENDAR

这就是我们测试失败的原因。修改方法也很简单,PermissionControllerTest29 APP内涉及的权限,底部不包含这些权限对应Label同名的APP就可以了

也就是我们底部的TASKBAR 不能包含APP名字为:Contacts,Calendar,Location,Camera即可。移除以后,复测PASS

这篇关于Android 13 GTS GtsPermissionControllerHostTestCases Test Failed的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/343165

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤