Google Test的安装与使用

Google Test简介

  Google Test是C++的一个流行的测试框架,也被称为Google's C++ Testing Framework,简称为gtest,可以帮助开发者编写自动化的、可重复的、可维护的测试用例,测试程序的正确性。它是一个开源项目,在GitHub上有详细的介绍和文档。
  Google Test的特点如下:
  1.简单易用:Google Test被设计成易于使用、易于获取和易于学习的工具。
  2.全面的测试功能:Google Test提供了许多测试功能,包括自定义断言和参数化测试等。开发者可以使用这些功能来测试他们的代码。
  3.可重复的测试:Google Test可以多次运行相同的测试用例,并验证结果是否一致。这可以帮助开发者识别回归问题,确保代码的稳定性和正确性。
  4.具有扩展性:Google Test可以轻松扩展来支持特定的测试需求和测试组织方式。
  5.与其他工具的无缝集成:Google Test可以与许多其他开发工具集成,例如CMake、Visual Studio和Eclipse等。
  Google Test支持多种测试类型,包括单元测试、集成测试和函数测试等。它也支持多种平台,如Windows、Linux、macOS等。

断言--Assertions

  使用gtest编写测试用例需要按照一定的语法格式来写测试用例。测试用例由多个测试组成,每个测试包括测试用例名称和测试用例实现。编写gtest测试用例的基本操作是编写断言(Assertions),即使用gtest提供的ASSERTEXPECT宏来确定测试用例的结果是否符合预期。如果测试用例失败,gtest将在控制台输出失败信息,帮助开发者进行调试。

基本断言语法

  gtest提供了最基础、最主要的两种断言语法ASSERTEXPECT。其中,ASSERT会再判定失败时立刻停止当前函数的执行;EXPERT判定失败时会产生提示,但不停止当前函数。基本的ASSERT和EXPECT的语法如下表所示:  

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

  另外,对于这两种断言宏,gtest允许使用<<运算符输出自定义的错误信息,如下所示:

ASSERT_EQ(x.size(),y.size())<<"Vector x and y are of unequal length";
for(int i=0;i<x.size();i++){
    EXPECT_EQ(x[i],y[i])<<"Vector x and y differ at index "<<i;
}

  需要注意的是:任何可以传给ostream的对象都可以传给断言宏,比如C风格字符串或者string对象,但是仅支持UTF-8字符编码。

二元比较语法

  gtest也提供了二元比较语法,如下表所示:

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

  其中,EQ表示等于(Equal),NE表示不等于(Not equal),LT表示小于(Less than),LE表示(Less than or equal to),GT表示(Great than),GE表示(Great than or equal to)。
  二元比较语法的参数必须是可比较的,否则会编译出错。ASSERT_EQ如果用于比较指针,那么只会比较两个指针的值是不是相等。对于字符串而言,gtest提供了专门用于c风格字符串的二元比较语法,如下所示:

Fatal assertion Nonfatal assertion Verifies
ASSERT_STREQ(str1,str2) EXPECT_STREQ(str1,str2) 两个字符串有相同的内容
ASSERT_STRNE(str1,str2) EXPECT_STRNE(str1,str2) 两个字符串有不同的内容
ASSERT_STRCASEEQ(str1,str2) EXPECT_STRCASEEQ(str1,str2) 两个字符串有相同的内容,忽略大小写
ASSERT_STRCASENQ(str1,str2) EXPECT_STRCASENQ(str1,str2) 两个字符串有不同的内容,忽略大小写

  需要注意的是:如果想要判断字符串是不是空字符串,那么可以使用ASSERT_EQ(c_string, NULL),如果使用C++11标准那么建议使用ASSERT_EQ(c_string, nullptr)。另外,空指针和空字符串判定时认为是不相同的。

Google Test安装

源码编译

  gtest可以通过源码编译的方法进行安装使用,具体可以参见官方文档

vcpkg安装

  最简单的方式就是使用vcpkg进行安装,vcpkg的安装和使用方法戳这里
  鉴于本文在64位的windows操作系统中使用mingw编译器编写使用示例,因此本文使用以下命令进行安装:

vcpkg install gtest:x64-mingw-dynamic

Google Test使用

  使用示例中分别创建两个需要测试的函数,int add(int a,int b)char* catString(char* dest,const char* src),用于测试基础的断言语法和字符串断言语法。

文件组织结构

  这个示例使用CMake进行编译,文件组织结构如下所示:

.
|-- CMakeLists.txt
|-- src
|   |-- add.h
|   |-- add.cpp
|   |-- catString.h
|   `-- catString.cpp
|-- test
|   |-- test_add.cpp
|   `-- test_catString.cpp
`-- vcpkg

  其中,主要的文件内容如下所示:
  CMakeLists.txt文件:

set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake"
  CACHE STRING "Vcpkg toolchain file")
set(VCPKG_TARGET_TRIPLET "x64-mingw-dynamic" CACHE STRING "Vcpkg target triplet") 

cmake_minimum_required(VERSION 3.10)
project(Demo)

include_directories(src)
add_executable(test_add test/test_add.cpp src/add.cpp)
add_executable(test_catString test/test_catString.cpp src/catString.cpp)

find_package(GTest CONFIG REQUIRED)
target_link_libraries(test_add PRIVATE GTest::gtest GTest::gtest_main)
target_link_libraries(test_catString PRIVATE GTest::gtest GTest::gtest_main)

enable_testing()
add_test(NAME TEST_add COMMAND test_add)
add_test(NAME TEST_catString COMMAND test_catString)

  test_add.cpp文件:

#include<gtest/gtest.h>
#include "add.h"

TEST(AddTest, PositiveNos) { 
    EXPECT_EQ(2, add(1, 1));
    EXPECT_EQ(10, add(5, 5));
    EXPECT_EQ(100, add(50, 50));
}

TEST(AddTest, NegativeNos) {
    EXPECT_EQ(-2, add(-1, -1));
    EXPECT_EQ(-10, add(-5, -5));
    EXPECT_EQ(-100, add(-50, -50));
    EXPECT_EQ(-20, add(-50, 30));
}

int main(){
    testing::InitGoogleTest();
    return RUN_ALL_TESTS();
}

  test_string.cpp文件:

#include "gtest/gtest.h"
#include "catString.h"

TEST(catString, catString){
    char* str = catString("Hello ", "World!");
    EXPECT_STREQ(str, "Hello World!");
    delete[] str;
}

TEST(catString, catStringWithFirstParamEmptyString){
    char* str = catString("", "World!");
    EXPECT_STREQ(str, "World!");
    delete[] str;
}

TEST(catString, catStringWithSecondParamEmptyString){
    char* str = catString("Hello", "");
    EXPECT_STREQ(str, "Hello ") << "EXPECT_RESAULT: Hello\n";    //错误断言
    delete[] str;
}

int main(){
    testing::InitGoogleTest();
    return RUN_ALL_TESTS();
}

  测试样例中,创建了正数相加和负数相加的用例测试add函数,创建了字符串连接的用例测试catString函数。在字符串函数的测试中,编写了一个错误的断言用于输出错误信息。

编译与测试

  在VS Code中使用CMake进行编译,运行测试如下:


当珍惜每一片时光~