Skip to content

test(DeviceManager): 重写 DeviceManager/DeviceInfo 单元测试补全覆盖率 - #899

Merged
deepin-bot[bot] merged 4 commits into
linuxdeepin:masterfrom
add-uos:ut-t01
Oct 27, 2026
Merged

deepin-bot[bot] merged 4 commits into
linuxdeepin:masterfrom
add-uos:ut-t01

Conversation

@add-uos

@add-uos add-uos commented Oct 24, 2026

Copy link
Copy Markdown
Contributor

单元测试重写:DeviceManager / DeviceInfo(Issue V-6200)

基于 upstream/master(b478f9e0)重写以下两个类的 Google Test 单元测试,并补齐覆盖:

  • src/DeviceManager/DeviceManager.cpp(100 方法)
  • src/DeviceManager/DeviceInfo.cpp(71 方法)

变更内容(仅测试源码文件,共 11 个,tests/src/ 下)

  • 重写 10 个 ut_*.cpp:234 个用例,AAA 结构、真实断言、外部依赖(DBus/文件系统)打桩隔离
  • ut_Head.h 新增 ut_disable_system_dbus():桩掉 DBusInterface::getInfo,隔离真实系统总线调用,避免运行期触发 polkit 鉴权弹窗(进程级一次性打桩,无累积泄漏)
  • 修复用例中的设备对象泄漏(音频设备、类别映射),LSan 报告与基线一致

验证结果

  • 编译:deepin-devicemanager-test 构建通过(Qt6/DTK6,Debug+覆盖率)
  • 用例:目标类 234/234 全部通过;0 次真实 DBus 调用
  • 结构自检:10 个文件 0 errors
  • 覆盖率(目标类用例):函数 90.1% / 行 79.1%(high 100%,mid 97.8%)

@sourcery-ai

sourcery-ai Bot commented Oct 24, 2026

Copy link
Copy Markdown

Sorry @add-uos, your pull request is larger than the review limit of 150,000 diff characters

@github-actions

Copy link
Copy Markdown
  • 检测到敏感词lshw, dmidecode变动
