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提供的ASSERT
和EXPECT
宏来确定测试用例的结果是否符合预期。如果测试用例失败,gtest将在控制台输出失败信息,帮助开发者进行调试。
基本断言语法
gtest提供了最基础、最主要的两种断言语法ASSERT
和EXPECT
。其中,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进行编译,运行测试如下:
Comments | NOTHING