【gtest】Visual Studio 2019 单元测试学习Google Test

发布时间 2023-06-16 15:41:57作者: 街角_祝福

前言

记录在VS2019中使用自带的Google Test进行单元测试的方法和经验

项目介绍

总共2个项目,Work为项目工程,TestWorkWork工程的单元测试工程,TestWork依赖于Work工程,但是Work不依赖TestWorkTestWorkWork的旁路辅助工程,用于对代码的检查和测试。

创建项目

  • 创建C++的常规Work工程
  • 新增创建Google Test的单元测试工程


    创建完项目后,工程项目情况如下(可将TestWork设置为启动项目,右键TestWork->Set as Startup Project):

编写项目代码

准备测试类和常规函数

【工作项目】点击查看代码
/*** test.h文件内容 ***/
#pragma once
#include <string>
#include <windows.h>
#include <chrono>

int Snprintf(char* pBuf, int nBuf, const char* pFormat, ...);
std::string GbkToUtf8(const char* pSrc, int nLen);
std::string Utf8ToGbk(const char* pSrc, int nLen);
std::string GetFileText(const char* file);
void WriteFile(const char* file, const char* dat, size_t len);

/// <summary>
/// 时间差
/// </summary>
/// <param name="start"></param>
/// <param name="end"></param>
/// <returns></returns>
std::chrono::microseconds ClockSpan(std::chrono::steady_clock::time_point start, std::chrono::steady_clock::time_point end);
/// <summary>
/// 当前时间
/// </summary>
/// <returns></returns>
std::chrono::steady_clock::time_point GetNowClock();

/** utils.h文件内容 ***/
#pragma once
class utils
{
public:
    int     Add(int a, int b);
    bool    IsEmpty(const char* s);
};

单元测试项目设置

因为单元测试是辅助类项目,原Work不依赖于单元测试项目,因此单元测试项目必须是无侵入式引用Work项目,方式如下:

  • 源代码引用,包括头文件,如:
#include "pch.h"
#include "..\text.h"
#include "..\utils.h"

也可通过设置【配置属性 - C/C++ - 常规 - 附加包含目录】配置项目目录,便于包含头文件

  • 链接库引用,因原项目不一定式静态库,因此仅包含头文件时会在链接时找不到引用的函数符号,因此对于需要引用的函数,需要链接其定义的obj文件,TestWork项目【属性-链接器-输入-附加依赖项】,如:

编写单元测试代码

#include "pch.h"
#include "..\text.h"
#include "..\utils.h"

TEST(TestCaseName, TestName) {
      EXPECT_EQ(1, 1);
      EXPECT_TRUE(true);
}

TEST(Work, WorkUtil)
{
    utils us;

    EXPECT_TRUE(us.IsEmpty(NULL));
    EXPECT_TRUE(us.IsEmpty(""));
    EXPECT_TRUE(!us.IsEmpty(" "));

    EXPECT_EQ(1, us.Add(1, 0));
    EXPECT_EQ(2, us.Add(3, -1));
}

TEST(Work, WorkText)
{
    char buf[256];
    Snprintf(buf, sizeof(buf), "您好,China %d!", 2023);
    EXPECT_EQ(0, strcmp(buf, "您好,China 2023!"));

    std::string s;
    std::string strGbk = "中国·西藏●默罕默德③代";
    std::string strUtf8 = GbkToUtf8(strGbk.c_str(), strGbk.size());
    EXPECT_EQ(0, strGbk.compare(Utf8ToGbk(strUtf8.c_str(), strUtf8.size())));

    auto tNow = GetNowClock();
    Sleep(100);
    auto tNow100 = GetNowClock();
    EXPECT_EQ(ClockSpan(tNow, tNow100).count(), 100);
}

执行结果:

Running main() from c:\a\_work\32\s\thirdparty\googletest\googletest\src\gtest_main.cc
[==========] Running 3 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 1 test from TestCaseName
[ RUN      ] TestCaseName.TestName
[       OK ] TestCaseName.TestName (0 ms)
[----------] 1 test from TestCaseName (0 ms total)

[----------] 2 tests from Work
[ RUN      ] Work.WorkUtil
[       OK ] Work.WorkUtil (1 ms)
[ RUN      ] Work.WorkText
[       OK ] Work.WorkText (101 ms)
[----------] 2 tests from Work (103 ms total)

[----------] Global test environment tear-down
[==========] 3 tests from 2 test cases ran. (106 ms total)
[  PASSED  ] 3 tests.