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.mzph.cn/bicheng/60840.shtml

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

相关文章

【Qt聊天室】客户端实现总结

目录 1. 项目概述 2. 功能实现 2.1 主窗口设计 2.2 功能性窗口 2.3 主界面功能实现 2.4 聊天界面功能实现 2.5 个人信息功能开发 2.6 用户信息界面设置功能 2.7 单聊与群聊 2.8 登录窗口 2.9 消息功能 3. 核心设计逻辑 3.1 核心类 3.2 前后端交互与DataCenter 4…

行业类别-智能制造-子类别工业4.0-细分类别物联网应用-应用场景智能工厂建设

1.大纲分析 针对您提出的题目“4.0 行业类别-智能制造-子类别工业4.0-细分类别物联网应用-应用场景智能工厂建设”&#xff0c;以下是一个详细的大纲分析&#xff0c;旨在深入探讨该应用场景下的各个方面&#xff1a; 一、引言 智能制造与工业4.0概述 智能制造的定义与发展趋…

【异常记录】Junitmock之InvalidUseOfMatchersException异常

mock之InvalidUseOfMatchersException异常 新手小白对mock一知半解&#xff0c;就开始自测了&#xff0c;被这个InvalidUseOfMatchersException困扰了一晚上。排查了好久&#xff0c;大多数文章都把英文翻译了一遍&#xff0c;但自检无问题。最后发现是&#xff0c;注入的时候…

将多张图片按照顺序合并成一个PDF文件

刚开始合并没有顺序&#xff0c;合并成了一个指定文件了&#xff0c;但排序是乱的。 import os from PIL import Imagedef folder_to_pdf(folder_path, output_path):image_paths []for file_name in os.listdir(folder_path):if file_name.endswith((jpg, jpeg, png)):image…

普通电脑上安装属于自己的Llama 3 大模型和对话客户端

#大模型下载地址&#xff1a;# Llama3 因为Hugging Face官网正常无法访问&#xff0c;因此推荐国内镜像进行下载&#xff1a; 官网地址&#xff1a;https://huggingface.co 国内镜像&#xff1a;https://hf-mirror.com GGUF 模型文件名称接受&#xff0c;如上述列表中&…

实用且免费的 IP 地域查询 API 接口推荐

实用且免费的 IP 地域查询 API 接口推荐 在日常开发中&#xff0c;IP 地域查询是一个常见需求。最近无意间发现一个实用的 IP 地域查询 API&#xff0c;目前是免费的&#xff0c;未来是否收费尚不可知&#xff0c;但在当前情况下非常值得推荐。 API 地址示例&#xff1a; ht…

java瑞吉外卖

环境搭建 一、数据库环境搭建 1.新建数据库reggie&#xff0c;这里字符集一般用utf8mb4&#xff0c;排序规则一般用utf8mb4_general_ci或utf8mb4_unicode_ci 2.然后导入表结构 二、创建springboot工程 然后检查maven仓库设置&#xff0c;jdk 这是我的pom.xml文件 <?xml …

提高 RAG 生成准确性

提高 RAG 生成准确性&#xff1a;详细优化策略与具体示例 1. 优化检索模块&#xff1a;提高检索的相关性与准确性 在 RAG 中&#xff0c;检索模块&#xff08;Retriever&#xff09;用于从大量文档中选择相关内容。如果检索模块选择的文档与问题不匹配&#xff0c;生成的答案…

App Store用户评论如何影响ASO优化

您是否专注于提高应用的知名度&#xff0c;并想知道应用商店评分和用户评论如何发挥作用&#xff1f;应用商店用户评论和评分对于塑造应用的成功至关重要&#xff0c;并且可以显著影响您的应用商店优化 (ASO) 策略。本文提供了利用这些元素为您带来优势的见解和策略。 如今&…

我谈二值形态学基本运算——腐蚀、膨胀、开运算、闭运算