详情
    {
    "lshw": {
        "deepin-devicemanager/tests/src/DeviceManager/ut_deviceinfo_export.cpp": [
            "    // Arrange: hwinfo \u952e\u4e0e lshw \u603b\u7ebf\u4fe1\u606f\u4e00\u81f4"
        ],
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager.cpp": [
            "    // Arrange: \u9f20\u6807\u8bbe\u5907 businfo \u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u5339\u914d\u586b\u5145\u9f20\u6807\u4fe1\u606f",
            "    // Act: \u4ece lshw \u5339\u914d\u586b\u5145\u9f20\u6807\u4fe1\u606f",
            "    // Act: \u4ece lshw \u586b\u5145\u5b58\u50a8\u8bbe\u5907\u4fe1\u606f",
            "    // Act: \u4ece lshw \u586b\u5145 NVME \u5b58\u50a8\u8bbe\u5907\u4fe1\u606f",
            "    // Act: \u4ece lshw \u586b\u5145\u663e\u5361\u4fe1\u606f",
            "    // Arrange: \u84dd\u7259\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u84dd\u7259\u4fe1\u606f",
            "    // Arrange: \u97f3\u9891\u8bbe\u5907\u5339\u914d\u952e\u4e3a PCI \u5730\u5740, lshw \"bus info\" \u5e26 pci@ \u524d\u7f00",
            "    // Act: \u4ece lshw \u586b\u5145\u97f3\u9891\u8bbe\u5907\u4fe1\u606f",
            "    // Arrange: \u952e\u76d8\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u952e\u76d8\u8bbe\u5907\u4fe1\u606f",
            "    // Arrange: \u5176\u4ed6\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u5176\u4ed6\u8bbe\u5907\u4fe1\u606f",
            "    // Arrange: \u5149\u9a71\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u5149\u9a71\u8bbe\u5907\u4fe1\u606f"
        ],
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager_set.cpp": [
            "    // Arrange: \u6444\u50cf\u5934\u8bbe\u5907 hwinfo \u603b\u7ebf\u4fe1\u606f\u4e0e lshw \u6620\u5c04\u4e00\u81f4",
            "    // Act: \u4ece lshw \u6ce8\u5165"
        ]
    },
    "dmidecode": {
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager_set.cpp": [
            "    // Arrange: \u9ed8\u8ba4\u5185\u5b58\u8bbe\u5907(m_Locator \u4e3a\u7a7a)\u4e0e\u542b Locator \u7684 dmidecode \u6620\u5c04",
            "    // Act: \u4ece dmidecode \u6ce8\u5165",
            "    // Act: \u4ece dmidecode \u6ce8\u5165"
        ]
    }
}
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager_save.cpp": {
            "a": [
                "    EXPECT_NO_FATAL_FAILURE(DeviceManager::instance()->exportToTxt(\"/tmp/ut_dm_out.txt\"));",
                "    EXPECT_NO_FATAL_FAILURE(DeviceManager::instance()->exportToXlsx(\"/tmp/ut_dm_out.xlsx\"));",
                "    EXPECT_NO_FATAL_FAILURE(DeviceManager::instance()->exportToHtml(\"/tmp/ut_dm_out.html\"));"
            ],
            "b": [
                "// \u8986\u76d6: exportToTxt/exportToXlsx/exportToHtml\u3001overviewToTxt/overviewToHtml/",
                "// | exportToTxt                | mid   | -       | 2   | 2      |",
                "// | exportToXlsx               | low   | -       | 1   | 1      |",
                "// | exportToHtml               | low   | -       | 1   | 1      |",
                "// exportToTxt: \u7a7a\u8bbe\u5907\u5217\u8868\u5199\u5165\u6709\u6548\u6587\u4ef6(\u542b\u8868\u5934); \u4e0d\u53ef\u5199\u8def\u5f84\u8fd4\u56de false",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToTxt_valid)",
                "    bool ok = DeviceManager::instance()->exportToTxt(path);",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToTxt_badPath)",
                "    bool ok = DeviceManager::instance()->exportToTxt(tmpDir->filePath(\"no_such_dir/x.txt\"));",
                "// exportToXlsx: \u7a7a\u8bbe\u5907\u5217\u8868\u751f\u6210\u6709\u6548 xlsx \u6587\u4ef6",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToXlsx)",
                "    bool ok = DeviceManager::instance()->exportToXlsx(path);",
                "// exportToHtml: \u7a7a\u8bbe\u5907\u5217\u8868\u751f\u6210\u975e\u7a7a html \u6587\u4ef6",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToHtml)",
                "    bool ok = DeviceManager::instance()->exportToHtml(path);"
            ]
        }
    }
}

@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

🤖 AI 代码审查报告

总体评分: 100 分 (通过阈值: 70分)

Pass


📊 总体评价

项目 结果
审查结论 代码审查通过
评分详情 本次提交为单元测试重写,目的明确(重写 DeviceManager/DeviceInfo 单元测试补全覆盖率)。11 个测试文件全部遵循 AAA 模式重构,注释完整、内存管理规范、DBUS 隔离得当,无安全漏洞。测试用例从 362 行扩展至 2677 行新增,覆盖率显著提升。

🔍 详细分析

1. 语法逻辑 ✅

评价: 语法正确,逻辑清晰 ✅ 通过

潜在问题:
✅ 未发现明显问题

建议: ['无语法逻辑问题']


2. 代码质量 ✅

评价: 代码结构清晰,注释完整 ✅ 通过

潜在问题:
✅ 未发现明显问题

建议: ['少量测试用例存在轻微冗余断言(如同时使用 EXPECT_EQ(0, x.size()) 和 EXPECT_TRUE(x.isEmpty())),但测试代码中属可接受风格']


3. 代码性能 ✅

评价: 性能良好,资源使用合理 ✅ 通过

潜在问题:
✅ 未发现明显问题

建议: ['无性能问题']


4. 代码安全 🔒

评价: 存在0个安全漏洞 ✅ 通过

🔐 发现 0 个安全漏洞

安全漏洞详情:
✅ 未发现安全漏洞

建议: ['无安全问题']


💡 改进建议代码示例

