当前位置: 首页 > article >正文

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: 替换为想要执行的测试方法的名称。

常见问题

运行命令报错,表示 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" />

    <instrumentation
        android:name="androidx.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.demo.unit" />

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

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

如何编写单元测试?

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


http://www.kler.cn/a/390683.html

相关文章:

  • 第74期 | GPTSecurity周报
  • request爬虫库的小坑
  • TensorRT基础知识
  • 【Qt-ROS开发】使用 Qt Creator 构建和编译含 ROS 库的 Qt 项目
  • 使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行
  • java操作ES(一)RestHighLevelClient(2)集成与demo
  • sanitize-html 防止 XSS(跨站脚本攻击)
  • linux 用C语言编写自己的myshell
  • libgdiplus在MacOS M1上问题:Unable to load shared library ‘libgdiplus‘
  • unity3d————协程练习题
  • 简记Vue3(五)—— Pinia
  • C++ 错题本--duplicate symbol问题
  • linux文本管理!!!
  • 实在智能受邀出席柳州市智能终端及机器人产业发展合作大会
  • 【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
  • AI引领PPT创作:迈向“免费”时代的新篇章?
  • Git超详细教程
  • 二、前端学习:个人主页网站搭建
  • vue实现拖拽,可实现排序拖拽和自由拖拽(vuedraggable)
  • lnmp:自己的“百度网盘”
  • SpringBoot自动装配原理解析
  • Android 生成并加载PDF文件
  • 豆包大模型团队开源RLHF框架,破解强化学习训练部署难题
  • AI猫娘第二弹 | 基于Text和Chat模型实现文本生成
  • Oceanbase-Topk直方图
  • 【C++】基础语法概念