欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

谷歌测试框架基础及进阶

程序员文章站 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 assertionNonFatal 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 参考文章

Google 单元测试框架

googletest官方文档

相关标签: Apollo perception