谷歌测试框架基础及进阶
程序员文章站
2022-07-12 11:47:28
...
写这些主要是看Apollo代码里面看到这个了,之前虽然有所了解,但是没有涉及到Fixture的部分,了解了一下基础,看Apollo里面的测试用例代码就更明白了。
1 googletest安装
建议官方源码编译
git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build
cmake ..
make
sudo make install
2 简单示例
main.cpp
#include <gtest/gtest.h>
int add(int a, int b){
return a + b;
}
TEST(testCase, test0){
EXPECT_EQ(add(3, 4), 7); // ==
EXPECT_NE(add(3, 4), 7); // !=
EXPECT_LT(add(3, 4), 7); // <
EXPECT_LE(add(3, 4), 7); // <=
EXPECT_GT(add(3, 4), 7); // >
EXPECT_GE(add(3, 4), 7); // >=
}
int main(int argc,char **argv){
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
CMakeLists.txt
这里记得链pthread
PROJECT(test)
ADD_DEFINITIONS(-std=c++11)
SET(CMAKE_CXX_STANDARD 11)
include(GoogleTest)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} gtest pthread)
编译运行
mkdir test && cd test
touch main.cpp
touch CMakeLists.txt
mkdir build && cd build
cmake .. && make
./test
运行结果
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from testCase
[ RUN ] testCase.test0
/home/../gtest/main.cpp:9: Failure
Expected: (add(3, 4)) != (7), actual: 7 vs 7
/home/../gtest/main.cpp:10: Failure
Expected: (add(3, 4)) < (7), actual: 7 vs 7
/home/../gtest/main.cpp:12: Failure
Expected: (add(3, 4)) > (7), actual: 7 vs 7
[ FAILED ] testCase.test0 (0 ms)
[ RUN ] testCase.test1
[ OK ] testCase.test1 (0 ms)
[----------] 2 tests from testCase (0 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] testCase.test0
1 FAILED TEST
3 基本概念
3.1 断言
googleTest断言是类似于函数调用的宏。分为Fatal assertion
和NonFatal assertion
-
ASSERT_*
版本失败时会产生致命故障,并中止当前功能。 -
EXPECT_*
版本会产生非致命故障,不会导致当前功能中断。
通常EXPECT_*
是首选,因为它们允许在测试中报告多个故障。但是,ASSERT_*
如果在断言失败时继续执行没有意义,则应使用。
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | 条件为true |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | 条件为false |
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 |
ASSERT_STREQ(str1,str2); | EXPECT_STREQ(str1,str2); | 两个C字符串具有相同的内容 |
ASSERT_STRNE(str1,str2); | EXPECT_STRNE(str1,str2); | 两个C字符串具有不同的内容 |
ASSERT_STRCASEEQ(str1,str2); | EXPECT_STRCASEEQ(str1,str2); | 两个C字符串的内容相同,忽略大小写 |
ASSERT_STRCASENE(str1,str2); | EXPECT_STRCASENE(str1,str2); | 两个C字符串的内容不同,忽略大小写 |
3.2 TEST
TEST()的第一个参数是测试套件的名称,第二个参数是测试套件的测试名称。这两个参数都是自定义的有效C++标识符,简单示例中有详细例子。
TEST(套件名,用例名)
{
//套件名和用例名自定义
//断言语句
//如一般的c++ 函数,不 return value
}
4 进阶搭建
对于多个TEST用例要使用相同的数据时,每次在用例中准备比较麻烦,因此采用Fixture
来构建用例类,将对象的相同配置重新用于几个不同的测试。如下。
fixture_test.h
#include <iostream>
#include <queue>
#include <gtest/gtest.h>
using std::deque;
class QueueTest : public ::testing::Test {
protected:
// 准备测试用例数据,注意U大写
void SetUp() override {
q0_.emplace_back(1);
q1_.emplace_back(1);
q2_.emplace_back(2);
}
// 如有必要,编写一个析构函数或TearDown()函数以释放您在中分配的任何资源
void TearDown() override{
}
public:
QueueTest(){}
~QueueTest(){}
void IsEmptyInitially() {
EXPECT_EQ(q0_.size(), 0);
}
deque<int> q0_;
deque<int> q1_;
deque<int> q2_;
};
// way1
TEST_F(QueueTest, IsEmptyInitially1) {
QueueTest::IsEmptyInitially();
}
// way2
TEST_F(QueueTest, IsEmptyInitially2){
EXPECT_EQ(q0_.size(), 1);
}
运行这些测试时,将发生以下情况:
- googletest构造一个QueueTest对象(我们称之为t1)。
- t1.SetUp()初始化t1。
- 第一个测试(IsEmptyInitially)在上运行t1。
- t1.TearDown() 测试完成后清理。
- t1 被破坏了。
- 在另一个QueueTest对象上重复上述步骤,这次运行DequeueWorks测试。
5 参考文章
下一篇: 脚本编写