// 本次提交代码质量优秀,无需修复。以下为测试编写的最佳实践示例(已在本次提交中体现):
// 1. SetUp/TearDown 管理对象生命周期,避免成员初始化处 new
class UT_DeviceInfo : public ::testing::Test {
public:
    void SetUp() override {
        ut_disable_system_dbus();
        audio = new DeviceAudio;
    }
    void TearDown() override {
        delete audio;
        audio = nullptr;
    }
    DeviceAudio *audio = nullptr;  // 初始化为 nullptr
};
// 2. AAA 注释模式
TEST_F(UT_DeviceInfo, Example) {
    // Arrange
    // Act
    // Assert
}

本报告由 AI 代码审查工具自动生成

Log: 重写 ut_devicemanager.cpp 及 6 个分组用例文件, 用例数从 98 扩充到 110
- 保留合理用例, 断言空洞/过时用例重写, 统一 AAA 注释与场景化三段式命名
- 核心流程覆盖: createDevice/clear/getDeviceTypes/setDeviceListClass/findByModalias
- 分组覆盖: mergeDisk/exportToTxt/setMemoryInfoFromDmidecode/tomlDeviceMapSet/
  deleteDisableDuplicate_AudioDevice/setMonitorInfoFromDbus 等
- 外部依赖(cmdInfo/DBus)全部打桩, 用例自包含不依赖执行顺序与真实设备环境
- 结构自检 0 错误, 编译 0 错误, 全部用例通过

Influence: DeviceManager 模块测试覆盖率提升(86/100 方法), 不影响业务逻辑
Log: 重写 ut_deviceinfo.cpp 及 base/export 分组用例文件, 用例数从 86 扩充到 124
- 以 DeviceCpu/DeviceAudio 为载体覆盖 DeviceBaseInfo 全部可测方法
- 高优方法: isValueValid/get_string/getVendorOrModelId/setHwinfoLshwKey 全分支
- 基础属性: setAttribute/displayWidth/getTableHeader/getTableData/Attribs 翻译族
- 导出链路: baseInfoToHTML/Xlsx/Txt/Html/Doc 及 setVendorNameBylsusbLspci(QProcess 桩)/
  getDriverVersion(execClientCmd 桩)/driverIsKernelIn/modalias 匹配
- 外部依赖(lsusb/lspci/modinfo/DBus)全部打桩, 不依赖真实设备环境
- 结构自检 0 错误, 编译 0 错误, 全部用例通过

Influence: DeviceBaseInfo 模块测试覆盖率提升(52/71 方法), 不影响业务逻辑
单测桩改为进程级一次性打桩避免重复 Stub::set 累积泄漏;
补齐音频设备/类别映射用例的设备释放, 消除 LSan 新增泄漏;
SetUp 注入 ut_disable_system_dbus 隔离 DBusInterface::getInfo,
避免运行期触发系统总线 polkit 鉴权弹窗。

Log: 无需提交翻译
The license-check CI (SPDX Header Validation) requires files created in
earlier years and modified in 2026 to carry a copyright year range ending
with the current year. Extend the SPDX-FileCopyrightText header of the
test helper ut_Head.h from 2022 to 2022-2026 so the SPDX summary reports
0 failures.
@github-actions

Copy link
Copy Markdown
  • 检测到敏感词lshw, dmidecode变动
