一、背景
蒙NEXT操作系统中,上层的 ArkUI最终都会通过底层的 c++组件实现。而且随着鸿蒙的兴起,各大厂商纷纷拿出了各自的跨端方案,而c++组件复用是其中的一个主流方向。
为了确保这些组件的稳定性和可靠性,进行单元测试是其中很重要的一环,而目前鸿蒙的官方文档和开发工具中关于单元测试介绍更多是针对 ArkTs,c++单测的相关资料,因此本文尝试探究鸿蒙 NEXT c++组件单元测试及覆盖率统计的可行性方案。
二、单测框架的选择
在众多的 C++ 单元测试框架中,我们选择了 Google Test。它是一个成熟且功能强大的测试框架,广泛用于 C++ 项目的测试。
本文不会详细介绍Google Test的使用方法,如果你对 Google Test 感兴趣,可以访问官方文档了解更多详情。
三、单元测试接入
本文将介绍两种在鸿蒙系统中接入单元测试的方案,各有优缺点:
1.so库直接接入,通过应用触发测试
2.编译为可执行文件,通过命令行触发测试
方案一:so库接入单测,应用运行时触发
优势与缺点:
优势:
●更加接近真实运行环境,减少了模拟(mock)的工作量。
●可以在真机上运行测试。
缺点:
●自动化收集测试结果较为繁琐。
核心步骤:
1.配置 CMake:启用测试并添加 Google Test 依赖。
enable_testing()
# 使用 FetchContent 来下载和添加 Google Test
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/4b21f1abddaf7d28388d7430bab69a81eccb1909.zip
)
FetchContent_MakeAvailable(googletest)
# 查找测试文件
file(GLOB TESTSF
tests/*.cpp
tests/**/*.h
)
2.配置 CMake:引入测试依赖。
add_library(entry SHARED ${SOURCE_CORE} ${TESTS_CODE})
target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so gtest_main gmock_main)
#配置断言失效
target_compile_definitions(entry PRIVATE NDEBUG)
3.手动触发测试:应用运行时在调用 Google Test API。
#include <gtest/gtest.h>
::testing::InitGoogleTest();
::testing::TestEventListeners &listeners = ::testing::UnitTest::GetInstance()->listeners();
CustomTestListener *listener = new CustomTestListener();
listeners.Append(listener);
RUN_ALL_TESTS();
delete listener;
4.配置监听器:实现自定义监听器以打印测试结果。
可以根据各自的需求,设置不同监听,打印所需日志
#ifndef GTestHelper_CUSTOMTESTLISTENER_H
#define GTestHelper_CUSTOMTESTLISTENER_H
#include <gtest/gtest.h>
#include "TestLog.h"
namespace GTestHelper {
class CustomTestListener : public testing::TestEventListener {
public:
void OnTestProgramStart(const testing::UnitTest &unit_test) override {
LOG_INFO("Starting test program...");
testCaseIndex = 1;
LOG_INFO("=======================================================================