了解更多开源请访问:开源基础软件社区https://ost.51cto。com在本节中,我们将重点介绍如何编写测试套件、编译和测试它。1.目录结构//目录位置:【鸿蒙代码】/test.├──arkXtest//js测试框架和ui测试框架│├──jsunit│└──uitest├──developertest//开发测试组件│├──aw│├──config│├──examples│├──src│└──third_party├──wukong//稳定性测试工具,冒烟测试│├──common│├──component_event│├──input_factory│├──report│├──shell_command│└──test_flow├──xdevice//测试框架的核心,为执行用例提供相关服务│├──BUILD.gn│├──extension│├──src└──xts//兼容性测试套件├──acts//应用程序兼容性测试套件├──dcts//分布式兼容性测试套件├──hats//硬件兼容性测试套件└──tools2,testSuitestructureLet's以一个比较简单的应用兼容性测试套件为例:.├──BUILD.gn//编译脚本├──comm.gni//编译配置├──src│├──ActsLibuvTestSuite.cpp//具体测试套件源码文件│├──ActsLibuvTestSuite.h//Specific测试套件头文件└──Test.json//测试套件执行配置测试套件编译脚本-BUILD.gnimport("//test/xts/tools/build/suite.gni").?import("//test/xts/acts/graphic/libuv/comm.gni")ohos_moduletest_suite("ActsLibuvTestSuite"){sources=["src/ActsLibuvTestSuite.cpp",]include_dirs=["//test/xts/acts/graphic/libuv/src"]cflags=["-Wno-error"]}BUILD.gn的主要书写格式如下:sources=["源文件",]include_dirs=["头文件目录",],deps=["依赖库路径:依赖库名",]configs=["配置文件路径:配置文件名"]具体解释如下:sources:对应需要编译的源文件。include_dirs:对应正在编译的头文件的路径。deps:对应本程序依赖的其他库,比如导入hilog,添加“//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog”。configs:编译对应的flags或宏定义,如:config("XX_config"){cflags_cc=["-Wno-conversion","-Wno-unused-function",]defines=deqp_common_definesdefines+=["_XOPEN_SOURCE=600"]}编译配置文件-comm.gni。import("//test/xts/tools/build/suite.gni")common_include=["//test/xts/acts/graphic/libuv/src",]common_depends=["//third_party/libuv:uv_static",]可以将常用的BUILD.gn内容放在编译配置文件中,供其他gn文件或gni文件使用。实体测试套件源文件:#include#include"ActsLibuvTestSuite.h"namespaceOHOS{usingnamespacestd;使用命名空间测试::ext;//测试套件的预设动作,在第一个测试用例之前执行voidActsLibuvTestSuite::SetUpTestCase(void){}//测试套件清理动作,在最后一个测试用例之后执行voidActsLibuvTestSuite::TearDownTestCase(void){}//测试用例的预设动作voidActsLibuvTestSuite::SetUp(){}//测试用例的清理动作voidActsLibuvTestSuite::TearDown(){}HWTEST_F(ActsLibuvTestSuite,testLibuvTestCase001,Function|MediumTest|Level2){printf("------启动ActsLibuvTestSuite------\n");EXPECT_TRUE(真);printf("------结束ActsLibuvTestSuite------\n");}HWTEST_F(ActsLibuvTestSuite,testLibuvTestCase002,Function|MediumTest|Level2){printf("------开始ActsLibuvTestSuite------\n");EXPECT_TRUE(false);printf("-------endActsLibuvTestSuite------\n");}}我们选择的这个测试套件是一个模块测试Suite,所以使用gtest测试框架进行测试gtest测试框架采用TestSuite+TestCase的组合方式,所以我们定义ActsLibuvTestSuite作为测试套件,然后添加两个testLibuvTestCase001和testLibuvTestCase002作为测试用例。判断一个测试是否通过,可以使用EXPECT_TRUE(true)和EXPECT_TRUE(false)进行验证。可以使用的其他断言如下:val1,val2)EXPECT_STREQ(val1,val2)EXPECT_STRNE(s1,s2)EXPECT_STRCASEEQ(s1,s2)EXPECT_STRCASENE(s1,s2)EXPECT_FLOAT_EQ(val1,2val)EXPECT_DOUBLE_EQ(val1,val2)特定测试套件头文件:#ifndefLIBUV_H#TESTCASEdefineLIBUV_TESTCASE_H#includenamespaceOHOS{classActsLibuvTestSuite:publictesting::Test{public:protected://测试套件的预设动作,在第一个测试用例之前执行staticvoidSetUpTestCase(void);//测试套件清理动作,在最后一个测试用例之后执行staticvoidTearDownTestCase(void);//测试用例的预设动作virtualvoidSetUp();//测试用例的清理动作virtualvoidTearDown();};}//命名空间OHOS#endif//LIBUV_TESTCASE_H测试套件执行配置文件:{-timeout":"120000","native-test-device-path":"/data/local/tmp","runtime-hint":"100s","type":"CppTest"},"kits":[{“pre-push”:[],“post-push”:[“chmod-R777/data/local/tmp/*”],“push”:[“ActsLibuvTestSuite->/data/local/tmp/ActsLibuvTestSuite"],"type":"PushKit"},{"type":"ShellKit","run-command":["remount","mkdir/data/test","cd/data/local/tmp"]}]}测试套件配置文件是与测试套件一起运行的文件。在执行测试套件时,xdevice根据配置文件的具体命令执行测试用例。具体如下:“description”:测试套件的文字说明“driver”:测试套件执行驱动配置“module-name”:配置测试套件名称“native-test-timeout”:套件超时设置“native-test-device-path”:套件运行时目录“runtime-hint”:套件执行时间估计“type”:套件类型“kits”:测试套件工具配置“PushKit”:传输工具“pre-push”:从上位机向设备推送前的准备工作;“push”:从上位机向设备推送的动作;“post-push”:上位机推送Action后需要做什么;“ShellKit”:运行工具“run-command”:执行测试套件前需要配置的命令3.编译测试套件上面写的测试用例需要有一个加载入口。本文选择graphic的gn添加依赖路径:path:test/xts/acts/graphic/BUILD.gnimport("//build/ohos_var.gni")group("graphic"){testonly=trueif(is_standard_system){deps=["webGL:webGL_hap_test","windowStage:ActsWindowStageTest","windowstandard:window_hap_test",#添加下面一行导入依赖"libuv:ActsLibuvTestSuite",]}else{deps=["appaccount:appaccount_hap","osaccount:osaccount_hap",]}}同****,在鸿蒙代码根目录执行如下命令:./build.sh--product-namerk3568--gn-argsbuild_xts=true--build-target"acts"--gn-argsis_standard_system=True深入技巧:我们会发现每次编译都会消耗大量的时间。这里简单讨论下鸿蒙build.sh的编译方式:源码路径下的编译脚本。,然后gn编译它的目标。gn编译:根据目标build.gn文件生成一个build.ninja文件,总的build.ninja位于out/product目录下。ninja:根据target的build.ninja编译生成输出问题文件。总结:所以如果gn文件没有改,但是源文件或者头文件改了,我们可以不用build.sh脚本直接使用ninja命令编译,比如ninja-Cout/rk3568uv_static。4、执行测试套件同**《#跟着小白一起学鸿蒙# [一]运行OpenHarmony》**,在鸿蒙代码根目录/out/rk3568/suites/acts中执行如下命令://该命令的前提是://1、开发板与上位机建立连接,如果没有配置网络,建议通过usb连接//上位机执行:hdc_stdshell(该命令可以进入开发板的shell进行后续命令输入)//2、开发板的hdcd服务配置协议类型和端口//boardexecution:paramsetpersist.hdc.modeall//boardexecution:paramsetpersist.hdc.port10178//boardexecution:pkillhdcd(用于重启hdcd使用新的配置)//3、开发在板子上配置ip地址,并确认网络//查看板子上的ip地址命令:ifconfig//如果没有eth0,需要执行:ifconfigeth0up//如果你有eth0,可以配置ip地址:ifconfigeth0192.168.137.105//检查网络是否畅通:ping上位机IP地址python-mxdevice5,在鸿蒙代码根目录/out/rk3568/suites/acts/reports查看测试套件执行结果,你可以看到时间戳最新的目录就是刚刚运行的测试记录。.├──2022-08-16-14-15-25.zip├──details_report.html//详细测试用例├──log│├──device_hilog_192.168.137.105_10178.log//系统hilog日志│└──task_log.log//测试用例输出日志├──result│└──ActsLibuvTestSuite.xml//测试结果汇总├──summary.ini├──summary_report.hash├──summary_report.html//测试报告大纲├──summary_report.xml测试报告。测试报告详情。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。