Gonzalez从集合角度定义膨胀和腐蚀&#xff0c;不易理解。 Through these definitions, you can interpret dilation and erosion as sliding neighborhood operations analogous to convolution (or spatial filtering). 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向…

狼蛛F87Pro键盘常用快捷键的使用说明

基础调节 1、FN ESC &#xff1a;恢复默认 2、FN ~ &#xff1a;2.4G对码 3、FN 1 &#xff1a;蓝牙设备1# 4、FN 2 &#xff1a;蓝牙设备2# 5、FN 3 &#xff1a;蓝牙设备3# 6、FN Q &#xff1a;Android系统 7、FN W &#xff1a;Windows系统 8、FN E &#x…

深入解析 CentOS 7 上 MySQL 8.0 的最佳实践20241112

深入解析 CentOS 7 上 MySQL 8.0 的最佳实践 随着现代数据库应用需求的快速增长&#xff0c;MySQL 8.0 成为许多企业和开发者的首选数据库管理系统。其性能改进、增强的安全特性以及强大的兼容性&#xff0c;使其在现代架构中占据重要地位。本篇博客将基于实践经验&#xff0c…

【AIGC】如何通过ChatGPT提示词Prompt定制个性学习计划

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词&#x1f4af;配置信息使用方法 &#x1f4af;指令/language/plan/start/test/continue/config &#x1f4af;小结 &#x1f4af;前言 在这篇文章中…

深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器

标题&#xff1a;深入探索React合成事件&#xff08;SyntheticEvent&#xff09;&#xff1a;跨浏览器的事件处理利器 引言 在React的世界里&#xff0c;事件处理是构建交互式应用的核心。React的合成事件&#xff08;SyntheticEvent&#xff09;是React事件系统的一部分&…

效益登记册效益管理计划

效益登记册 benefit Register效益管理计划效益登记册汇集并列出项目集计划的效益&#xff0c;用于在项目集的整个持续时间内测量和沟通效益的交付。在效益识别阶段&#xff0c;效益登记册根据项目集商业论证、组织战略计划和其他相关项目集自标而编制。随后&#xff0c;登记册由…

NTP放大攻击:DDoS攻击的新变种及其防御策略

近年来&#xff0c;随着网络技术的不断发展&#xff0c;网络攻击手段也层出不穷。其中&#xff0c;NTP放大攻击作为一种新型的分布式拒绝服务&#xff08;DDoS&#xff09;攻击方式&#xff0c;给许多企业和个人用户带来了严重的威胁。本文将深入探讨NTP放大攻击是否是DDoS攻击…

求10000以内n的阶乘

题目描述 求10000以内n的阶乘。 输入描述 只有一行输入&#xff0c;整数n&#xff08;0≤n≤10000&#xff09;。 输出描述 一行&#xff0c;即n!的值。 样例 输入 4 输出 24 AC: #include<bits/stdc.h> using namespace std; int a[114514]{0},c[114514]{1}…

RFID被装信息化监控:物联网解决方案深入分析

被装物联网信息化监控构成了一套复杂而高效的处理方案&#xff0c;它巧妙地将物联网技术与被装资源管理的具体需求相结合&#xff0c;实现了对被装资源实时监控、智能化调控和优化分配。以下是对被装物联网信息化监控的详细说明&#xff1a; 一、被装物联网信息化监控的定义 …

Pytest-Bdd-Playwright 系列教程(9):datatable 参数的使用

Pytest-Bdd-Playwright 系列教程&#xff08;9&#xff09;&#xff1a;datatable 参数的使用 前言一、什么是 datatable 参数&#xff1f;Gherkin 表格示例 二、datatable 参数的基本使用feature文件&#xff1a;获取用户信息并执行相关操作的使用 datatable 处理表格数据Give…

C++ 关于类与对象(中篇)一篇详解!(运算符重载)

赋值运算符重载 运算符重载 C 为了 增强代码的可读性 引入了运算符重载 &#xff0c; 运算符重载是具有特殊函数名的函数 &#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键…