站点图标

软件测试 01 使用Google Test进行C++单元测试

一、如何使用Gtest

    VS2019内置了Gtest,只需要在创建项目时选择Gtest项目即可。
    官方指南:GoogleTest User’s Guide

二、快速上手

    我们需要的头文件:

#include "gtest/gtest.h"

    使用模板vs会为你创建pch.h和pch.cpp文件,上述引用已包含,同时已经为你生成test.cpp文件。下面让我们开始写我们的测试程序:

2.1 测试代码的主函数

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

    上面就是我们测试程序主函数运行需要的基本函数,一个初始化、一个返回(运行测试)。下面让我来写一个简单的被测函数。

2.2 被测函数

int Plus5(const int& p)
{
    return p + 5;
}

    在完成这一步之后,我们可以尝试写一个测试函数来测试我们的被测代码。

2.3 测试程序

TEST(TestCaseName, TestName)
{
    int ParaNum(5), ExpNum(10);
    EXPECT_EQ(ExpNum, Plus5(ParaNum));
}

    关于Assert和Expect的部分将放在文章最后,下面是它们完整的样子:

#include "pch.h"

int Plus5(const int& p)
{
    return p + 5;
}

TEST(TestCaseName, TestName)
{
    int ParaNum(5), ExpNum(10);
    EXPECT_EQ(ExpNum, Plus5(ParaNum));
}

int main(int argc, char* argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

    接下来我们可以直接运行,输出如上图所示:

[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from TestCaseName
[ RUN      ] TestCaseName.TestName
[       OK ] TestCaseName.TestName (0 ms)
[----------] 1 test from TestCaseName (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (18 ms total)
[  PASSED  ] 1 test.

    这样,我们就完成了我们的第一个单元测试。可视化方案:打开菜单 测试->Windows->测试资源管理器。

三、Gtest的断言

    gtest 使用一系列断言的宏来检查值是否符合预期,主要分为两类:ASSERT 和 EXPECT。区别在于 ASSERT 不通过的时候会认为是一个 fatal 的错误,退出当前函数(只是函数)。而 EXPECT 失败的话会继续运行当前函数,所以对于函数内几个失败可以同时报告出来。通常我们用 EXPECT 级别的断言就好,除非你认为当前检查点失败后函数的后续检查没有意义。

3.1 基础断言

Fatal Assertion Nonfatal assertion Verifies
ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition is true
ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition is false

3.2 二元比较

Fatal Assertion Nonfatal assertion Verifies
ASSERT_EQ(val1, val2); EXPECT_EQ(val1, val2); val1 == val2
ASSERT_NE(val1, val2); EXPECT_NE(val1, val2); val1 != val2
ASSERT_LT(val1, val2); EXPECT_LT(val1, val2); val1 < val2
ASSERT_LE(val1, val2); EXPECT_LE(val1, val2); val1 <= val2
ASSERT_GT(val1, val2); EXPECT_GT(val1, val2); val1 > val2
ASSERT_GE(val1, val2); EXPECT_GE(val1, val2); val1 >= val2

3.3 字符串比较

Fatal Assertion Nonfatal assertion Verifies
ASSERT_STREQ(str1,str2); EXPECT_STREQ(str1,str2); the two C strings have the same content
ASSERT_STRNE(str1,str2); EXPECT_STRNE(str1,str2); the two C strings have different content
ASSERT_STRCASEEQ(str1,str2); EXPECT_STRCASEEQ(str1,str2); the two C strings have the same content, ignoring case
ASSERT_STRCASENE(str1,str2); EXPECT_STRCASENE(str1,str2); the two C strings have different contents, ignoring case
退出移动版