首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >纯血鸿蒙APP实战开发——使用GTest测试C++案例

纯血鸿蒙APP实战开发——使用GTest测试C++案例

原创
作者头像
小帅聊鸿蒙
发布于 2025-02-18 06:15:29
发布于 2025-02-18 06:15:29
1880
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记

介绍

本示例主要介绍如何在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 文件为例。
代码语言:c++
AI代码解释
复制
   #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();
   }
  1. 添加CMakeLists代码 在CMakeLists中添加用于测试的可执行文件编译逻辑。
代码语言:bash
AI代码解释
复制
   # 设置动态链接库位置
   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)
DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
代码语言:erlang
AI代码解释
复制
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.OpenHarmonyUboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
  1. 生成可执行文件 点击运行,会自动生成build文件夹,在build/default/intermediates/cmake/default/obj/arm64-v8a/路径下会生成 util_test.exe 可执行测试文件。如果流水线化测试诉求,可以使用SDK文件下的CMake工具(native/build-tools/cmake/bin/cmake)用命令生成可执行文件,命令参考如下。
代码语言:bash
AI代码解释
复制
   # 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 \
  1. 获取测试结果 执行测试命令,命令参考如下。
代码语言:bash
AI代码解释
复制
   #!/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}"  

高性能知识点

不涉及

工程结构&模块类型

不涉及

