摘要:本文主要介绍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测试用例的。但是了解一下这些知识,在问题定位等会带来极大的方便。本文主要介绍下ACTS应用兼容性测试用例开发编译。使用的编程语言为C语言。

1、XTS测试套件目录

XTS的ACTS应用兼容性测试套件目录test\xts\acts,器目录如下,包含各个子系统的测试用例源代码及测试工具代码。

  1. /test/xts
  2. ├── acts # 测试代码存放目录
  3. └── aafwk # 标准系统的 元能力框架子系统 测试用例源码存放目录
  4. └── aafwk_lite # 轻量系统、小型系统的 元能力框架 子系统测试用例源码存放目录
  5. └── communication # 标准系统的 communication子系统 测试用例源码存放目录
  6. └── communication_lite # 轻量系统、小型系统的 communication 子系统测试用例源码存放目录
  7. | └── ....... # 其他子系统的测试用例源码存放目录
  8. └── BUILD.gn # 标准系统测试用例编译配置
  9. └── build_lite # 轻量系统、小型系统测试用例编译配置存放目录
  10. └── BUILD.gn # 轻量系统、小型系统测试用例编译配置
  11. └── tools # 测试工具代码存放目录

2、测试用例级别、粒度和类型

测试用例分为5个级别,分布为Level0、Level1、Level2、Level3、Level4,这几个宏定义在文件test\xts\tools\lite\hctest\include\hctest_internal.h。对这几个级别的解释可以从文章尾部的参考站点上可以了解。

  1. /**
  2. * test case level
  3. */
  4. enum TestRank {
  5. Level0 = 1,
  6. Level1 = 2,
  7. Level2 = 3,
  8. Level3 = 4,
  9. Level4 = 5
  10. };

用例粒度分为LargeTest、MediumTest和SmallTest,同样在文件test\xts\tools\lite\hctest\include\hctest_internal.h中定义。

  1. /**
  2. * test size
  3. */
  4. enum TestSize {
  5. SmallTest = 1 << 4,
  6. MediumTest = 2 << 4,
  7. LargeTest = 3 << 4
  8. };

测试类型分为Function、Performance、Power、Reliability、Security、Global、Compatibility、User、Standard、Safety和Resilience。宏定义如下,具体含义见参考站点中链接。

  1. /**
  2. * test type
  3. */
  4. enum TestType {
  5. Function = 1 << 8,
  6. Performance = 2 << 8,
  7. Power = 3 << 8,
  8. Reliability = 4 << 8,
  9. Security = 5 << 8,
  10. Global = 6 << 8,
  11. Compatibility = 7 << 8,
  12. User = 8 << 8,
  13. Standard = 9 << 8,
  14. Safety = 10 << 8,
  15. Resilience = 11 << 8
  16. };

3、C语言用例开发编译指导

根据测试系统选择测试框架和对应测试用例语言。系统类型和测试框架、开发语言对应关系如下:

我们主要看下轻量系统产品用例开发。轻量系统测试使用的测试框架是hctest,hctest测试框架支持使用C语言编写测试用例,是在开源测试框架unity的基础上进行增强和适配。

3.1 用例目录规范

我们上文已经看到了ACTS的目录, 测试用例存储到test/xts/acts仓中。假如我们在一个名为subsystem_lite的子系统中为module_hal部件开发用例,目录如下:

  1. ├── acts
  2. | └── ......
  3. └── subsystem_lite
  4. └── module_hal
  5. └── BUILD.gn
  6. └── src
  7. └──build_lite
  8. └── BUILD.gn

可以参考已经存在的用例的目录,比如test\xts\acts\utils_lite\file_hal、test\xts\acts\utils_lite\kv_store_hal、test\xts\acts\startup_lite\bootstrap_hal等等。

3.2 编写用例样例

3.2.1 引用测试框架

hctest.h 文件位于./test/xts/tools/lite/hctest/include/目录,定义了LITE_TEST_SUIT、LITE_TEST_CASE、RUN_TEST_SUITE等测试套件的宏。

  1. #include "hctest.h"

3.2.2 定义子系统、模块、测试套件名称

需要3个参数,分别为子系统名称、子系统的部件名称、测试套件名称。

  1. /**
  2. * @brief register a test suit named "IntTestSuite"
  3. * @param test subsystem name
  4. * @param example module name
  5. * @param IntTestSuite test suit name
  6. */
  7. LITE_TEST_SUIT(test, example, IntTestSuite);

已经存在的示例,可以参考test\xts\acts\utils_lite\kv_store_hal\src\kvstore_func_test.c,为utils子系统的kvStore部件注册KvStoreFuncTestSuite测试套件。

  1. /**
  2. * @tc.desc : register a test suite, this suite is used to test basic flow and interface dependency
  3. * @param : subsystem name is utils
  4. * @param : module name is kvStore
  5. * @param : test suit name is KvStoreFuncTestSuite
  6. */
  7. LITE_TEST_SUIT(utils, kvStore, KvStoreFuncTestSuite);

3.2.3 定义Setup与TearDown

命名方式:测试套件名称+Setup,测试套件名称+TearDown。Setup与TearDown必须存在,可以为空函数。示例可以参考test\xts\acts\utils_lite\kv_store_hal\src\kvstore_func_test.c,如下:

  1. /**
  2. * @tc.setup : setup for all testcases
  3. * @return : setup result, TRUE is success, FALSE is fail
  4. */
  5. static BOOL KvStoreFuncTestSuiteSetUp(void)
  6. {
  7. UtilsSetEnv(DATA_PATH);
  8. return TRUE;
  9. }
  10.  
  11. /**
  12. * @tc.teardown : teardown for all testcases
  13. * @return : teardown result, TRUE is success, FALSE is fail
  14. */
  15. static BOOL KvStoreFuncTestSuiteTearDown(void)
  16. {
  17. printf("+-------------------------------------------+\n");
  18. return TRUE;
  19. }

3.2.4 使用宏定义LITE_TEST_CASE写测试用例

LITE_TEST_CASE函数宏包括三个参数:测试套件名称,测试用例名称,用例属性(测试类型、用例粒度、用例级别)。示例代码中创建测试用例,名称为TestCase001,属于测试套件IntTestSuite,测试用例属性为功能测试、测试用例粒度为MediumTest,用例级别Level1。

  1. LITE_TEST_CASE(IntTestSuite, TestCase001, Function | MediumTest | Level1)
  2. {
  3. //do something
  4. };

示例可以参考test\xts\acts\utils_lite\kv_store_hal\src\kvstore_func_test.c,如下,测试套件KvStoreFuncTestSuite中创建测试用例testKvStoreSetValue001,测试kvstore部件的UtilsSetValue和UtilsDeleteValue接口。

  1. /**
  2. * @tc.number : SUB_UTILS_KV_STORE_0100
  3. * @tc.name : UtilsSetValue parameter legal test
  4. * @tc.desc : [C- SOFTWARE -0200]
  5. */
  6. LITE_TEST_CASE(KvStoreFuncTestSuite, testKvStoreSetValue001, Function | MediumTest | Level1)
  7. {
  8. char key[] = "rw.sys.version";
  9. char value[] = "Hello world !";
  10. int ret = UtilsSetValue(key, value);
  11. TEST_ASSERT_EQUAL_INT(0, ret);
  12.  
  13. ret = UtilsDeleteValue(key);
  14. TEST_ASSERT_EQUAL_INT(0, ret);
  15. };

3.2.5 使用宏定义 RUN_TEST_SUITE注册测试套件

  1. RUN_TEST_SUITE(IntTestSuite);

3.3 测试模块的构建配置文件

在每个测试模块目录subsystem_lite/module_hal下新建BUILD.gn编译文件,用于指定编译后静态库的名称、依赖的头文件、依赖的库等;具体写法如下:

  1. import("//test/xts/tools/lite/build/suite_lite.gni")
  2. hctest_suite("ActsDemoTest") {
  3. suite_name = "acts"
  4. sources = [
  5. "src/test_demo.c",
  6. ]
  7. include_dirs = [ ]
  8. cflags = [ "-Wno-error" ]
  9. }

3.4 acts下BUILD.gn增加编译选项

需要将测试模块加入到acts目录下的编译脚本中,编译脚本路径:test/xts/acts/build_lite/BUILD.gn。

  1. lite_component("acts") {
  2. ...
  3. if(board_name == "liteos_m") {
  4. features += [
  5. ...
  6. "//xts/acts/subsystem_lite/module_hal:ActsDemoTest"
  7. ]
  8. }
  9. }

3.5 编译烧录运行

随版本编译,debug版本编译时会同步编译acts测试套件。acts测试套件编译中间件为静态库,最终链接到版本镜像中 。将版本镜像烧录进开发板。重启设备,查看串口日志。每个测试套件执行以Start to run test suite开始,以xx Tests xx Failures xx Ignored结束。

参考站点

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

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

