Board logo

标题: 面向 C++ 的测试驱动开发(2) [打印本页]

作者: look_w    时间: 2018-4-22 15:21     标题: 面向 C++ 的测试驱动开发(2)

测试驱动开发-GTest 简介Gtest 是基于 xUnit 的 C++单元测试框架,支持自动化案例自动发掘,丰富的断言功能,支持用户自定义断言,支持死亡测试和退出测试,还有异常测试控制,支持值类型和类型化的参数化测试,接口简单易用,对每个测试案例有执行时间的输出,可以帮助分析代码的执行效率,单一接口文件 gtest.h。
图 1 是 Console 模式输出用红和绿表示失败和成功的测试用例,看起来比较符合 TDD 的策略和定义
图 1.GTest    的案例测试结果输出Gtest 的断言有两种形式,致命性断言(Fatal Assertion)和非致命性断言(Nonfatal Assertion)。
除了基本的断言形式外,Gtest 还包括一些其他的高级断言形式,比如死亡断言,退出断言测试和异常断言等。
Gtest 还有其他的一些特性,比如类型参数化测试,值类型参数化的测试,测试用例分组,洗牌式测试等,可以参照附录中列出的 Gtest 的官网获取更多的信息。
在测试驱动软件开发的过程中,我们不可避免的要去依赖第三方系统,比如文件系统、第三方库、数据库访问,其他的在线数据的访问等,按照测试驱动开发的快速反馈的原则,如果在单元测试用例中去直接访问这些信息,势必在测试驱动开发过程中会依赖这些资源从而造成访问时间无法控制,    所以单元测试一般应该避免直接访问第三方系统,这就是 Mock    测试的主要目的,用模拟的接口去替换真实的接口,模拟出单元测试需要的第三方数据和接口进而隔离第三方的影响,专注于自己的逻辑实现。Gmock 就是这样一个 Mock    框架,它是类似于 jMock、EasyMock 和 Hamcres ,但是是 C++版本的 Mock 框架。 Gmock 是基于接口的 Mock 框架,在 C++中接口的定义是通过抽象函数和抽象类来实现的,这种要求势必会要求我们尽量遵循基于接口的编程原则,把交互界面上的操作抽象成接口,以便是接口可被模拟 Mock。可以在附录中列出的 Gmock 官网获取更多信息。
测试驱动开发的实践测试驱动开发和敏捷开发是相辅相成的,敏捷开发的需求一般是以故事、产品功能列表,或需求用例的方式给出,拿到这些需求后,开发团队会根据相应的需求文档分析需求,做功能分解,根据功能优先级制定迭代开发计划和测试计划。测试驱动开发可以从两个角度来看,广义的和狭义的。广义的测试驱动开发是从流程上规定测试驱动开发,这种情况下一般要求    QA 走到前面,先根据需求先开发测试用例,这些测试用例会作为功能验收的标准,然后开发人员会根据测试用例做详细的功能设计和编码实现,最后提交给 QA 做功能验收测试。 狭义的测试驱动开发是开发人员拿到功能需求后,先自己开发代码级别的测试用例,然后开发具体的实现通过这些测试用例的一种开发方法。 本文涉及的是第二种,从代码级别开始的,狭义的测试驱动开发。
相信每个人都玩过棋牌游戏,简单起见,为了实践测试驱动开发方法我想开发一款简单的三子棋游戏,如图 2 所示。三子棋的游戏规则很简单,只要是同样的三个棋子连成一条线那么持对应棋子的人就胜出,图中持 O 子棋的人获胜。总结一下三子棋游戏的基本需求:
图    2.三子棋游戏以上是三子棋游戏的基本需求列表,拿到这些需求后,我会做一些简单解决方案的设计,解决方案包括 4 个子工程(C++ Project),其中一个测试工程 TicTacToeGamingTest,其余三个分别是 TicTacToeLib,TicToeGamingLib 和 TicTacToeConsoleGaming,这三个工程的依赖关系是 TicTacToeConsoleGaming 依赖于 TicToeGaminglib 和 TicTacToeLib,TicToeGamingLib 依赖于 TicTacToeLib。 建好这些工程,有了基本的设计思路后,在测试工程里首先开发的测试代码。
图    3.解决方法设计先看第一个需求:





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0