gtest测试框架

发布时间 2023-09-22 17:30:03作者: ray963

GoogleTest简单使用

googleTest是谷歌公司发布的一个跨平台的C++单元测试框架

两种断言

  • 致命断言ASSERT_*:当断言失败时,产生致命错误,并终止当前函数
  • 非致命断言EXPECT_*:当断言失败时,产生非致命错误,并不会终止当前函数

常用的断言

ASSERT EXPECT Verifies
ASSERT_TRUE(condition) EXPECT_TRUE(condition) condition is true
ASSERT_FALSE(condition) EXPECT_FALSE(condition) condition is 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

TEST使用

#include "gtest/gtest.h"

int Factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++)
        result *= i;
    return result;
}

//使用宏TEST(TestSuitName, TestName),组织不同场景的cases
//1. 负数case
TEST(FactorialTest, Negative) {
    EXPECT_EQ(1, Factorial(-5));
    EXPECT_EQ(1, Factorial(-1));
}
//2. 正数case
TEST(FactorialTest, Positive) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(1, Factorial(2)) << "Failed: xxxx"; //通过<<可以在断言出错时打印信息
}

//运行所有的case
int main(int argc, char *argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

TEST_F使用

test fiture是在gtest中为每个TEST都执行一些同样的操作,这样就可以避免每个TEST中重复的冗余过程。

要使用TEST_F,首先需要定义一个TestFixture类,该类需要继承testing::Test,同时需要实现以下两个虚函数和两个静态函数:

  • virtual void SetUp():在每个TEST_F测试案例运行前都会运行一次
  • virtual void TearDown():在每个TEST_F结束后都会运行一次
  • static void SetUpTestSuit:在第一个测试案例运行之前运行
  • static void TearDownTestSuit():在最后一个测试案例运行之后运行
#include <gtest/gtest.h>

class MyTestFixture : public testing::Test {
protected:
    // 在此处定义测试夹具的设置和清理代码
    void SetUp() override {
        // 在每个测试用例运行之前执行
        // 可以在这里初始化共享资源
    }

    void TearDown() override {
        // 在每个测试用例运行之后执行
        // 可以在这里清理共享资源
    }

    // 可以添加其他成员函数和成员变量
};

TEST_F(MyTestFixture, Test1) {
    // 在这里编写测试代码,可以使用测试夹具中的资源
    ASSERT_EQ(2 + 2, 4);
}

TEST_F(MyTestFixture, Test2) {
    // 在这里编写另一个测试,可以使用相同的测试夹具
    ASSERT_TRUE(true);
}

int main(int argc, char *argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}