写点什么

OpenHarmony 移植:XTS 子系统之应用兼容性测试套件

  • 2022 年 3 月 15 日
  • 本文字数:6624 字

    阅读完需:约 22 分钟

本文分享自华为云社区《移植案例与原理 - 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
复制代码

参考站点

参考了下述站点,或者推荐读者阅读下述站点了解更多信息。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
OpenHarmony移植:XTS子系统之应用兼容性测试套件_OpenHarmony_华为云开发者社区_InfoQ写作平台