在调试CTS模块之前,需先对Android中的测试有一定的了解,特别是colab上的教程,建议阅读。
colab教程
测试应用 | Android Studio | Android Developers
android中的测试分为:本地测试 和 插桩测试。
当使用android studio 创建一个新的 Android 项目时,默认获得以下源集。
-
androidTest
:包含称为instrumented测试的测试。插桩测试(androidTest源码集)
这些测试在真实或模拟的 Android 设备上运行,因此它们反映了现实世界中会发生什么,但速度也慢得多。
-
test
:包含称为本地测试的测试。本地测试(测试源集)
这些测试在开发机器的 JVM 本地运行,不需要模拟器或物理设备。正因为如此,他们跑得很快,但他们的忠诚度较低,这意味着他们的行为不像在现实世界中那样。
CTS中的目录结构更复杂。
目前有以下几种方式,调试模块。
am instrument
atset
源码导入 android studio
1. am instrument
1.1 修改源码
修改后(例如添加log)。
1.2 编译模块
进入模块目录,mma 编译生成新的apk。如果想快一点就加上-j,例如 mma -j20
,具体加多少看机器配置。加太多有可能会崩掉。最后会在out/host/linux-x86/cts
目录下生成。
source build/envsetup.sh
lunch aosp_arm64
cd cts/tests/camera
mma
1.3 安装apk
执行adb install -g
安装 apk.
adb install -g CtsCameraTestCases.apk
GitHub Copilot: 在 Android 兼容性测试套件(CTS)中,
cts-tradefed
工具使用 Android Debug Bridge(ADB)来与 Android 设备进行通信,并在设备上运行测试用例。当cts-tradefed
工具需要在设备上安装和运行测试应用程序时,它会使用adb install
命令来安装应用程序,并使用adb shell
命令来启动应用程序。在 Android 系统中,当应用程序需要访问敏感权限(例如读取联系人或发送短信)时,系统会弹出一个对话框,询问用户是否授权该应用程序访问该权限。如果用户授权了该权限,应用程序就可以访问该权限所需的功能。在 CTS 测试中,cts-tradefed
工具会自动授权测试应用程序所需的权限,以确保测试用例可以正确地执行。这是因为在 CTS 测试中,测试应用程序是由 CTS 测试框架自动安装和运行的,而不是由用户手动安装和运行的。因此,为了确保测试用例可以正确地执行,cts-tradefed
工具会自动授权测试应用程序所需的权限。具体来说,cts-tradefed
工具会在安装测试应用程序时,使用adb install -g
命令来安装应用程序。-g
参数表示在安装应用程序时自动授予所有权限。这样,当测试应用程序在设备上运行时,它就可以自动访问所有需要的权限,而不需要用户手动授权。
有时候apk无图标,可以使用pm list
查看是否正常安装。
pm list packages -e "camera"
如果执行 adb install -r xx.apk
,后面执行单元测试可能会报错,这是由于需要permission。因此这种情况最好还是执行 -g去安装apk。如果执行 adb install -r xx.apk
,在 settings里面打开camera的权限后,即可正常运行。
如需卸载可使用 adb uninstall
。包名可在AndroidManifest.xml
中查看。
adb uninstall android.camera.cts
1.4 使用am instrument
测试
执行am instrument
会运行整个测试软件包。要运行测试软件包中的所有测试类,请输入:
adb shell am instrument -w com.android.demo.app.tests/androidx.test.runner.AndroidJUnitRunner
语法如下所示:
adb shell am instrument -w <test_package_name>/<runner_class>
am instrument
工具使用 -e
标记以键值对的形式将测试选项传递给 AndroidJUnitRunner
或 InstrumentationTestRunner
,语法如下:
-e <key> <value>
GitHub Copilot:
AndroidJUnitRunner
和InstrumentationTestRunner
都是Android测试框架中的测试运行器,但它们之间有一些区别。InstrumentationTestRunner
是Android测试框架的早期版本中使用的测试运行器,它是一个基于Instrumentation
的测试运行器,可以运行在Android设备或模拟器上。它可以运行JUnit3
和JUnit4
测试,并提供了一些额外的功能,如测试套件的支持、测试超时、测试结果的输出等。AndroidJUnitRunner
是Android测试框架的更新版本中使用的测试运行器,它是一个基于JUnit4
的测试运行器,可以运行在Android设备或模拟器上。它提供了与JUnit4
相同的功能,并支持JUnit4
的注释和规则。此外,它还提供了一些额外的功能,如多进程测试、测试过滤、测试超时、测试结果的输出等。因此,AndroidJUnitRunner
是更先进和更强大的测试运行器,建议在新的Android测试项目中使用它。
因此可以使用如下命令测试某个方法。
adb shell am instrument -e class android.hardware.camera2.cts.ZoomCaptureTest#testRawZoomCapture -w android.camera.cts/androidx.test.runner.AndroidJUnitRunner
执行完这条命令后,该函数会被执行,可以看到添加的log被执行。
1.5 优缺点
优点:无需执行 ./cts-tradefed 就能执行JUnit单元测试,编译速度快。
缺点:功能相对有限,不支持批量测试或高度定制化的测试场景。
2. atset
2.1 配置环境
source build/envsetup.sh
lunch aosp_arm64
cd cts/tests/camera
2.2 构建测试模块
执行m CtsCameraTestCases
构建CtsCameraTestCases
模块:
m CtsCameraTestCases
2.3 测试
2.3.1 测试整个模块
atest CtsCameraTestCases
执行 atest CtsCameraTestCases
会自动测试整个模块。
2.3.2 测试特定方法
官方文档中例子如下(更多请参考官方文档):
atest com.android.server.wm.ScreenDecorWindowTests#testMultipleDecors
atest FrameworksServicesTests:ScreenDecorWindowTests#testFlagChange,testRemoval
也就是说,这里可以执行 atest className#methodName
。
执行命令:
atest android.hardware.camera2.cts.ZoomCaptureTest#testRawZoomCapture
log出现,表示函数被执行。
2.4 优缺点
优点:这种方式,不用手动安装apk 。
缺点:需找到对应模块,第一次构建模块,耗时较长。
3. 源码导入 android studio后,直接debug
3.1 导入Android Studio
可参考这些:
CTS自带测试用例(buletooth)导入Android Studio图文教程
Android Studio导入CTS测试用例并测试
(2)-cts调试环境的搭建
3.2 优缺点
优点:可直接run,走gradle编译。
缺点:需配置gradle,导入framework等jar。配置较为复杂。可能适用于错误较多,长期debug的project。
最后来个AI总结版。
cts-tradefed、am instrument 和 atest 这3种执行JUnit测试的方法有什么优缺点?
Poe中GPT4的回答:
这三种执行JUnit测试的方法分别是CTS-TradeFed、am instrument
和 atest
,它们在Android测试框架中都有应用。下面我们来分别看一下它们的优缺点:
-
CTS-TradeFed
(Compatibility Test Suite - Trade Federation)- 优点:
- 专为Android兼容性测试而设计,确保设备及应用满足Android兼容性定义文档 (CDD) 的要求。
- 支持批量测试和自动化测试。
- 提供灵活的测试定制和运行选项。
- 可以在设备测试时生成详细的测试报告。
- 缺点:
- 相对复杂,可能需要更多的时间来学习和配置。
- 对于非兼容性测试场景,可能不是最佳选择。
- 优点:
-
am instrument
(Activity Manager Instrument)- 优点:
- 作为Android系统的一部分,可以直接在设备上运行。
- 使用简单,命令行即可执行。
- 适用于简单的测试场景。
- 缺点:
- 功能相对有限,不支持批量测试或高度定制化的测试场景。
- 测试报告可能不如CTS-TradeFed详尽。
- 优点:
-
atest
(Android Test Framework)- 优点:
- 适用于单元测试、集成测试和端到端测试。
- 提供了一个统一的测试入口,可以将多个测试工具整合在一起。
- 支持Gradle构建系统,方便与Android Studio集成。
- 支持测试分片、并行执行和结果报告。
- 缺点:
- 相较于
am instrument
,使用起来相对复杂,需要配置环境变量。 - 对于非Android开发者,学习成本可能较高。
- 相较于
- 优点:
总结:在选择执行JUnit测试的方法时,应根据测试场景和需求进行选择。CTS-TradeFed更适合兼容性测试,am instrument
适用于简单的测试场景,而atest
则提供了丰富的功能和灵活性,适用于多种测试场景。
一点碎碎念:简书现在很难传图,传图很卡,所以图片都删去了。
参考链接:
CTS本地手动测试方法_camera cts 如何添加log
Android Studio导入CTS测试用例并测试
使用 adb 运行测试
插桩测试
运行测试 (Atest)
使用am instrument验证CTS问题
Google atest的使用
使用Instrumentation命令测试cts apk
网友评论