You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试std::unique_lock<std::mutex>初始化的分支覆盖率?

关于std::unique_lock构造分支的覆盖率问题
  • 为什么std::unique_lock<std::mutex> lock{mtx}会出现两个分支?
    这是因为标准库中std::unique_lock接收std::mutex参数的构造函数内部存在分支逻辑。最常见的两种路径是:

    1. 正常路径:成功获取互斥锁,完成unique_lock初始化。
    2. 异常路径:获取锁失败(比如当前线程已持有该std::mutex,由于std::mutex不支持递归加锁),触发std::system_error异常。
      覆盖率工具会把这些标准库内部的分支统计到你的代码报告中。
  • 如何覆盖这两个分支?

    • 正常分支:直接执行std::unique_lock<std::mutex> lock{mtx}即可,这是常规测试已覆盖的路径。
    • 异常分支:在同一线程中先手动调用mtx.lock()持有锁,再构造unique_lock触发异常,用gtest的异常断言捕获该场景,示例代码:
      TEST(YourTestSuite, UniqueLockExceptionBranch) {
          std::mutex mtx;
          mtx.lock(); // 当前线程持有锁
          EXPECT_THROW(std::unique_lock<std::mutex> lock{mtx}, std::system_error);
          mtx.unlock(); // 手动释放锁避免资源泄漏
      }
      
  • 注意事项:

    • 若使用std::recursive_mutex,重复加锁不会触发异常,需根据对应标准库实现调整测试逻辑。
    • 不同编译器或标准库的分支实现可能略有差异,上述方法是覆盖异常分支的通用方案。

内容的提问来源于stack exchange,提问作者sayonara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:11:20