logo资料库

gtest从零到项目使用.pdf

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
gtest从零到项目使用
1. 写在最前
2. gtest基础
2.1. 最基本的认知
2.2. 各种概念
2.3. gtest的常见函数和命令
3. gtest主要模块内容讲解
3.1. 断言
3.2. 参数化-测试参数批量处理
3.2.1. 参数批量处理相关函数
3.2.2. 案例名
3.3. 事件机制
3.3.1. 事件机制和宏之间的关系
3.3.2. 各机制之间的关系
3.3.3. TestCase级别事件
3.3.3.1. 示例
3.3.4. TestSuite级别事件
3.3.4.1. 示例
3.3.5. 全局事件
3.3.5.1. 示例
3.3.6. 参考
3.4. gtest的死亡测试
3.4.1. *_DEATH(statement, regex`) 宏表达式
3.4.2. *_EXIT(statement, predicate, regex`) 宏表达式
3.4.3. *_DEBUG_DEATH
3.4.4. 死亡测试的运行方式
3.4.5. 注意事项
3.5. 运行参数-测试的可执行程序的运行参数
3.5.1. 基本介绍
3.5.1.1. 命令行参数指定
3.5.1.2. 代码中的FLAG
3.5.1.3. 系统环境变量
3.5.1.4. 参数列表
4. 项目实践
4.1. 环境搭建
4.1.1. 编译
4.2. 搭建自己的测试框架-项目级
参考
5. 学习示例
6. 基础函数
6.1. TEST(test_case_name, test_name)
7. 参考连接
gtest从 gtest从 1. 写 2. gtest基 2.1. 最 2.2. 各 2.3. gtest的 3. gtest主 3.1. 断 3.2. 参 化-测 3.2.1. 参 3.2.2. 案 3.3. 事 3.3.1. 事 3.3.2. 各 3.3.3. TestCase级 3.3.3.1. ⽰ 3.3.4. TestSuite级 3.3.4.1. ⽰ 3.3.5. 全 3.3.5.1. ⽰ 3.3.6. 参 3.4. gtest的 3.4.1. *_DEATH(statement, regex`) 宏 3.4.2. *_EXIT(statement, predicate, regex`) 宏 3.4.3. *_DEBUG_DEATH 3.4.4. 死 3.4.5. 注 3.5. 运 数-测 3.5.1. 基 3.5.1.1. 命 3.5.1.2. 代 3.5.1.3. 系 3.5.1.4. 参 的FLAG 4. 项 4.1. 环 4.1.1. 编 4.2. 搭 架-项 5. 学 6. 基 6.1. TEST(test_case_name, test_name) 7. 参 1. 写 作, 它 量, 需 试, 为 题,只 分, 伴 题,才 起, 搅 们, 直 试ok不 量,但 不ok,确 零 到 项 ⽬ 使 ⽤ 零 到 项 ⽬ 使 ⽤ 在 最 前 础 基 本 的 认 知 种 概 念 常 ⻅ 函 数 和 命 令 要 模 块 内 容 讲 解 ⾔ 数 试 参 数 批 量 处 理 数 批 量 处 理 相 关 函 数 例 名 件 机 制 件 机 制 和 宏 之 间 的 关 系 机 制 之 间 的 关 系 别 事 件 例 别 事 件 例 局 事 件 例 考 死 亡 测 试 表 达 式 表 达 式 亡 测 试 的 运 ⾏ ⽅ 式 意 事 项 ⾏ 参 试 的 可 执 ⾏ 程 序 的 运 ⾏ 参 数 本 介 绍 令 ⾏ 参 数 指 定 码 中 统 环 境 变 量 数 列 表 ⽬ 实 践 境 搭 建 译 建 ⾃ ⼰ 的 测 试 框 ⽬ 级 参 考 习 ⽰ 例 础 函 数 考 连 接 在 最 前 质 量 ⾸ 先 属 于 开 发 问 题 , ⽽ 不 是 测 试 问 有 开 发 解 决 不 了 的 质 量 问 是 测 试 的 问 题 测 试 并 不 是 ⼀ 个 独 ⽴ 的 ⼯ 是 开 发 ⼯ 作 的 ⼀ 部 随 着 整 个 开 发 过 程 质 量 不 等 于 测 了 质 要 你 把 开 发 ⼯ 作 和 测 试 结 合 到 ⼀ 拌 它 到 分 不 清 你 我 为 ⽌ 测 等 于 ⾼ 质 是 测 试 实 万 万 不 ⾏ 的
2. gtest基 2.1. 最 1. 使 ⽤gtest编 1) 2) ,N是 3) 的Add函 2.2. 各 点 类 ⾔,传 个TEST宏,会 2.3. gtest的 就……) 有N个 些log, 多“应 么”的 令,TEST宏 个TestCase 1. RUN_ALL_TESTS() 开 2. testing::InitGoogleTest(&argc, argv); 初 ⼦: 1 2 3 4 5 int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); testing::FLAGS_gtest_death_test_style = "fast"; return RUN_ALL_TESTS(); } 3. gtest主 3.1. 断 通 过 把 测 试 ⼯ 作 ⼀ 定 程 度 的 融 合 到 开 发 过 程 中 , 我 们 极 ⼤ 的 降 低 了 ⼀ 些 本 来 被 认 为 会 写 很 多 有 问 题 的 代 码 的 ⼈ 的 出 错 机 会 础 基 本 的 认 知 写 的 测 试 案 例 通 常 本 ⾝ 就 是 ⼀ 个 可 执 ⾏ ⽂ 件 , 因 此 运 ⾏ 起 来 ⾮ 常 ⽅ 便 其 实 在 我 们 ⼀ 开 始 学 习 写 单 元 测 试 的 时 候 , ⽼ 师 或 者 有 ⼈ ⽣ 经 验 的 资 深 码 农 就 已 经 告 诉 了 我 们 写 单 元 测 试 的 ⼀ 些 原 则 : 测 试 ⽤ 例 能 验 证 函 数 的 正 确 性 ( 这 条 都 通 不 过 ; 测 试 ⽤ 例 尽 可 能 涵 盖 边 界 条 件 ( 例 如 遍 历 ⼀ 个 链 表 , 头 指 针 是 空 , 只 有 ⼀ 个 节 点 , 链 表 节 点 问 题 描 述 下 允 许 的 最 ⼤ 节 点 数 等 等 ) ; ⼀ 些 异 常 和 错 误 处 理 ( 例 如 往 ⼀ 个 函 数 ⾥ 传 ⼊ 空 指 针 , 传 ⼊ 空 串 , 这 个 函 数 能 否 打 印 ⼀ 返 回 错 误 码 , 实 现 加 法 数 如 何 检 测 和 处 理 溢 出 等 等 ) 最 理 想 的 情 况 下 ( 时 间 很 多 ! ) , 应 该 尽 量 多 写 测 试 ⽤ 例 , 以 保 证 代 码 功 能 的 正 确 性 符 合 预 期 , 具 有 良 好 的 容 错 性 。 如 果 代 码 较 复 杂 , 条 件 分 ⽀ 较 多 , 测 试 ⽤ 例 最 好 能 覆 盖 所 有 的 分 ⽀ 路 径 。 上 述 原 则 ⼀ 般 解 决 了 很 该 测 试 什 问 题 。 种 概 念 测 试 似 于 断 ⼊ ⼀ 个 参 数 ⼀ 有 很 多 断 ⾔ 测 试 命 就 是 ⼀ 常 ⻅ 函 数 和 命 令 始 所 有 的 测 试 始 化 例 要 模 块 内 容 讲 解 ⾔
3.2. 参 化-测 化,是 决,测 点,需 数,产 1 2 3 4 5 6 7 8 TEST(IsPrimeTest, HandleTrueReturn) { EXPECT_TRUE(IsPrime(3)); EXPECT_TRUE(IsPrime(5)); EXPECT_TRUE(IsPrime(11)); EXPECT_TRUE(IsPrime(23)); EXPECT_TRUE(IsPrime(17)); } ⽰,为 是1个 有5个 况,会 了4次 有50个 把5个 ,100个 成5个 看gtest是 3.2.1. 参 1 INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17)) TrueReturn 第 namespace吧 IsPrimeParamTest 第 IsPrimeParamTest 的 宏 testing::Values(3, 5, 11, 23, 17) 第 。Google提 取,⽤ 容,可 为c++当 ⽤test::Values 数 试 参 数 批 量 处 理 参 数 为 了 解 试 要 传 ⼊ 太 多 参 ⽣ 很 多 重 复 代 码 的 问 题 如 上 ⾯ 代 码 所 了 测 试 函 数 的 各 种 参 数 的 正 确 情 传 ⼊ 很 多 参 数 我 们 注 意 到 , 在 这 个 测 试 案 例 中 , 我 ⾄ 少 复 制 粘 贴 , 假 如 参 数 , 怎 么 办 ? 同 时 , 上 ⾯ 的 写 法 产 ⽣ 的 测 试 案 例 , ⾥ ⾯ 检 查 点 , 假 如 我 要 检 查 变 单 独 的 案 例 , 将 会 更 加 累 ⼈ 。 接 下 来 , 就 来 看 如 何 为 我 们 解 决 这 些 问 题 的 数 批 量 处 理 相 关 函 数 ⼀ 个 参 数 是 测 试 案 例 的 前 缀 , 可 以 任 意 于 标 识 你 的 内 以 理 解 中 的 ⼆ 个 参 数 是 测 试 案 例 的 名 称 , 需 要 和 之 前 定 义 的 参 数 化 的 类 的 名 称 相 同 , 如 : 和 上 ⾯ 的 例 ⼦ ⾥ 边 第 ⼀ 个 参 数 ⼀ 致 三 个 参 数 是 可 以 理 解 为 参 数 ⽣ 成 器 , 上 ⾯ 的 例 ⼦ 使 表 ⽰ 使 ⽤ 括 号 内 的 参 数 供 了 ⼀ 系 列 的 参 数 ⽣ 成 的 函 数
Range(begin, end[, step]) 在begin~end之 为step, 括end Values(v1, v2, ..., vN) v1,v2到vN的 ValuesIn(container) and ValuesIn(begin, end) 个C类 是STL容 Bool() 取 false 和 true 两 将g1,g2,...gN进 g1,g2,...gN本 g1,g2,..gN中 组(Tuple) Combine(g1, g2, ..., gN) 3.2.2. 案 。 命 prefix/test_case_name.test.name/index ⾯INSTANTIATE_TEST_CASE_P 第 数,测 称,宏 prefix 就 test_case_name 测 3.3. 事 gtest提 TEST_F宏 。gtest的 承Test类 有3种 参 数 范 围 取 值 命 令 含 义 范 围 间 , 步 ⻓ 不 包 值 从 ⼀ 型 的 数 组 或 器 , 或 是 迭 代 器 中 取 值 个 值 这 个 ⽐ 较 强 悍 , 它 ⾏ 排 列 组 合 , ⾝ 是 ⼀ 个 参 数 ⽣ 成 器 , 每 次 分 别 从 各 取 出 ⼀ 个 值 , 组 合 成 ⼀ 个 元 作 为 ⼀ 个 参 数 。 例 名 因 为 使 ⽤ 了 参 数 化 的 ⽅ 式 执 ⾏ 案 例 , 我 ⾮ 常 想 知 道 运 ⾏ 案 例 时 , 每 个 案 例 名 称 是 如 何 命 名 的 。 我 执 ⾏ 了 上 ⾯ 的 代 码 , 输 出 如 下 : 从 上 ⾯ 的 框 框 中 的 案 例 名 称 ⼤ 概 能 够 看 出 案 例 的 命 名 规 则 , 对 于 需 要 了 解 每 个 案 例 的 名 称 的 我 来 说 , 这 ⾮ 常 重 要 名 规 则 ⼤ 概 为 : 是 上 ⼀ 个 参 数 试 样 例 名 第 ⼀ 个 参 试 案 例 范 围 下 ⾯ 还 有 具 体 测 试 件 机 制 可 以 在 案 例 之 间 共 享 ⼀ 些 通 ⽤ ⽅ 法 , 共 享 资 源 供 了 多 种 事 件 机 制 , ⾮ 常 ⽅ 便 我 们 在 案 例 之 前 或 之 后 做 ⼀ 些 操 作 。 通 过 继 , 使 ⽤ , 我 们 可 以 在 案 例 之 间 共 享 ⼀ 些 通 ⽤ ⽅ 法 , 共 享 资 源 事 件 ⼀ 共 :
TestSuite级 TestCase级 3.3.1. 事 个TestCase前 道TEST(test_case_name,test_name)宏 ,test_name理 是TestSuite级 个Test级 是test_name标 将test_case_name理 候test_case_name所 TestSuite级 TestCase 对 3.3.2. 各 试,例 3.3.3. TestCase级 现TestCase事 类testing::Test, 数SetUp() 和 TearDown(),SetUp()在 个TestCase执 ⽽TearDown()在 个TestCase执 全 局 的 , 所 有 案 例 执 ⾏ 前 后 。 别 的 , 在 某 ⼀ 批 案 例 中 第 ⼀ 个 案 例 前 , 最 后 ⼀ 个 案 例 执 ⾏ 后 。 别 的 , 每 后 。 件 机 制 和 宏 之 间 的 关 系 我 们 知 函 数 有 两 个 参 数 , 这 ⾥ 可 以 解 为 ⼀ 个 ⽬ 录 解 为 这 个 ⽬ 录 下 的 众 多 ⼦ ⽬ 录 , 在 执 ⾏ 测 试 的 时 标 识 的 就 别 的 , ⽽ 每 ⼀ 别 的 就 识 的 测 试 别 类 似 于 ⼀ 个 测 试 的 类 应 于 每 ⼀ 次 的 测 如 ⼀ 次 断 ⾔ 测 试 机 制 之 间 的 关 系 别 事 件 实 件 , 需 要 实 现 ⼀ 个 类 并 继 承 ⾃ 在 该 类 内 含 有 两 个 函 每 ⾏ 之 前 会 执 ⾏ , 每 ⾏ 之 后 会 进 ⾏
解,就 隔case有 ⽤gtest框 试STL中 的map这 的TEST()部 测find(),size()这 现,这 个TEST CASE⾥ 中,那 了, 理,我 来,放 到SetUp() TearDown()这 3.3.3.1. ⽰ ⼦,更 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ⾏SetUp()和TearDown() 个test_case执 //在 class TestMap:public testing::Test { public: void SetUp() { cout<<"Setup()"< mp; }; 通 俗 的 讲 是 每 时 候 会 有 ⼀ 些 公 共 的 执 ⾏ 操 作 举 例 : 我 们 使 架 测 个 数 据 结 构 时 , 我 们 假 设 只 两 个 函 数 , 如 果 不 使 ⽤ 事 件 机 制 , 则 测 试 分 如 下 : 你 会 发 两 边 都 有 ⼀ 些 公 共 的 处 们 把 这 个 抽 取 出 种 框 架 虚 函 数 么 就 可 以 实 现 例 通 过 下 ⾯ 的 例 容 易 理 解 明 ⽩ 每 ⼀ ⾏ 之 前 和 之 后 , 执
TearDown⽅ 个TestCase执 了SetUp和 数SetUpTestCase() 和 3.3.4. TestSuite级 TestSuite级 TesrDownTestCase()。 SetUpTestCase() 在 TesrDownTestCase() 在 个TestCase执 个TestCase执 1 2 3 4 5 6 7 8 class MyMap:public testing::Test { public: static void SetUpTestCase() {} static void TearDownTestCase() {} }; 3.3.4.1. ⽰ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 个test之 ⽤SetUpTestCase()和TearDownTestCase() 个test之 //在 class TestMap:public testing::Test { public: static void SetUpTestCase() { cout<<"SetUpTestCase()"<
18 19 20 21 22 23 24 25 26 27 28 29 30 31 mp.insert(make_pair(1,1)); mp.insert(make_pair(2,1)); mp.insert(make_pair(3,1)); mp.insert(make_pair(4,1)); } void TearDown() { mp.clear(); cout<<"TearDown()"< mp; }; 3.3.5. 全 testing::Environment。 SetUp()在 TearDown()在 现SetUp() 和 TearDown()两 1 2 3 4 5 6 7 8 class GlobalTest:public testing::Environment { public: virtual void SetUp() {} virtual void TearDown() {} }; testing::AddGlobalTestEnvironment⽅ AddGlobalTestEnvironment()将 到main中 在main函 结 果 如 下 图 局 事 件 要 实 现 全 局 事 件 与 上 述 两 个 事 件 ⼀ 样 , 都 需 要 继 承 ⼀ 个 类 , 但 全 局 事 件 需 要 继 承 的 类 是 在 类 内 需 要 实 个 ⽅ 法 。 所 有 的 案 例 执 ⾏ 之 前 执 ⾏ ; 所 有 的 案 例 执 ⾏ 之 后 执 ⾏ 。 使 ⽤ 全 局 事 件 时 需 要 注 意 的 是 : 数 中 加 ⼊ 法 , 在 调 ⽤ 这 个 ⽅ 法 之 前 ⽣ 成 ⼀ 个 类 的 对 象 , 使 ⽤ 这 个 对 象 添 加 , 即 将 其 事 件 挂 接 上 去 。
分享到:
收藏