当前位置: 首页 > article >正文

HarmonyOS开发实战( Beta5.0)使用GTest测试C++案例

鸿蒙HarmonyOS开发往期必看:

HarmonyOS NEXT应用开发性能实践总结

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

本示例主要介绍如何在HarmonyOS NEXT应用中使用GTest测试C++代码。目前鸿蒙没有提供官方C++测试框架,部分Native开发为主的应用可以参考本文接入三方测试框架保证C++代码质量。GTest 是 C++ 测试框架,具有稳定、跨平台、快速等特点,能够为 C++ 开发人员提供有效的单元测试和集成测试工具。GTest 支持 Linux、macOS 和 Windows 操作系统,同时支持 gcc、clang 和 MSVC 等多种编译器和构建系统。GTest 还提供了大量的失败信息,方便开发人员排查问题。

测试效果预览

GTest接入流程说明:

  1. 编译GTest 下载好压缩包解压,按照三方库适配的内容构建产物,把对应的平台(arm64-v8a)产物放到对应的lib目录下。本文以CMake交叉编译构建为例。

  2. 引入头文件和链接库 引入压缩包include下的GTest头文件,可以放在cpp目录下,并将第一步构建好的gtest和gtest_main动态链接库和对应的软链接放到模块下的libs相应目录。

  3. 编写测试代码 这里用nativesavepictosandbox的dl_util.cpp文件为例。

    #include "gtest/ohosTest.h"
    #include "dl_util.h"
    #include <dlfcn.h>
    #include <ostream>
    const char libCurlDownload[256] = "libcurlDownload.so";
    typedef std::string (*DownloadInternetFileFunc)(char *, char *);
    
    /**
    * TestSuiteName_TestCaseName 的组合应该是唯一的。
    * GTest 生成的类名是带下划线的,所以些名字里不建议有下划线
    * TestSuiteName 用来汇总 test case,相关的 test case 应该是相同的 TestSuiteName。一个文件里只能有一个 TestSuiteName,建议命名为这个文件测试的类名。
    * TestCaseName 是测试用例的名称。建议有意义,比如“被测试的函数名称”,或者被测试的函数名的不同输入的情况。
    */
    TEST(DlUtilTest, loadLibraryTest) {
       void *handler = load_library(libCurlDownload);
       // 判断返回不为空指针
       ASSERT_NE(handler, nullptr);
       dlclose(handler);
    }
    
    GTEST_API_ int main(int args, char **argv) {
       printf("Running main() from %s\n", __FILE__);
       testing::InitGoogleTest(&args, argv);
       return RUN_ALL_TESTS();
    }
    
  4. 添加CMakeLists代码 在CMakeLists中添加用于测试的可执行文件编译逻辑。

    # 设置动态链接库位置
    link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/)
    # 设置测试文件的检索范围
    set(TEST_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../)
    # 获取文件下所有的.cpp后缀的源文件
    file(GLOB_RECURSE TEST_SRC_FILES ${TEST_SRC_DIR}/*.cpp)
    # 测试文件和源文件打到一个可执行测试文件中
    add_executable(util_test ${TEST_SRC_FILES} dl_util.cpp)
    target_link_libraries(util_test PUBLIC gtest gtest_main libace_napi.z.so libcurlDownload.so libhilog_ndk.z.so librawfile.z.so)
    
  5. 生成可执行文件 点击运行,会自动生成build文件夹,在build/default/intermediates/cmake/default/obj/arm64-v8a/路径下会生成 util_test.exe 可执行测试文件。如果流水线化测试诉求,可以使用SDK文件下的CMake工具(native/build-tools/cmake/bin/cmake)用命令生成可执行文件,命令参考如下。

    # HARMONY_SDK就是是鸿蒙SDK目录
    ${HARMONY_SDK}/native/build-tools/cmake/bin/cmake \
    -DCMAKE_SYSROOT=${HARMONY_SDK}/native/sysroot \
    -DOHOS_STL=c++_static \
    -DCMAKE_TOOLCHAIN_FILE=${HARMONY_SDK}/native/build/cmake/ohos.toolchain.cmake \
    -DOHOS_ARCH=arm64-v8a \
    -DOHOS_PLATFORM=OHOS \
    -DCMAKE_BUILD_TYPE=Debug \
    
  6. 获取测试结果 执行测试命令,命令参考如下。

    #!/bin/bash
    # 设置默认名称,和CMakelist保持一致
    EXECUTABLE_FILE_NAME=util_test
    # 动态链接库的位置
    LIB_DIR="libs/arm64-v8a"
    # 可执行文件的位置,必须要先生成
    EXE_DIR="build/default/intermediates/cmake/default/obj/arm64-v8a"
    LIB_DIR=$(cd "$LIB_DIR" && pwd)
    EXE_DIR=$(cd "$EXE_DIR" && pwd)
    # 推送动态链接库到设备上
    for file in "$LIB_DIR"/*; do
    if [ -f "$file" ]; then
       echo "推送 $file 到设备..."
       hdc file send "$file" "/data/local/tmp/"
    fi
    done
    
    # 推送可执行测试文件到设备上
    hdc file send "${EXE_DIR}/${EXECUTABLE_FILE_NAME}" /data/local/tmp/
    # 设置可执行权限
    hdc shell chmod +x /data/local/tmp/${EXECUTABLE_FILE_NAME}
    hdc shell "export LD_LIBRARY_PATH=/data/local/tmp; /data/local/tmp/${EXECUTABLE_FILE_NAME}"  
    

高性能知识点

不涉及

工程结构&模块类型

不涉及

模块依赖


http://www.kler.cn/news/314868.html

相关文章:

  • QT开发: Qt 框架中字符串核心类QString详解
  • ARM/Linux嵌入式面经(三五):诺瓦星云提前批
  • dpdk课程学习之练习笔记八(dpvs的了解)
  • unity3d入门教程九
  • 【Java】全面理解Java8特性
  • SpinalHDL之结构(三)
  • JavaScript高级—— js 是单线程运行的
  • 无人机+自组网:中继通信增强技术详解
  • 论文解读《MmAP : Multi-Modal Alignment Prompt for Cross-Domain Multi-Task Learning》
  • C#开发基础之单例模式下的集合数据,解决并发访问读写冲突的问题
  • PostgreSQL常用表操作SQL脚本整理
  • java重点学习-JVM类加载器+垃圾回收
  • 从一到无穷大 #35 Velox Parquet Reader 能力边界
  • 计算机基础知识笔记
  • 基于协同过滤+python+django+vue的音乐推荐系统
  • 鸿蒙Harmony-Next 徒手撸一个日历控件
  • Qt中样式表常用的属性名称定义
  • 利用Python与Ansible实现高效网络配置管理
  • 【Harmony】轮播图特效,持续更新中。。。。
  • Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
  • 【Flink实战】flink消费http数据并将数组展开多行
  • linux-虚拟化与容器化-虚拟化
  • 无法删除选定的端口,不支持请求【笔记】
  • Java流程控制语句——跳转语句详解:break 与 continue 有什么区别?
  • Go 并发模式:管道的妙用
  • biopython解析mmcif文件得到组装体、链、序列、原子坐标、变换矩阵等信息
  • 统信服务器操作系统【1050e版】安装手册
  • 十个服务器中毒的常见特征及其检测方法
  • elasticsearch学习与实战应用
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别