模块依赖

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
gtest单元测试框架介绍及简单使用
Gtest是Google的一个开源框架,它主要用于写单元测试,检查真自己的程序是否符合预期行为。可在多个平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian)。它提供了丰富的断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。
杨永贞
2022/04/13
4.3K0
gtest单元测试框架介绍及简单使用
纯血鸿蒙APP实战开发——预加载so并读取RawFile文件
本示例主要介绍在TaskPool子线程中使用 dlopen 预加载 so 库并使用句柄调用库函数的方法,以及在Native中使用 pread 系统函数读取Rawfile文件的部分文本内容,并添加 HiLog 日志。
小帅聊鸿蒙
2025/01/21
2560
纯血鸿蒙APP实战开发——预加载so并读取RawFile文件
lycium上面适配OpenHarmony 不同架构的构建
当前lycium上面支持armv7-a和armv8-a的构建,其他架构的构建也是类似的,在HPKBUILD文件中,需要判断架构的地方加上架构相关的信息,这里以新增x86_64架构举例,cmake,makefile, configure构建方式如何修改。
小帅聊鸿蒙
2024/08/28
2030
lycium上面适配OpenHarmony 不同架构的构建
4步成功将三方库——speexdsp移植到OpenHarmony
①在原生库根目录中,存在CMakeLists.txt文件。在原生库下新建build目录通过cmake或者cmake-gui生成makeflie然后make。
小帅聊鸿蒙
2025/04/20
1820
4步成功将三方库——speexdsp移植到OpenHarmony
QT的cmake项目工程配置
QT的项目工程默认使用的是qmake,这本来也没什么问题。但是由于要用到vcpkg这个工具来管理第三方库,好像这个 vcpkg工具只能在cmake的项目中才能使用。
杨永贞
2022/04/13
3.7K0
Android NDK 开发 | CMake 使用手册 - 初见篇
之前写过一篇 《[-NDK 导引篇 -] 在NDK开发之前你应知道的东西》 介绍了在进入 NDK 学习之前,如何摆正自己的角色。时隔两年,NDK 系列文章开始填坑,在上一篇 《 NDK 是什么 | FFmpeg 5.0 编译 so 库》 中,介绍了 NDK 的概念,以及其作用。
张风捷特烈
2022/09/20
1.4K0
Android NDK 开发 | CMake 使用手册 - 初见篇
OpenHarmony开发——CMake方式组织编译的库移植
本文为OpenHarmony开发者提供一些组织编译形式比较常见(CMakeLists、Makefile)的三方库的移植指南,该指南当前仅适用于Hi3516DV300和Hi3518EV300两个平台,文中着重介绍各编译组织方式下工具链的设置方法以及如何将该库的编译添加到OpenHarmony整个工程的构建中。
小帅聊鸿蒙
2024/08/06
5240
OpenHarmony开发——CMake方式组织编译的库移植
HarmonyOS 开发实践 —— 基于lycium的开源c库编译与集成
lycium的使用说明:lycium的特点就是自动化编译,只需要一个./build.sh命令就可以完成编译,下面的编译例子(openssl)代码库是通过hpkbuild脚本从github或者gitee上面拉取,在hpkbuild脚本中已经默认提供了一套编译默认的配置,也可以按照需求修改。
小帅聊鸿蒙
2024/11/23
3680
HarmonyOS 开发实践 —— 基于lycium的开源c库编译与集成
[-NDK 导引篇 -] 在NDK开发之前你应知道的东西
前言 笔者看了一些NDK的项目。一些教程不是HelloWord就是直接整FFmpeg或OpenCV,可谓一个天一个地,而且目录结构和Android3.5的默认结构并不是太一致,一直没找到什么合心的文章。故写此文连接这天地,来总结一下在NDK开发之前你应知道的东西。 ---- 在此之前,先划分三类人,如果不认清自己是什么角色(垃圾)就去玩NDK,你会很糟心: user : 纯粹.so链接库使用者(伸手党) creator : 纯粹ndk开发者,创作.so链接库(创作家) designer : 在现
张风捷特烈
2020/04/30
7500
[-NDK 导引篇 -] 在NDK开发之前你应知道的东西
HarmonyOS 开发实践——对各种图片编解码格式的支持
在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库和头文件
小帅聊鸿蒙
2024/11/12
1970
HarmonyOS 开发实践——对各种图片编解码格式的支持
GTest问题_itest.n z
添加以下代码,注意==不要包含gtest/gtest.h头文件==,若多包含可能会出现struct std::__cxx11::basic_stringbuf<_CharT, _Traits, _Alloc>::__xfer_bufptrs' redeclared with different access错误
全栈程序员站长
2022/11/10
7490
C++与lua的结合,LuaBridge的使用
LuaBridge 是一个简单好用的轻量级且无依赖的库,用于在C ++和 LUA(一种强大,快速,轻量级,可嵌入的脚本语言)之间来回映射数据,函数和类。
杨永贞
2022/05/11
1.8K0
C++与lua的结合,LuaBridge的使用
编译Android 使用的 libx264 并使用进行 H.264 编码
在日常的音视频开发中,我们经常使用FFmpeg,因为它确实好用呀,囊括了各种功能!但是有个很严重的问题,如果是编译在Android和IOS上使用,会造成APP的包很大。可以看我编译的FFmpeg在Android上的应用程式。
字节流动
2021/06/09
4.9K0
编译Android 使用的 libx264 并使用进行 H.264 编码
ArkUI实战开发-NAPI项目
上节笔者简单介绍了使用 DevEco Studio 创建的默认 NAPI 工程结构,本节笔者简单介绍一下 NAPI 工程下 cpp 目录的源码部分。
小帅聊鸿蒙
2024/10/09
1720
ArkUI实战开发-NAPI项目
NDK 是什么 | FFmpeg 5.0 编译 so 库
NDK 全称 Native Development Kit,也就是原生开发工具包 ,官网对它有详细的 中文介绍 。可能一说到 NDK 或 JNI ,大家脑子里第一反应就是集成 C/C++ 。其实 JNI 的含义是 Java Native Interface ,这种接口允许 Java 和其他语言进行交互的,包括但不限于 C/C++ 。目前 Rust 也可以通过 JNI 来和 Java 交互,虽然不太成熟。
张风捷特烈
2022/09/20
1.6K0
NDK 是什么 |  FFmpeg 5.0 编译 so 库
OpenHarmony 内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用
gn 存在的意义是为了生成 ninja,如果熟悉前端开发,二者关系很像 Sass和CSS的关系.
小帅聊鸿蒙
2025/03/26
2300
算法部署 | 万字长文带你从C++案例一步一步实操cmake(起飞系列)
你或许听过好几种Make工具,例如GNU Make ,QT的qmake ,微软的MS nmake,BSD Make(pmake),Makepp,等等。这些Make工具遵循着不同的规范和标准,所执行的Makefile格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次Makefile,这将是一件让人抓狂的工作。
集智书童公众号
2021/07/30
1.6K0
Android JNI 开发
几乎稍有经验的Android开发,都会在工作中用到JNI的开发。即使工作中没有涉及到JNI的开发,在我们使用第三方的库时,也经常需要引入.so文件。
Oceanlong
2019/02/22
1.3K0
Android JNI 开发
Flutter鸿蒙终端一体化-混沌初开
flutter_flutter项目,这是我们整个工程的核心,但是很多人都倒在了第一步,其原因,就是——需要使用Dev分支!!! https://gitee.com/openharmony-sig/flutter_flutter/tree/dev/
用户1907613
2024/01/24
3.1K0
Flutter鸿蒙终端一体化-混沌初开
使用京东Taro开发鸿蒙PC(附鸿蒙版Taro环境搭建流程)
打开 DevEco,点击右上角的 Create Project,在 Application 处选择 Empty Ability,点击 Next,进入配置页面,根据需求调整内容,这里使用默认配置:
徐建国
2025/05/21
4710
使用京东Taro开发鸿蒙PC(附鸿蒙版Taro环境搭建流程)
推荐阅读
相关推荐
gtest单元测试框架介绍及简单使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档