在Visual Studio中使用Google Test 测试c++代码


在Visual Studio 2017和更高版本中,Google Test已作为C ++桌面开发工作负载的默认组件集成到Visual Studio IDE中。要验证它是否已安装在您的计算机上,请打开Visual Studio安装程序,并在工作负载组件列表下找到Google Test:这里我使用的vs2019,win10系统。

在Visual Studio 2019中添加Google测试项目

  • 在解决方案资源管理器中,右键单击解决方案节点,然后选择“添加”>“新建项目”。
  • 将语言设置为C ++,然后在搜索框中键入test。 从结果列表中,选择Google Test Project。
  • 为测试项目命名,然后单击“确定”。
  • 配置测试项目

    在出现的“测试项目配置”对话框中,您可以选择要测试的项目。当您选择一个项目时,Visual Studio会将引用添加到所选项目。如果不选择任何项目,则需要手动添加对要测试的项目的引用。在静态和动态链接到Google Test二进制文件之间进行选择时,注意事项与任何C ++程序相同。

  • 这里我选择了自己的项目First Project。 

  • 设置其他选项

    在主菜单中,选择工具>选项> Google Test的测试适配器以设置其他选项。

  • 添加包含指令

    在您的测试.cpp文件中,添加所有需要的#include指令,以使程序的类型和功能对测试代码可见。通常,该程序在文件夹层次结构中为上一层。如果键入#include“ ../”,将出现IntelliSense窗口,使您可以选择头文件的完整路径。

  •  

     为了避免在源文件的每个include语句中键入完整路径,可以在Project > Properties > C / C ++ > General > Additional Include Directories中添加所需的文件夹,如下图所示。

    这样,就可以编写和运行Google测试了。

  • 使用gtest进行测试
  • 首先看一下gtest项目的结构:在新建gtest项目时,自动生成了pch.h和pch.cpp两个文件,如下图所示。这里对First Project项目下的a.h和a.cpp下的函数进行测试。
  • a.h中的函数为:判断两个字符串是不是兄弟字符串,即两个字符串只有顺序不一样,其他完全一样。

  • class brother {
    public:
        bool isBrotherStrs(string s1, string s2)
        {
            if (s1.size() != s2.size())
                return false;
            unordered_map<char, int> map;
            for (int i = 0; i < s1.size(); i++)
            {
                map[s1[i]]++;
            }
            for (int j = 0; j < s2.size(); j++)
            {
                if (map.find(s2[j]) == map.end())
                    return false;
                else
                    map[s2[j]]--;
            }
            for (int i = 0; i < s1.size(); i++)
            {
                if (map[s1[i]] != 0)
                    return false;
            }
            return true;
    
        }
    };

     测试代码如下:这里仅是测试其中的一种情况,并非全部测试用例。

  • #include 
    #include <string>
    #include "pch.h"
    //#include "../First Project/**.h"
    #include "../First Project/a.h"
    
    using namespace std;
    
    TEST(isBrotherStrs, case1) {
        brother a;
        bool res = a.isBrotherStrs("abc", "cba");
        EXPECT_EQ(1, a.isBrotherStrs("abc", "cba"));
        EXPECT_TRUE(res);
    }
    
    //:: testing :: InitGoogleTest()函数解析Google测试标志的命令行,
    //并删除所有已识别的标志。 这允许用户通过各种标志控制测试程序的行为.
    // 在调用RUN_ALL_TESTS()之前必须调用此函数,否则标志将无法正确初始化。
    int main(int argc, char** argv) {
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }

    然后将getst的测试项目(Sample-Test1)设置为启动项目运行结果如下: