Android Settings 单元测试 | 如何运行单元测试?

背景

在Android Settings 单元测试 | Telephony Network 模块 APN 案例中粗略介绍了单元测试逻辑内容,但是在独立APK里面如何将单元测试跑起来还是有疑问,因为APP不能直接install,无法借助Android Studio直接Run,在安装的一步会报错由于未签名。

> Task :connectedDebugAndroidTest FAILED
Exception thrown during onBeforeAll invocation of plugin AndroidTestApkInstallerPlugin: ErrorName: INSTALL_FAILED_UPDATE_INCOMPATIBLE


NameSpace: DdmlibAndroidDeviceController


ErrorCode: 1


ErrorType: TEST


Message: Failed to install split APK(s): [E:\code\DemoUnit\build\intermediates\apk\debug\DemoUnit.apk]


Failed to install split APK(s): [E:\code\DemoUnit\build\intermediates\apk\debug\DemoUnit.apk]


Failed to commit install session 396951782 with command package install-commit 396951782. Error: INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package com.demo.unit signatures do not match newer version; ignoring!


com.android.ddmlib.InstallException: Failed to commit install session 396951782 with command package install-commit 396951782. Error: INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package com.demo.unit signatures do not match newer version; ignoring!

因为是签名限制的问题,就考虑尝试使用debug版本,将没有签名的APK push到system/priv-app目录下重启使之生效,结果无法正常开机,因此这个方法是不可行的。

甚至在开机过程PMS都没有起来,执行adb install 命令是返回“cmd: Can't find service: package”。

然后把debug未签名的apk删除以后,就算没有原本的apk也能直接正常开机。

如何运行Unit Test?

包含androidTest测试逻辑的APK安装到了软件怎么用命令跑单元测试?

假设应用的包名为 com.example.myapp,测试类为 ExampleInstrumentedTest,执行所有测试的方法可以用以下命令:

adb shell am instrument -w -r -e debug false -e class <your.package.name.YourTestClass> <your.package.name.test/androidx.test.runner.AndroidJUnitRunner># <your.package.name.YourTestClass>: 替换为你想要执行的测试类的全名。
# <your.package.name.test/androidx.test.runner.AndroidJUnitRunner>: 
#   是测试 APK 的包名,后面加上 androidx.test.runner.AndroidJUnitRunner。

如:

案例1:

adb shell am instrument -w -r -e debug false -e class com.demo.unit.ExampleInstrumentedTest com.demo.unit.test/androidx.test.runner.AndroidJUnitRunner

Note:斜体是需要替换的包名

  • com.demo.unit.ExampleInstrumentedTest 是代码类packages包名,在java文件头定义的
  • com.demo.unit.test 是应用包名,可以通过pm查看,是在build.gradle有定义的applicationId
    • 如果应用是一个插件,也不用换成宿主的包名。

案例2:

adb shell am instrument -w -r -e debug false -e class com.demo.settings.PreferenceTest com.demo.unit/androidx.test.runner.AndroidJUnitRunner

Note:

  • 单元测试是包名是com.demo.unit,通过pm path可查路径。
  • 代码路径包名是com.demo.settings,测试类为PreferenceTest.java。

这种执行结果虽然fail了,但是说明命令是成功的。

如果只想执行某个特定的测试方法,可以通过如下命令:

adb shell am instrument -w -r -e debug false -e class <your.package.name.YourTestClass#yourTestMethod> <your.package.name.test/androidx.test.runner.AndroidJUnitRunner># yourTestMethod: 替换为想要执行的测试方法的名称。

常见问题

问题1:

运行命令报错,表示 Android 系统无法找到指定的测试 Runner。这通常意味着测试 Runner 没有在 AndroidManifest.xml 中正确声明,或者测试 APK 没有被正确安装。

INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.demo.unit/androidx.test.runner.AndroidJUnitRunner}

解决方案:在AndroidManifest.xml 添加 AndroidJUnitRunner 声明。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"coreApp="true"package="com.android.settings"android:sharedUserId="android.uid.system"><uses-sdk android:minSdkVersion="28" /><instrumentationandroid:name="androidx.test.runner.AndroidJUnitRunner"android:targetPackage="com.demo.unit" />

并通过如下命令确保应用已经安装

adb shell pm list packages | grep com.demo.unit

问题2:

android.util.AndroidException: INSTRUMENTATION_FAILED: com.demo.unit/androidx.test.runner.AndroidJUnitRunner
        at com.android.commands.am.Instrument.run(Instrument.java:543)
        at com.android.commands.am.Am.runInstrument(Am.java:213)
        at com.android.commands.am.Am.onRun(Am.java:85)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:62)
        at com.android.commands.am.Am.main(Am.java:54)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:394)

测试报告

adb 命令执行的单元测试不像在android studio 里面跑的(),不能直接生成可视化的测试报告,只能通过打印文本结果,在原本命令追加输出打印。

adb shell am instrument -w -r -e debug false -e class com.demo.settings.PreferenceTest com.demo.unit/androidx.test.runner.AndroidJUnitRunner > test_result.txt