【OpenHarmony移植案例与原理】XTS子系统之应用兼容性测试用例开发的更多相关文章

  1. OpenHarmony移植案例与原理:startup子系统之syspara_lite系统属性部件

    摘要:本文介绍下移植开发板时如何适配系统属性部件syspara_lite,并介绍下相关的运行机制原理. 本文分享自华为云社区<openharmony移植案例与原理 - startup子系统之sy ...

  2. OpenHarmony移植:如何适配utils子系统之KV存储部件

    摘要:本文介绍移植开发板时如何适配utils子系统之KV存储部件,并介绍相关的运行机制原理. 本文分享自华为云社区<OpenHarmony移植案例与原理 - utils子系统之KV存储部件> ...

  3. OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py

    摘要:本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了_\entry__.py文件. 本文分享自华为云社区<移植案例与原理 - build lite源码分析 之 hb ...

  4. elasticsearch 亿级数据检索案例与原理

    版权说明: 本文章版权归本人及博客园共同所有,转载请标明原文出处( https://www.cnblogs.com/mikevictor07/p/10006553.html ),以下内容为个人理解,仅 ...

  5. JDK动态代理案例与原理分析

    一.JDK动态代理实现案例 Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlo ...

  6. SpringBoot定时任务 - 经典定时任务设计:时间轮(Timing Wheel)案例和原理

    Timer和ScheduledExecutorService是JDK内置的定时任务方案,而业内还有一个经典的定时任务的设计叫时间轮(Timing Wheel), Netty内部基于时间轮实现了一个Ha ...

  7. 【直播回顾】OpenHarmony知识赋能第四期第四课——音频驱动开发

    3月31日晚上19点,知识赋能第四期直播的第四节,也是本期最后一节直播课​<OpenHarmony标准系统HDF框架之音频驱动开发>​,在OpenHarmony开发者成长计划社群内成功举办 ...

  8. 【直播回顾】OpenHarmony知识赋能第四期第三课——I2C驱动开发

    3月24日晚上19点,​知识赋能第四期直播的第三节课<OpenHarmony标准系统HDF框架之I2C驱动开发>​,在OpenHarmony开发者成长计划社群内成功举办. 本期课程,由​拓 ...

  9. (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境

    通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...

随机推荐

  1. Selenium对应版本

    下面是谷歌浏览器与chromedriver的版本对应关系,供参考: ChromeDriver v2.45 (2018-12-10)----------Supports Chrome v70-72Chr ...

  2. selenium学习路线

      1.配置你的测试环境,针对你所学习语言,来配置你相应的selenium 测试环境.selenium 好比定义的语义---"问好",假如你使用的是中文,为了表术问好,你的写法是& ...

  3. Note - 千年食谱颂

      其实是兔子收集的各种下饭操作与名菜食谱.( 零·策略篇 多校 NOIP 2021.11.05:   这个真的是,我每次打毛毛虫剖分都是 rush 状态 qwq.像这种 已知代码难度大.不便于调试的 ...

  4. 上架打包错误:error itms-90086

    这是一个很纠结的错误 大家第一反应肯定是 赶紧去看看 位数是否设置  然后发现没有问题  就开始懵逼了 (比如我) 然而无意看到了一个人写的简书 这个人在 Overflow 找到了一个答案 比如你选择 ...

  5. axios请求方式

    `// 使用默认进行请求(默认是get) axios({ url: "http://localhost:9999/student/student/getAllStudent" }) ...

  6. Lesson1——Tensor

    Tensor Method 描述 is_tensor(obj) 如果 obj 是 PyTorch 张量,则返回 True : is_storage(obj) 如果 obj 是 PyTorch 存储对象 ...

  7. 昨天面试被问到的 缓存淘汰算法FIFO、LRU、LFU及Java实现

    缓存淘汰算法 在高并发.高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对. 第一次请求时把计算好的结果存放在缓存中,下次遇到同样的请求时,把之前保存在缓存中的数据直接拿来使用. 但是, ...

  8. 【C#基础概念】Ineterface 接口的设计原则

    接口设计方式 自顶向下 (如图所示),自底向上(发现类需要结构了就声明一个接口). 接口的作用 用来解耦.继承 接口的本质

  9. idea常用快捷键及配置

    目录 常用快捷键 常用配置 配置修改项 版本2019.1.3,配置.破解插件见网盘 2020.3.4 链接:https://pan.baidu.com/s/1WHsS8-yvHGf1iRopLbKIu ...

  10. Windows Server 2012 R2通过命令行重置网络环境

    转至:https://jingyan.baidu.com/article/48b37f8d5d89385a646488b5.html 我们使用Windows Server 2012 R2时会遇到通过命 ...