From a9a3de35d9630647a6f9d3f6f9fac8cd9ee12136 Mon Sep 17 00:00:00 2001 From: zhanghongyuan Date: Tue, 11 Aug 2026 23:38:55 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=A8=E8=A6=86=E7=9B=96?= =?UTF-8?q?=E7=8E=87=E7=BC=BA=E5=8F=A3=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=EF=BC=88=E6=89=B9=E6=AC=A11=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补全以下类此前函数覆盖率为 0 或存在缺口的 getter/纯逻辑方法用例: - EDIDParser: hexToBin(十六进制转二进制,含合法输入与边界) - DriverInfo(MacroDefinition.h): backupFileName/modelName/driverName/vendorName 四个 getter - CommonTools: 构造函数与静态 feedback() - PageInfo: packageHasInstalled(dpkg -s 包查询) - Device* 系列 vendor() 等 getter:DeviceAudio/DeviceBluetooth/DeviceCdrom/ DeviceComputer/DeviceGpu/DeviceImage/DeviceInput/DeviceMemory/DeviceMonitor/ DeviceOtherPCI/DeviceOthers/DevicePower/DevicePrint - DeviceBios: tomlname - DevicePrint: makeAndeModel - DeviceNetwork: vendor/isWireless/hwAddress/canDisable - DeviceStorage: getManfName/getOemName 所有新增用例均接入既有 tests/src 目录(CMake 递归 glob 自动收录), 仅新增独立测试文件,不修改已有测试与源码。 批次统计: - 新增测试文件:5 - 新增用例:37(全部通过,0 失败 0 跳过) - 整体用例数:1137,通过 1131,失败 6 (6 项失败为既有用例,均与键盘/hwinfo/hciconfig 硬件相关,非本批次引入) - 函数覆盖率:87.3%(1324/1517) → 89.2%(1354/1517),+30 函数 - 本批次使 8 个文件达到 100% 函数覆盖: EDIDParser.cpp / commontools.cpp / PageInfo.cpp / MacroDefinition.h / DeviceBios.cpp / DeviceNetwork.cpp / DevicePrint.cpp / DeviceStorage.cpp 基线 commit: - baseline_commit: 89825dcdb75ee6a975b1892cac4c42407ac94033 - baseline_title: fix(gpu): fix GPU VRAM size parsing failure on multi-line gpu-info - baseline_date: 2026-08-06 --- .../ut_device_getters_covgap.cpp | 173 ++++++++++++++++++ .../GenerateDevice/ut_edidparser_hextobin.cpp | 44 +++++ .../Page/ut_pageinfo_packagehasinstalled.cpp | 33 ++++ .../src/Tool/ut_commontools_feedback.cpp | 36 ++++ .../tests/src/ut_driverinfo_getters.cpp | 52 ++++++ 5 files changed, 338 insertions(+) create mode 100644 deepin-devicemanager/tests/src/DeviceManager/ut_device_getters_covgap.cpp create mode 100644 deepin-devicemanager/tests/src/GenerateDevice/ut_edidparser_hextobin.cpp create mode 100644 deepin-devicemanager/tests/src/Page/ut_pageinfo_packagehasinstalled.cpp create mode 100644 deepin-devicemanager/tests/src/Tool/ut_commontools_feedback.cpp create mode 100644 deepin-devicemanager/tests/src/ut_driverinfo_getters.cpp diff --git a/deepin-devicemanager/tests/src/DeviceManager/ut_device_getters_covgap.cpp b/deepin-devicemanager/tests/src/DeviceManager/ut_device_getters_covgap.cpp new file mode 100644 index 00000000..b246bfad --- /dev/null +++ b/deepin-devicemanager/tests/src/DeviceManager/ut_device_getters_covgap.cpp @@ -0,0 +1,173 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +// +// 覆盖率缺口补全:DeviceManager 模块下多个 Device* 类的 vendor() 等 getter +// 此前未被任何用例调用,函数覆盖率为 0。本文件对各设备类做默认构造并调用其 +// 未覆盖的 getter: +// - vendor() 等为 const 成员 getter,默认构造未填充硬件数据,返回空串; +// 用例主要保证 getter 可被安全调用(函数覆盖),并验证默认语义。 +// - DeviceNetwork::canDisable/isWireless/hwAddress 与 DeviceStorage::getManfName/ +// getOemName 含可判定的默认逻辑或查表逻辑,使用确定性断言。 + +#include "DeviceAudio.h" +#include "DeviceBios.h" +#include "DeviceBluetooth.h" +#include "DeviceCdrom.h" +#include "DeviceComputer.h" +#include "DeviceGpu.h" +#include "DeviceImage.h" +#include "DeviceInput.h" +#include "DeviceMemory.h" +#include "DeviceMonitor.h" +#include "DeviceNetwork.h" +#include "DeviceOtherPCI.h" +#include "DeviceOthers.h" +#include "DevicePower.h" +#include "DevicePrint.h" +#include "DeviceStorage.h" +#include "DeviceInfo.h" +#include "MacroDefinition.h" + +#include "ut_Head.h" +#include "stub.h" + +#include + +// ---- vendor() getter 集群:默认构造后调用,验证不崩溃且返回 QString ---- +TEST(UT_Device_GettersCovGap, DeviceAudio_Vendor_DefaultCtorNoCrash) +{ + DeviceAudio device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceBluetooth_Vendor_DefaultCtorNoCrash) +{ + DeviceBluetooth device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceCdrom_Vendor_DefaultCtorNoCrash) +{ + DeviceCdrom device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceComputer_Vendor_DefaultCtorNoCrash) +{ + DeviceComputer device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceGpu_Vendor_DefaultCtorNoCrash) +{ + DeviceGpu device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceImage_Vendor_DefaultCtorNoCrash) +{ + DeviceImage device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceInput_Vendor_DefaultCtorNoCrash) +{ + DeviceInput device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceMemory_Vendor_DefaultCtorNoCrash) +{ + DeviceMemory device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceMonitor_Vendor_DefaultCtorNoCrash) +{ + DeviceMonitor device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceOtherPCI_Vendor_DefaultCtorNoCrash) +{ + DeviceOtherPCI device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DeviceOthers_Vendor_DefaultCtorNoCrash) +{ + DeviceOthers device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DevicePower_Vendor_DefaultCtorNoCrash) +{ + DevicePower device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +TEST(UT_Device_GettersCovGap, DevicePrint_Vendor_DefaultCtorNoCrash) +{ + DevicePrint device; + EXPECT_NO_FATAL_FAILURE(device.vendor()); +} + +// ---- 非 vendor 的确定性 getter ---- + +TEST(UT_Device_GettersCovGap, DeviceBios_Tomlname_DefaultCtorReturnsEmpty) +{ + DeviceBios device; + EXPECT_TRUE(device.tomlname().isEmpty()); +} + +TEST(UT_Device_GettersCovGap, DevicePrint_MakeAndModel_DefaultCtorReturnsEmpty) +{ + DevicePrint device; + EXPECT_TRUE(device.makeAndeModel().isEmpty()); +} + +TEST(UT_Device_GettersCovGap, DeviceNetwork_Vendor_DefaultCtorReturnsEmpty) +{ + DeviceNetwork device; + EXPECT_TRUE(device.vendor().isEmpty()); +} + +TEST(UT_Device_GettersCovGap, DeviceNetwork_IsWireless_DefaultCtorReturnsFalse) +{ + DeviceNetwork device; + EXPECT_FALSE(device.isWireless()); +} + +TEST(UT_Device_GettersCovGap, DeviceNetwork_HwAddress_DefaultCtorReturnsEmpty) +{ + DeviceNetwork device; + EXPECT_TRUE(device.hwAddress().isEmpty()); +} + +TEST(UT_Device_GettersCovGap, DeviceNetwork_CanDisable_EmptySysPathReturnsFalse) +{ + // canDisable: m_SysPath 为空时返回 false + DeviceNetwork device; + EXPECT_FALSE(device.canDisable()); +} + +TEST(UT_Device_GettersCovGap, DeviceStorage_GetManfName_KnownIdReturnsMappedVendor) +{ + DeviceStorage device; + // MANFID_TABLE 中 000001 -> Panasonic + EXPECT_EQ(device.getManfName("000001"), "Panasonic"); +} + +TEST(UT_Device_GettersCovGap, DeviceStorage_GetManfName_UnknownIdReturnsRawInput) +{ + DeviceStorage device; + // 查表未命中时返回原始输入 + EXPECT_EQ(device.getManfName("zzz-unknown-manf"), "zzz-unknown-manf"); +} + +TEST(UT_Device_GettersCovGap, DeviceStorage_GetOemName_UnknownIdReturnsRawInput) +{ + DeviceStorage device; + EXPECT_EQ(device.getOemName("zzz-unknown-oem"), "zzz-unknown-oem"); +} diff --git a/deepin-devicemanager/tests/src/GenerateDevice/ut_edidparser_hextobin.cpp b/deepin-devicemanager/tests/src/GenerateDevice/ut_edidparser_hextobin.cpp new file mode 100644 index 00000000..29cc6ca2 --- /dev/null +++ b/deepin-devicemanager/tests/src/GenerateDevice/ut_edidparser_hextobin.cpp @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +// +// 覆盖率缺口补全:EDIDParser::hexToBin 此前未被任何用例调用,函数覆盖率为 0。 +// 本文件补全该函数的用例,覆盖合法十六进制输入与边界输入。 + +#include "EDIDParser.h" + +#include "ut_Head.h" +#include "stub.h" + +#include + +// hexToBin 内部依次调用 hexToDec 与 decTobin,最终结果按 4 位对齐补零。 +TEST(UT_EDIDParser_HexToBin, HexToBin_TwoFF_ReturnsEightOnes) +{ + EDIDParser parser; + EXPECT_EQ(parser.hexToBin("FF"), "11111111"); +} + +TEST(UT_EDIDParser_HexToBin, HexToBin_SingleZero_ReturnsFourZeros) +{ + EDIDParser parser; + EXPECT_EQ(parser.hexToBin("0"), "0000"); +} + +TEST(UT_EDIDParser_HexToBin, HexToBin_SingleOne_ReturnsPaddedOne) +{ + EDIDParser parser; + EXPECT_EQ(parser.hexToBin("1"), "0001"); +} + +TEST(UT_EDIDParser_HexToBin, HexToBin_SingleA_ReturnsBinary1010) +{ + EDIDParser parser; + EXPECT_EQ(parser.hexToBin("A"), "1010"); +} + +TEST(UT_EDIDParser_HexToBin, HexToBin_EmptyInput_ReturnsFourZeros) +{ + EDIDParser parser; + EXPECT_EQ(parser.hexToBin(""), "0000"); +} diff --git a/deepin-devicemanager/tests/src/Page/ut_pageinfo_packagehasinstalled.cpp b/deepin-devicemanager/tests/src/Page/ut_pageinfo_packagehasinstalled.cpp new file mode 100644 index 00000000..683a3f1a --- /dev/null +++ b/deepin-devicemanager/tests/src/Page/ut_pageinfo_packagehasinstalled.cpp @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +// +// 覆盖率缺口补全:PageInfo::packageHasInstalled 此前未被用例调用。 +// 该函数通过 `dpkg -s ` 判断包是否安装:已安装包 stdout 含 "installed", +// 不存在的包 stdout 为空(提示信息走 stderr)。PageInfo 为抽象基类,通过其派生类 +// PageMultiInfo 实例化后调用。 + +#include "PageInfo.h" +#include "PageMultiInfo.h" + +#include "ut_Head.h" +#include "stub.h" + +#include + +TEST(UT_PageInfo_PackageHasInstalled, InstalledDpkgPackage_ReturnsTrue) +{ + PageMultiInfo *p = new PageMultiInfo; + PageInfo *info = dynamic_cast(p); + // dpkg 自身必然已安装 + EXPECT_TRUE(info->packageHasInstalled("dpkg")); + delete p; +} + +TEST(UT_PageInfo_PackageHasInstalled, NonExistentPackage_ReturnsFalse) +{ + PageMultiInfo *p = new PageMultiInfo; + PageInfo *info = dynamic_cast(p); + EXPECT_FALSE(info->packageHasInstalled("zzz-not-a-real-package-20260811")); + delete p; +} diff --git a/deepin-devicemanager/tests/src/Tool/ut_commontools_feedback.cpp b/deepin-devicemanager/tests/src/Tool/ut_commontools_feedback.cpp new file mode 100644 index 00000000..18d9073e --- /dev/null +++ b/deepin-devicemanager/tests/src/Tool/ut_commontools_feedback.cpp @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +// +// 覆盖率缺口补全:CommonTools 的构造函数与静态 feedback() 此前未被用例调用。 +// - 构造函数仅做日志输出,构造对象即可覆盖。 +// - feedback() 内部构造 QDBusInterface 调用服务支持 DBus;测试环境无会话总线, +// QDBusInterface 无效、QDBusReply::isValid() 为 false,走 else 分支,函数体完整执行 +// 且不会阻塞或崩溃,因此可直接调用覆盖。 + +#include "commontools.h" + +#include "ut_Head.h" +#include "stub.h" + +#include + +TEST(UT_CommonTools_Feedback, Constructor_WithNullParent_ObjectCreated) +{ + CommonTools tools(nullptr); + EXPECT_NE(nullptr, &tools); +} + +TEST(UT_CommonTools_Feedback, Constructor_WithParent_ObjectCreated) +{ + QObject parent; + CommonTools tools(&parent); + EXPECT_EQ(&parent, tools.parent()); +} + +TEST(UT_CommonTools_Feedback, Feedback_NoSessionBus_CompletesWithoutCrash) +{ + // 无 DBus 会话总线时,feedback 内部 DBus 调用即时返回无效应答, + // 函数走 false 分支正常结束。此处验证其可被安全调用。 + EXPECT_NO_FATAL_FAILURE(CommonTools::feedback()); +} diff --git a/deepin-devicemanager/tests/src/ut_driverinfo_getters.cpp b/deepin-devicemanager/tests/src/ut_driverinfo_getters.cpp new file mode 100644 index 00000000..f78bff2b --- /dev/null +++ b/deepin-devicemanager/tests/src/ut_driverinfo_getters.cpp @@ -0,0 +1,52 @@ +// SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +// +// 覆盖率缺口补全:MacroDefinition.h 中 DriverInfo 结构的 backupFileName/modelName/ +// driverName/vendorName 四个内联 getter 此前未被调用,函数覆盖率为 0。 +// 本文件通过构造 DriverInfo 并回写成员,验证 getter 取值正确。 + +#include "MacroDefinition.h" + +#include "ut_Head.h" +#include "stub.h" + +#include + +TEST(UT_DriverInfo_Getters, BackupFileName_SetValue_ReturnsSameValue) +{ + DriverInfo info; + info.m_BackupFileName = "nvidia-525-backup.deb"; + EXPECT_EQ(info.backupFileName(), "nvidia-525-backup.deb"); +} + +TEST(UT_DriverInfo_Getters, ModelName_SetValue_ReturnsSameValue) +{ + DriverInfo info; + info.m_ModelName = "GeForce RTX 3060"; + EXPECT_EQ(info.modelName(), "GeForce RTX 3060"); +} + +TEST(UT_DriverInfo_Getters, DriverName_SetValue_ReturnsSameValue) +{ + DriverInfo info; + info.m_DriverName = "nvidia-driver-525"; + EXPECT_EQ(info.driverName(), "nvidia-driver-525"); +} + +TEST(UT_DriverInfo_Getters, VendorName_SetValue_ReturnsSameValue) +{ + DriverInfo info; + info.m_VendorName = "NVIDIA Corporation"; + EXPECT_EQ(info.vendorName(), "NVIDIA Corporation"); +} + +// 默认构造后各 getter 应返回空串,验证默认值语义 +TEST(UT_DriverInfo_Getters, DefaultCtor_GettersReturnEmptyString) +{ + DriverInfo info; + EXPECT_TRUE(info.backupFileName().isEmpty()); + EXPECT_TRUE(info.modelName().isEmpty()); + EXPECT_TRUE(info.driverName().isEmpty()); + EXPECT_TRUE(info.vendorName().isEmpty()); +}