如何编写单元测试?

能参考Google的套件包实现吗?

如何查看单元测试覆盖率?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472269.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…

编译原理(手绘)

大家好&#xff0c;今天给大家分享一下我自己对c语言编译链接的一点见解&#xff08;本人是学生&#xff0c;有记笔记的习惯&#xff09;&#xff0c;那么今天就给大家分享我的笔记。 以上只是我本人的一些见解&#xff0c;并非绝对&#xff0c;欢迎大家一起交流。 那么今天分…

跳房子(弱化版)

题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏&#xff0c;也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下&#xff1a; 在地面上确定一个起点&#xff0c;然后在起点右侧画 n 个格子&#xff0c;这些格子都在同一条直线上。每个格子内…

初识Linux · 共享内存

目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信&#xff0c;本文介绍的是进程通信的另外一种方式&#xff0c;即共享内存。但是这种通信方式的特点是只能本地通信&#xff0c;并且不像管道那样有保护机制&#xff0c;这里是没有的。 我们通…

机器学习day5-随机森林和线性代数1

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

Essential Cell Biology--Fifth Edition--Chapter one (6)

1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器&#xff0c;这些细胞器被单层膜…

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

政务数据治理专栏开搞!

写在前面 忙忙碌碌干了一年政务数据治理的工作&#xff0c;从法人数据到自然人&#xff0c;从交通到地理信息等等&#xff0c;突发想法开一个专栏讲一讲政务数据遇到的问题&#xff0c;以及治理的成效&#xff0c;或许有朋友爱看。 政务数据&#xff0c;又称之为政务数据资源&a…

CondaError: Run ‘conda init‘ before ‘conda activate‘解决办法

已经执行了conda init&#xff0c;但是还是会报错CondaError: Run ‘conda init’ before ‘conda activate’ 原因&#xff1a;权限不够 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;然后进入要操作的文件夹下&#xff0c;重新执行 conda init 和 conda activate 就可…

【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南

一、CentOS 7下载源 华为源&#xff1a;https://mirrors.huaweicloud.com/centos/7/isos/x86_64/ 阿里云源&#xff1a;centos-vault-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 百度网盘源&#xff1a;https://pan.baidu.com/s/1MjFPWS2P2pIRMLA2ioDlVg?pwdfudi &…

软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型

4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障&#xff0c;网络安全单元按照一定的规则&#xff0c;相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制&#xff0c;通过各…

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”&#xff1f;韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中&#xff0c;母亲Jang Ji-sung透过VR头显&#xff0c;看到了三年前因白血病去世的女儿Nayeon。当她伸出双手&#xff0c;居然能摸到女儿的…

[Admin] Dashboard Filter for Mix Report Types

Background RevOps team has built a dashboard for sales team to track team members’ performance, but they’re blocked by how to provide a manager view based on sales’ hierarchy. Therefore, they seek for dev team’s help to clear their blocker. From foll…

WPF中如何使用区域导航

1.创建一个Prism框架的项目并设计好数据源 User如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace WPF练习17区域导航.Models {public class User{public int UserId { get; …

AR眼镜方案_AR智能眼镜阵列/衍射光波导显示方案

在当今AR智能眼镜的发展中&#xff0c;显示和光学组件成为了技术攻坚的主要领域。由于这些组件的高制造难度和成本&#xff0c;其光学显示模块在整个设备的成本中约占40%。 采用光波导技术的AR眼镜显示方案&#xff0c;核心结构通常由光机、波导和耦合器组成。光机内的微型显示…

一文学会docker中搭建kali

一文学会docker中搭建kali 本文环境&#xff1a;部署好docker的ubuntu系统主机一台 直接pull对应的镜像&#xff1a; docker pull kalilinux/kali-rolling 然后通过端口映射&#xff0c;将本地100端口映射到容器的22端口&#xff0c;就可以ssh了 docker run -it -p 100:22…

git上传文件到远程仓库

git上传项目到远程仓库 1. 生成SSH公钥(ssh-keygen),一直回车即可 2. 将公钥复制下来,粘贴至码云仓库 公钥默认地址: C:\Users\Administrator\.ssh3. 克隆项目到本地(复制SSH地址) 4. 上传文件到刚创建的项目(这里取名为test.py) 5. 上传需要做的几个步骤 (1) git add . 添…

STM32 串口输出调试信息

软硬件信息 CubeMX version 6.12.1Keil uVision V5.41.0.0 注意 串口有多种&#xff1a; TTL232485 串口的相关知识&#xff1a; 01-【HAL库】STM32实现串口打印&#xff08;printf方式) &#xff0c; 内含 TTL 和 232 区别。 我把 232 串口连进 STM32 串口助手收到的信息…

【计算机网络】TCP协议特点3

心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制&#xff0c;用于检测两个实体之间的连接是否仍然活跃&#xff0c;或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端&#xff0c;服务端回复一个固定…

STM32单片机CAN总线汽车线路通断检测

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…