周立功新书解读:如何使用单元测试框架编写测试代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

{
if (!IsLeapYear(2000) || ! IsLeapYear(1996))
{
printf(“fail\n”);
}
}
void CommonYearTest() {
if (IsLeapYear(1999) || IsLeapYear(2100)) {
printf(“fail\n”); }
我们在进行单元测试时,大部分工作是编写测试代码,那么我们是如何编写测试代码的 呢?
假如我们需要对一个闰年判断函数进行测试,该函数的代码如下所示。 bool IsLeapYear(int year) {
bool flag = false; if ((0 == year % 400) || (0 != year %100) && (0 == year % 4)) {
EXPECT_FALSE (IsLeapYear(2100));
}
在 gtest 中,使用宏 TEST 定义一个测试用例,这个宏包含两个参数,第一个参数为测
试用例集名称,第二个参数为测试用例名称,大括号包含的部分为测试用例的实现。
EXPECT_*所示的宏称为断言,用于判断实际结果与预期结u ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州立功科技股份有限公司,转载或引用请注明出处
3
广州立功科技股份有限公司
如何使用单元测试框架编写测试代码
摘要:周立功教授新书发布系列连载篇:在单元测试中,使用测试框架能够大大减少我 们开发测试代码的工作量。本文截取《软件单元测试入门与实践》中测试框架部分内容,帮 助读者对测试框架有一个初步的了解。
本文内容摘自《软件单元测试入门与实践u ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州立功科技股份有限公司,转载或引用请注明出处
2
广州立功科技股份有限公司
供了多种不同的断言,包括布尔型判断,整形判断,浮点型判断等等,各种断言的使用方法 可参照《软件单元测试入门与实践》一书。 为了运行测试用例,我们需要编写一个 main 函数,我们u ZHIYUAN Electronics Stock Co., Ltd. 文章源自广州立功科技股份有限公司,转载或引用请注明出处
1
广州立功科技股份有限公司
}
int main(int argc, char** argv) {
LeapYearTest(); CommonYearTest(); } 这样编写测试代码也能帮助我们完成测试,不过这里面会有几个问题: 当程序输出 fail 时,如何能知道是哪个数据测试出错了; 这里将测试写在两个测试用例中,当我只需要运行其中一个用例怎么办; 如何知道测试用例的整体通过率。 当然这个闰年判断函数比较简单,我们也许不会有这些担心。但是在实际开发过程中, 我们的程序会比这复杂得多,这种情况下这些问题我们就不得不考虑了。 什么是单元测试框架 单元测试框架是一个软件包,它能够让开发者比较方便地表达产品代码需要表现出什么 样的行为。单元测试框架提供了一个自动化单元测试的解决方案,让开发者把更多精力放在 测试用例编写上,而不用花精力考虑如何对测试用例进行组织。 单元测试框架提供了以下功能: 用于表达一个测试用例的通用语言; 用于表达测试用例期望结果的通用语言; 对所有测试用例进行有效管理; 提供运行部分或全部测试用例的机制; 对于测试通过和失败给出明确提示; 对于失败测试用例给出详细报告; 对各个测试用例的结果进行统计分析。 使用测试框架编写测试代码 gtest 是 google 公司开发的一个开源的单元测试框架,基于 C++开发,可以对 C++语言 和 C 语言进行单元测试。我们可以使用 gtest 对前面的测试代码进行改进,如下所示。 #include <gtest/gtest.h>
flag = true; } return flag; } 假设我们已经通过逻辑覆盖设计出了如表 1 所示的测试用例。
表 1 闰年判断函数的测试用例
测试数据
预期结果
1999
false
2000
true
2100
false
1996
true
那么测试代码该怎样编写呢?也许我们可以这样编写:
void LeapYearTest()
TEST(IsLeapYearTest, leapYear) {
EXPECT_TRUE(IsLeapYear(2000)); EXPECT_TRUE(IsLeapYear(1996)); }
TEST(IsLeapYearTest, commonYear)
{
ቤተ መጻሕፍቲ ባይዱ
EXPECT_FALSE (IsLeapYear(1999));
#include <gtest/gtest.h>
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } RUN_ALL_TESTS 是 gtest 实现的一个宏,使用这个宏,gtest 会自动收集所有的测试用 例并运行,不需要我们对测试用例进行管理。 gtest 除了为我们提供自动用例收集以及各种断言外,还为我们提供了测试夹具,参数 化等功能。若读者需要了解更多内容,可阅读《软件单元测试入门与实践》第 6 章。
相关文档
最新文档