详情
    {
    "lshw": {
        "deepin-devicemanager/tests/src/DeviceManager/ut_deviceinfo_export.cpp": [
            "    // Arrange: hwinfo \u952e\u4e0e lshw \u603b\u7ebf\u4fe1\u606f\u4e00\u81f4"
        ],
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager.cpp": [
            "    // Arrange: \u9f20\u6807\u8bbe\u5907 businfo \u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u5339\u914d\u586b\u5145\u9f20\u6807\u4fe1\u606f",
            "    // Act: \u4ece lshw \u5339\u914d\u586b\u5145\u9f20\u6807\u4fe1\u606f",
            "    // Act: \u4ece lshw \u586b\u5145\u5b58\u50a8\u8bbe\u5907\u4fe1\u606f",
            "    // Act: \u4ece lshw \u586b\u5145 NVME \u5b58\u50a8\u8bbe\u5907\u4fe1\u606f",
            "    // Act: \u4ece lshw \u586b\u5145\u663e\u5361\u4fe1\u606f",
            "    // Arrange: \u84dd\u7259\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u84dd\u7259\u4fe1\u606f",
            "    // Arrange: \u97f3\u9891\u8bbe\u5907\u5339\u914d\u952e\u4e3a PCI \u5730\u5740, lshw \"bus info\" \u5e26 pci@ \u524d\u7f00",
            "    // Act: \u4ece lshw \u586b\u5145\u97f3\u9891\u8bbe\u5907\u4fe1\u606f",
            "    // Arrange: \u952e\u76d8\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u952e\u76d8\u8bbe\u5907\u4fe1\u606f",
            "    // Arrange: \u5176\u4ed6\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u5176\u4ed6\u8bbe\u5907\u4fe1\u606f",
            "    // Arrange: \u5149\u9a71\u8bbe\u5907\u5339\u914d\u952e\u4e0e lshw \"bus info\" \u4e00\u81f4",
            "    // Act: \u4ece lshw \u586b\u5145\u5149\u9a71\u8bbe\u5907\u4fe1\u606f"
        ],
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager_set.cpp": [
            "    // Arrange: \u6444\u50cf\u5934\u8bbe\u5907 hwinfo \u603b\u7ebf\u4fe1\u606f\u4e0e lshw \u6620\u5c04\u4e00\u81f4",
            "    // Act: \u4ece lshw \u6ce8\u5165"
        ]
    },
    "dmidecode": {
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager_set.cpp": [
            "    // Arrange: \u9ed8\u8ba4\u5185\u5b58\u8bbe\u5907(m_Locator \u4e3a\u7a7a)\u4e0e\u542b Locator \u7684 dmidecode \u6620\u5c04",
            "    // Act: \u4ece dmidecode \u6ce8\u5165",
            "    // Act: \u4ece dmidecode \u6ce8\u5165"
        ]
    }
}
  • 检测到敏感词export变动
详情
    {
    "export": {
        "deepin-devicemanager/tests/src/DeviceManager/ut_devicemanager_save.cpp": {
            "a": [
                "    EXPECT_NO_FATAL_FAILURE(DeviceManager::instance()->exportToTxt(\"/tmp/ut_dm_out.txt\"));",
                "    EXPECT_NO_FATAL_FAILURE(DeviceManager::instance()->exportToXlsx(\"/tmp/ut_dm_out.xlsx\"));",
                "    EXPECT_NO_FATAL_FAILURE(DeviceManager::instance()->exportToHtml(\"/tmp/ut_dm_out.html\"));"
            ],
            "b": [
                "// \u8986\u76d6: exportToTxt/exportToXlsx/exportToHtml\u3001overviewToTxt/overviewToHtml/",
                "// | exportToTxt                | mid   | -       | 2   | 2      |",
                "// | exportToXlsx               | low   | -       | 1   | 1      |",
                "// | exportToHtml               | low   | -       | 1   | 1      |",
                "// exportToTxt: \u7a7a\u8bbe\u5907\u5217\u8868\u5199\u5165\u6709\u6548\u6587\u4ef6(\u542b\u8868\u5934); \u4e0d\u53ef\u5199\u8def\u5f84\u8fd4\u56de false",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToTxt_valid)",
                "    bool ok = DeviceManager::instance()->exportToTxt(path);",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToTxt_badPath)",
                "    bool ok = DeviceManager::instance()->exportToTxt(tmpDir->filePath(\"no_such_dir/x.txt\"));",
                "// exportToXlsx: \u7a7a\u8bbe\u5907\u5217\u8868\u751f\u6210\u6709\u6548 xlsx \u6587\u4ef6",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToXlsx)",
                "    bool ok = DeviceManager::instance()->exportToXlsx(path);",
                "// exportToHtml: \u7a7a\u8bbe\u5907\u5217\u8868\u751f\u6210\u975e\u7a7a html \u6587\u4ef6",
                "TEST_F(UT_DeviceManagerSave, UT_DeviceManagerSave_exportToHtml)",
                "    bool ok = DeviceManager::instance()->exportToHtml(path);"
            ]
        }
    }
}

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: add-uos, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@add-uos

add-uos commented Oct 27, 2026

Copy link
Copy Markdown
Contributor Author

/forcemerge

@deepin-bot

deepin-bot Bot commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

This pr force merged! (status: unstable)

@deepin-bot
deepin-bot Bot merged commit 075913c into linuxdeepin:master Oct 27, 2026
14 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants