新书精彩解读2:单元测试框架使用


周立功教授新书发布系列连载篇:在单元测试中,使用测试框架能够大大减少我们开发测试代码的工作量。本文截取《软件单元测试入门与实践》中测试框架部分内容,帮助读者对测试框架有一个初步的了解。
本文内容摘自《软件单元测试入门与实践》第6章。
如何编写测试用例
我们在进行单元测试时,大部分工作是编写测试代码,那么我们是如何编写测试代码的呢?
假如我们需要对一个闰年判断函数进行测试,该函数的代码如下所示。
假设我们已经通过逻辑覆盖设计出了如表1所示的测试用例。
表1闰年判断函数的测试用例
那么测试代码该怎样编写呢?也许我们可以这样编写:
这样编写测试代码也能帮助我们完成测试,不过这里面会有几个问题:
当程序输出fail时,如何能知道是哪个数据测试出错了;
这里将测试写在两个测试用例中,当我只需要运行其中一个用例怎么办;
如何知道测试用例的整体通过率。
当然这个闰年判断函数比较简单,我们也许不会有这些担心。但是在实际开发过程中,我们的程序会比这复杂得多,这种情况下这些问题我们就不得不考虑了。
什么是单元测试框架
单元测试框架是一个软件包,它能够让开发者比较方便地表达产品代码需要表现出什么样的行为。单元测试框架提供了一个自动化单元测试的解决方案,让开发者把更多精力放在测试用例编写上,而不用花精力考虑如何对测试用例进行组织。
单元测试框架提供了以下功能:
用于表达一个测试用例的通用语言;
用于表达测试用例期望结果的通用语言;
对所有测试用例进行有效管理;
提供运行部分或全部测试用例的机制;
对于测试通过和失败给出明确提示;
对于失败测试用例给出详细报告;
对各个测试用例的结果进行统计分析。
使用测试框架编写测试代码
gtest是google公司开发的一个开源的单元测试框架,基于c++开发,可以对c++语言和c语言进行单元测试。我们可以使用gtest对前面的测试代码进行改进,如下所示。
在gtest中,使用宏test定义一个测试用例,这个宏包含两个参数,第一个参数为测试用例集名称,第二个参数为测试用例名称,大括号包含的部分为测试用例的实现。
expect_*所示的宏称为断言,用于判断实际结果与预期结果是否相同。gtest为我们提供了多种不同的断言,包括布尔型判断,整形判断,浮点型判断等等,各种断言的使用方法可参照《软件单元测试入门与实践》一书。
为了运行测试用例,我们需要编写一个main函数,我们编写的main函数如下所示。
run_all_tests是gtest实现的一个宏,使用这个宏,gtest会自动收集所有的测试用例并运行,不需要我们对测试用例进行管理。
gtest除了为我们提供自动用例收集以及各种断言外,还为我们提供了测试夹具,参数化等功能。若读者需要了解更多内容,可阅读《软件单元测试入门与实践》第6章。
新书获取方式
方式一:zlg致远电子将送出100本《软件单元测试入门与实践》纸质版书籍,识别下方二维码填写申请,我们将随机抽取100位工程师送出纸质版新书,申请截止时间为:10月10日17:00;
方式二:在公众号回复【编程】,或者复制下面链接至浏览器打开,可直接阅读新书电子版。