OpenHarmony移植:XTS子系统之应用兼容性测试套件
摘要:本文通过实例分析下ACTS应用兼容性测试套件移植案例,以及移植过程中特定的操作的原理。
本文分享自华为云社区《移植案例与原理 - XTS子系统之应用兼容性测试套件》,作者:zhushy。
XTS(X Test Suite)子系统是OpenHarmony生态认证测试套件的集合,当前包括:
- acts(application compatibility test suite)应用兼容性测试套件,看护北向HAP兼容、OpenHarmony开发API兼容。
- hats(Hardware Abstraction Test Suite )硬件抽象测试套,看护HDI层接口。
- dcts(Distributed Compatibility Test Suite )分布式兼容性测试套,看护分布式兼容(待上线)
本文主要通过实例分析下ACTS应用兼容性测试套件移植案例,以及移植过程中特定的操作的原理。主要讲述的是轻量系统兼容性测试。轻量系统因系统能力限制,兼容性测试在系统初始化阶段进行;并且各设备烧录工具存在差异,导致自动化工具(xDevice工具)无法实现真正的自动适配,因此认证执行方式不对合作伙伴进行限制。流程如下:
- 步骤1 编译适配:XTS子系统加入到编译组件中,随版本一起编译;
- 步骤2 本地执行:完成兼容性测试;
1、编译适配XTS子系统
1.1 产品解决方案适配
需要在产品解决方案配置文件中增加增加xts_acts与xts_tools组件定义。下面看几个示例,文件vendor\bestechnic\xts_demo\config.json中的配置片段:
{
"subsystem": "xts",
"components": [
{ "component": "xts_acts", "features":
[
"config_ohos_xts_acts_utils_lite_kv_store_data_path = \"/data\"",
"enable_ohos_test_xts_acts_use_thirdparty_lwip = true"
]
},
{ "component": "xts_tools", "features":[] }
]
}
文件vendor\goodix\gr5515_sk_xts_demo\config.json中的配置片段:
{
"subsystem": "xts",
"components": [
{ "component": "xts_acts", "features":
[
"config_ohos_xts_acts_utils_lite_kv_store_data_path = \"/data\""
]
},
{ "component": "xts_tools", "features":[] }
]
},
1.2 编译链接
需要通过链接选项指定需要链接的ACTS的部件编译库文件,会使用到 --whole-archive 和 --no-whole-archive这2个ld链接选项。–whole-archive 可以把 在其后面出现的静态库包含的函数和变量输出到动态库,–no-whole-archive 则关掉这个特性。在文件vendor\goodix\gr5515_sk_xts_demo\BUILD.gn中,对ACTS的编译文件进行链接。其中⑴到⑵处的链接选项为编译出的属于ACTS的组件测试库文件。
executable("${fw_img_name}.elf") {
deps = [
"tests:drivers",
"tests:fs_test",
"tests:ohosdemo",
"tests:shell_test",
"//build/lite:ohos",
]
ldflags = [
"-Wl,--whole-archive",
# "-lfs_test",
# "-ldrivers_test",
# "-lapp_hello",
"-lshell_test",
⑴ "-lhctest",
"-lmodule_ActsBootstrapTest",
"-lmodule_ActsWifiIotTest",
"-lmodule_ActsUtilsFileTest",
"-lmodule_ActsKvStoreTest",
"-lmodule_ActsParameterTest",
"-lmodule_ActsSamgrTest",
"-lhuks_test_common",
"-lmodule_ActsHuksHalFunctionTest",
"-lmodule_ActsDfxFuncTest",
"-lmodule_ActsUpdaterFuncTest",
⑵ "-lmodule_ActsHieventLiteTest",
"-Wl,--no-whole-archive",
]
}
在文件vendor\bestechnic\xts_demo\config.json中,需要链接的ACTS部件测试库文件写在了bin_list里的force_link_libs里。
"bin_list": [
{
"elf_name": "wifiiot",
"bsp_target_name": "best2600w_liteos",
"signature": "false",
"burn_name": "rtos_main",
"enable": "true",
"force_link_libs": [
"bootstrap",
"abilityms",
"bundlems",
"broadcast",
"hctest",
⑴ "module_ActsParameterTest",
"module_ActsBootstrapTest",
"module_ActsDfxFuncTest",
"module_ActsHieventLiteTest",
"module_ActsSamgrTest",
⑵ "module_ActsKvStoreTest"
]
},
.......
],
然后在文件device\soc\bestechnic\bes2600\BUILD.gn里组装编译链接选项,相关代码片段如下:
# config bin from vendor/bestechnic/<product_name>/config.json
foreach(bin_file, bin_list) {
...... if (build_enable == "true") {
...... # force link invisible function ,which ar to lib
ldflags += [ "-Wl,--whole-archive" ]
foreach(force_link_lib, bin_file.force_link_libs) {
ldflags += [ "-l${force_link_lib}" ]
}
ldflags += [ "-lbsp${bsp_target_name}" ]
ldflags += [ "-Wl,--no-whole-archive" ]
......
}
}
在文件vendor_asrmicro\xts_demo\config.json中,存在这样的配置片段。
"xts_list": [
{
"enable": "true",
"xts_modules": [
"ActsKvStoreTest",
"ActsDfxFuncTest",
"ActsHieventLiteTest",
"ActsSamgrTest",
"ActsParameterTest",
"ActsWifiServiceTest",
"ActsWifiIotTest",
"ActsBootstrapTest"
]
}
]
然后,在文件device_soc_asrmicro\asr582x\liteos_m\sdk\BUILD.gn文件中组装编译链接选项。
foreach(xts_item, xts_list) {
xts_enable = xts_item.enable
if(xts_enable == "true")
{
defines = [ "CFG_HARMONY_SUPPORT" ]
ldflags += [
"-Llibs",
"-Wl,--whole-archive",
"-lhctest",
"-lbootstrap",
"-lbroadcast",
]
foreach(xts_module, xts_item.xts_modules) {
ldflags += [ "-lmodule_${xts_module}" ]
}
ldflags += [ "-Wl,--no-whole-archive" ]
}
}
在产品解决方案配置文件中增加的bin_list、xts_list这些配置选项都不是config.json中的默认的标准选项。各个方案实现的风格差异比较大,建议使用第一种,写在文件vendor\goodix\gr5515_sk_xts_demo\BUILD.gn中会比较好。另外,需要使用hb命令触发debug版本(非debug版本不会触发测试编译)。
2、XTS子系统编译流程
2.1 hb编译构建工具读取config.json
编译构建工具hb会读取产品解决方案配置文,获取参与编译的子系统以及部件信息。XTS测试支持对各个子系统、部件的接口进行测试,产品解决方案配置了哪些子系统才会对这些配置的子系统进行测试。后文会继续解释。
2.2 XTS编译配置文件
在文件中test\xts\acts\build_lite\BUILD.gn中,定义了ACTS的测试套件。⑴处的ohos_xts_test_args表示,如果指定了具体的xts的测试套件,则只编译xts测试编译选项中指定的测试套件,后文会分析怎么在编译构建时指定测试套件。如果没有在编译构建时指定测试套件,则默认编译全部的测试套件。对于不同的内核类型,测试套件是有差异的,如⑵所示。对于轻量系统,支持的测试套件主要包含communication_lite、startup_lite、iot_hardware_lite、security_lite、hiviewdfx_lite、distributed_schedule_lite、update_lite、utils_lite等子系统及其部件。
all_features = []
features = []
⑴ if (ohos_xts_test_args != "") {
args = [
"--method_name",
"get_target_modules",
"--arguments",
"all_features=${ohos_xts_test_args}",
]
all_features +=
exec_script(rebase_path("//test/xts/tools/lite/build/utils.py"),
args,
"list lines")
} else {
⑵ if (ohos_kernel_type == "liteos_m") {
all_features += [
"//test/xts/acts/communication_lite/lwip_hal:ActsLwipTest",
"//test/xts/acts/communication_lite/wifiservice_hal:ActsWifiServiceTest",
"//test/xts/acts/utils_lite/file_hal:ActsUtilsFileTest",
"//test/xts/acts/startup_lite/syspara_hal:ActsParameterTest",
"//test/xts/acts/iot_hardware_lite/iot_controller_hal:ActsWifiIotTest",
"//test/xts/acts/utils_lite/kv_store_hal:ActsKvStoreTest",
"//test/xts/acts/security_lite/huks/liteos_m_adapter:ActsHuksHalFunctionTest",
"//test/xts/acts/hiviewdfx_lite/hilog_hal:ActsDfxFuncTest",
"//test/xts/acts/hiviewdfx_lite/hievent_hal:ActsHieventLiteTest",
"//test/xts/acts/distributed_schedule_lite/system_ability_manager_hal:ActsSamgrTest",
"//test/xts/acts/update_lite/dupdate_hal:ActsUpdaterFuncTest",
"//test/xts/acts/startup_lite/bootstrap_hal:ActsBootstrapTest",
]
} else if (ohos_kernel_type == "liteos_a") {
all_features += [
......
]
} else if (ohos_kernel_type == "linux") {
all_features += [
......
]
}
}
在该文件中,还有如下代码片段。可以看出,只要构建类型为debug并且没有指定notest测试编译选项时才会编译ACTS测试套。测试编译选项的指定如下所示:hb build -t notest。
if (ohos_build_type == "debug" && ohos_test_args != "notest") {
_all_features = ""
_product_json = rebase_path("${product_path}/config.json")
foreach(one_feature, all_features) {
_all_features = _all_features + one_feature + ","
}
_args = [
"--method_name",
"filter_by_subsystem",
"--arguments",
"testsuites=${_all_features}#product_json=${_product_json}",
]
features += exec_script(rebase_path("//test/xts/tools/lite/build/utils.py"),
_args,
"list lines")
}
接下来看下,如何在编译时指定特定的XTS测试套件进行编译。上文提到的ohos_xts_test_args在文件build\lite\hb_internal\build\build_process.py中,代码如下。可以看出测试套件相关的编译选项有xts和notest两种。⑵处当指定xts测试编译选项时,紧接着指定的测试套件会保存进变量ohos_xts_test_args。支持指定的测试套件,应该需要来自上文中的全部的测试套件。具体的使用示例为:hb build -t xts //test/xts/acts/communication_lite/lwip_hal:ActsLwipTest。不过这样的用法应该比较罕见,使用全量编译测试套件的就好。
@test.setter
def test(self, test_args):
⑴ cmd_list = ['xts', 'notest']
if test_args[0] in cmd_list:
if test_args[0] == 'notest':
self.register_args('ohos_test_args', 'notest')
else:
⑵ self._test = test_args[1]
if len(test_args) > 1:
self.register_args('ohos_xts_test_args', self._test)
else:
raise OHOSException('Error: wrong input of test')
2.3 生成的测试套的库文件
成功编译后,在编译构建输出目录,如out/v200zr/xts_demo/libs,生成测试套和测试框架的库文件,XTS子系统测试套.a归档格式为:libmodule_{测试套件模块名称}.a,测试框架归档格式:libhctest.a。这些生成的文件和上文中的链接选项可以对应起来。
-rw-r--r-- 1 zhushangyuan zhushangyuan 28842 Feb 10 16:49 libhctest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 53024 Feb 10 16:49 libhuks_test_common.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 22562 Feb 10 16:49 libmodule_ActsBootstrapTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 7560 Feb 10 16:49 libmodule_ActsDfxFuncTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 6096 Feb 10 16:49 libmodule_ActsHieventLiteTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 96278 Feb 10 16:49 libmodule_ActsHuksHalFunctionTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 31346 Feb 10 16:49 libmodule_ActsKvStoreTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 69010 Feb 10 16:49 libmodule_ActsParameterTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 197120 Feb 10 16:49 libmodule_ActsSamgrTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 8256 Feb 10 16:49 libmodule_ActsUpdaterFuncTest.a
-rw-r--r-- 1 zhushangyuan zhushangyuan 20968 Feb 10 16:49 libmodule_ActsWifiServiceTest.a
3、 移植适配XTS定制选项
在移植案例时,产品配置文件中适配XTS子系统时,有时候指定了定制选项如config_ohos_xts_acts_utils_lite_kv_store_data_path、enable_ohos_test_xts_acts_use_thirdparty_lwip等等。本小节专门看下这些定制选项。
3.1 ohos_xts_test_args
该选项声明在文件test\xts\tools\lite\build\suite_lite.gni中。前文已经了解到,编译构建命令行可以指定要编译的xts测试套件。理论上,也可以在产品解决方案配置文件中指定。注意不能同时在编译构建命令行参数中指定,会覆盖。无用的知识点又增加了。
declare_args() {
ohos_xts_test_args = ""
}
3.2 enable_ohos_test_xts_acts_use_thirdparty_lwip
该选项enable_ohos_test_xts_acts_use_thirdparty_lwip声明在文件test\xts\acts\communication_lite\lwip_hal\BUILD.gn,默认为true。在移植适配时,继续指定该选项为true,可以说是不必要的。
declare_args() {
enable_ohos_test_xts_acts_use_thirdparty_lwip = true
}
该选项的作用是什么呢?在文件test\xts\acts\communication_lite\lwip_hal\BUILD.gn中,⑴处表明,会依赖Liteos_m内核编译。从选项的名字和实际的作用,让人摸不着头脑。
hctest_suite("ActsLwipTest") {
suite_name = "acts"
sources = [ "src/lwip_func_test.c" ]
if (enable_ohos_test_xts_acts_use_thirdparty_lwip) {
⑴ deps = [ "//kernel/liteos_m:kernel" ]
}
cflags = [ "-Wno-error" ]
}
3.3 config_ohos_xts_acts_utils_lite_kv_store_data_path
该选项config_ohos_xts_acts_utils_lite_kv_store_data_path声明在文件test\xts\acts\utils_lite\kv_store_hal\BUILD.gn,如下⑴处所示。注意下⑵处把这个配置define为了DATA_PATH。
declare_args() {
⑴ config_ohos_xts_acts_utils_lite_kv_store_data_path = ""
}
hctest_suite("ActsKvStoreTest") {
suite_name = "acts"
sources = [ "src/kvstore_func_test.c" ]
include_dirs = [
"src",
"//utils/native/lite/include",
"//base/iot_hardware/peripheral/interfaces/kits",
]
cflags = [ "-Wno-error" ]
defines =
⑵ [ "DATA_PATH=\"${config_ohos_xts_acts_utils_lite_kv_store_data_path}\"" ]
}
在文件test\xts\acts\utils_lite\kv_store_hal\src\kvstore_func_test.c中,有如下代码。在移植适配XTS子系统时,还必须要加上这一行 “config_ohos_xts_acts_utils_lite_kv_store_data_path = “/data””。如果不加的话,config_ohos_xts_acts_utils_lite_kv_store_data_path等于空字符串“”,DATA_PATH被定义了空字符串“”,没有起到提供默认值的作用。
#ifndef DATA_PATH
#define DATA_PATH "/data"
#endif
参考站点
参考了下述站点,或者推荐读者阅读下述站点了解更多信息。
OpenHarmony移植:XTS子系统之应用兼容性测试套件的更多相关文章
- 【OpenHarmony移植案例与原理】XTS子系统之应用兼容性测试用例开发
摘要:本文主要介绍ACTS应用兼容性测试用例开发编译. 本文分享自华为云社区<移植案例与原理 - XTS子系统之应用兼容性测试用例开发>,作者: zhushy . XTS(X Test S ...
- 【转】兼容性测试套件(CTS)框架用户手册
原文网址:http://blog.sina.com.cn/s/blog_416166e90102v6bi.html 兼容性测试套件(CTS)框架用户手册 1.为什么需要兼容性测试(以下称CTS)? 2 ...
- 安卓CTS官方文档之兼容性测试套件简介-attach
官方英文文档原文:https://source.android.com/compatibility/cts-intro.html Compatibility Test Suite 兼容性测试套件 H ...
- 安卓CTS官方文档之兼容性测试套件简介
官方英文文档原文:https://source.android.com/compatibility/cts-intro.html Compatibility Test Suite 兼容性测试套件 Ho ...
- OpenHarmony移植案例与原理:startup子系统之syspara_lite系统属性部件
摘要:本文介绍下移植开发板时如何适配系统属性部件syspara_lite,并介绍下相关的运行机制原理. 本文分享自华为云社区<openharmony移植案例与原理 - startup子系统之sy ...
- OpenHarmony移植:如何适配utils子系统之KV存储部件
摘要:本文介绍移植开发板时如何适配utils子系统之KV存储部件,并介绍相关的运行机制原理. 本文分享自华为云社区<OpenHarmony移植案例与原理 - utils子系统之KV存储部件> ...
- 关于网页pc端以及移动端的兼容性——测试
对于经常做网页设计的人员来说,网页的兼容性测试是不可缺少的,记得刚来单位的新手,都是要安装一款浏览器测试软件的,看自己制作的网页是否在各大浏览器中正常显示,有没有变形,或者网页效果不兼容等. 不仅仅是 ...
- android 兼容性测试 CTS 测试过程(实践测试验证通过)
source: http://blog.csdn.net/jianguo_liao19840726/article/details/7222814 写这个博客的时候是为了记忆,建议大家还是看官方的说明 ...
- 利用selenium Server实现IE firefox 和 chrome兼容性测试
本文的主题是基于Selenium Server,使用 Java 语言编写网页交互流程, 实现多浏览器(IE Firefox Chrome)兼容性测试,为使用纪要. Selenium Selenium是 ...
- selenium如何做兼容性测试呢
selenium如何做兼容性测试呢. 现在selenium做自动化测试基本是web driver操作浏览器做操作,code中assert关键值,做判断. 具体执行2种 1.使用htmluint 来执行 ...
随机推荐
- Ubuntu18.04环境下安装redis 6.2.0,配置文件的部分参数说明
环境是win11的Linux子系统Ubuntu-18.04,安装方式是源码安装,也可以用apt安装(见本文最后参考资料),用的用户是默认用户(所以一些关键命令要注意用sudo,不用会报错) 安装: j ...
- CodeChef Starters 9 Division 3 (Rated) India Fights Corona
原题链接 India Fights Corona 题意: 有\(n\)个城市,\(m\)条道路,其中有些城市自己有医院,所以可以在自己城市做核酸检测,那么花费就只有就医费用,而对于那些自己没有医院的城 ...
- 本地MinIO存储服务Java远程调用上传文件
MinIO是一款高性能.分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等低成本机器也能够很好的运行MinIO.它的优点包括高性能.高可用性.易于部署和管理.支持多租户等. Cpola ...
- 工厂模式(Factory Method)
模式定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使得一个类的实例化延迟(目的:解耦)到子类. 要点总结 Factory Method模式用于隔离类对象的使用 ...
- 一文搞懂C#中类成员的可访问性
公众号「DotNet学习交流」,分享学习DotNet的点滴. 文末有总结,想快速浏览的朋友可直接看文末. 1.成员访问修饰符 在C#中类成员访问修饰符一共有5个,分别是public.private.p ...
- 【Javaweb】做一个房产信息管理系统三(src目录的部署工作【三层框架】各个层含义)
接下来,我打算进行Java文件的部署工作,但实际上为了得到更多的分数,我们还是应该先做页面 首先我们需要了解对于Javaweb,src下的目录应该如何部署:(三层架构单独开一篇讲) 那么这些都有什么含 ...
- java制作游戏,如何使用libgdx,入门级别教学
第一步,进入libgdx的官网.点击get started 进入这个页面,点击setup a project 进入这个页面直接点击,Generate a project. 点击下载,下载创建工具 它会 ...
- 编辑linux服务启动命令(app-script.sh命令编写)
#!/bin/sh# 注:这里可替换为你自己的执行程序,其他代码无需更改APP_NAME=app-biz.jar #使用说明,用来提示输入参数usage() { echo "Usage: s ...
- Linux磁盘专题
物理磁盘名次和其作用 盘片:disk 盘片上下都有磁头. 磁盘面: 盘片有上下两面,每一面叫磁盘面 磁头:heads 每个磁头负责一个磁盘面,负责读取数据.将数据写入磁道. 磁头都是固定在机械臂上(机 ...
- 【C++】关于引用类型学习记录
学习模板(泛型)的时候针对定义为引用类型有些费解 1 class BigType { 2 // 假设这里有大量的数据和复杂的操作 3 }; 4 5 template <typename T> ...