google test

关键词解析

Test :普通意义上的测试的称谓。
Test Case: 早期用来表示多个相关Test的总称。
Test Suite:当前用来表示多个相关Test的总称。
所以1个Test Case或者Test Case可以包含一个或者多个Test,当前谷歌使用Test Suite来代替Test Case。
Test Fixtures:多个使用相同的数据或者配置的Test称为Test Fixtures。

Assertions

按效果google test有2种assertion

  • ASSERT_* 用来产生致命错误,当发生致命错误时将会终止当前的程序。ASSET_*有时会因为错误的发生而跳过clea-up 代码段导致内存泄漏,所以要注意到这一点。
  • EXPECT_* 用来产生非致命错误。
    当assertion发生时,除了可以打印文件名字和列号,用户可以使用<<操作来打印想要的信息,完全可以像使用标准输出流那样使用<<
ASSERT_EQ(x.size(), y.size()) <<"Vector x and Vector y are of  unequal length" ;
for (int i = 0; i < x.size(); ++i) {
  EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}

简单的Tests

test的一版格式为

TEST(TestSuiteName, TestName)
{
    ··· test body ···
}

TEST用来创建一个test,该函数实际上是一个宏,第一参数表示Test Suite的名字,第二个参数是Test的名字,这两个名字需要遵循c++命名规则,而且不能包含下划线。看一个完整点的demo。

int Factorial(int n);//求阶乘
// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(Factorial(0), 1);
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(Factorial(1), 1);
  EXPECT_EQ(Factorial(2), 2);
  EXPECT_EQ(Factorial(3), 6);
  EXPECT_EQ(Factorial(8), 40320);
}

FactorialTest是Test Suite, HandlesZeroInput和HandlesPositiveInput是Test, 这两个test都是处理一个数的阶乘的,所以是有相关性的。

Test Fixtures

多个Test使用相同的数据或者配置时,就可以使用Test Fixtures。
其一般格式为

TEST_F(TestSuiteName, TestName){
  ... test body ...
}

第一参数表示Test Suite的名字,第二个参数是Test的名字,这两个名字需要遵循c++命名规则,而且不能包含下划线,这里_F就是fixtures的简写。接着来看看Test Fixtures的工作流程。

template
class Queue{
public:
  Queue();
  void Enqueue(const E& element);
  E* Dequeue();
  size_t size() const;
};

class QueueTest : public ::testing::Test{
 protected:
    void SetUp() override {
        q1_.Enqueue(1);
        q2_.Enqueue(2);
        q2_.Enqueue(3);
    }
    void TearDown() override{}
    Queue q0_;
    Queue q1_;
    Queue q2_;
} 

TEST_F(QueueTest, IsEmptyInitially){
    EXPECT_EQ(q0_.size(), 0);
}

TEST_F(QueueTest, DequeueWorks)
{
    int *n = q0_Dequeue();
    EXPECT_EQ(n, nullptr);

    n = q1_.Dequeue();
    ASSERT_NE(n, nullptr);
    EXPECT_EQ(*n, 1);
    EXPECT_EQ(q1_.size(), 0);
    delete n;

  n = q2_.Dequeue();
  ASSERT_NE(n, nullptr);
  EXPECT_EQ(*n, 2);
  EXPECT_EQ(q2_.size(), 1);
  delete n;
}

以上就是创建test fixtures的过程,大概分为两部分

  • 创建test fixtures 类,该类必须以public的方式派生自::testing::Test, 在类中所有的成员必须是protected属性。可以定义一个SetUp函数初始化类对象,也可以定义一个TearDown函数用来释放SetUp申请的空间。SetUp/TearDown的功能也可以通过构造/析构函数来实现。
  • 使用TEST_F创建test fixtures测试。TEST_F的第一个参数必须和声明的test fixtrures类型名字相同。
    特别注意Test Suite的名字一定与Test Suite类的名字一样。比如QueueTest既是Test Suite的名字也是Test Suite类的名字。
    test fixtures定义指出多个test共享数据或者配置,这里共享的数据指的是test suite中定义的方法或者数据成员。实际上在运行test时会创建test类,该类继承了test suite类,所以这些类定义的类都能使用test suite中的成员。

一个完整的测试例程

#include "gtest/gtest.h"

namespace {

template
class Queue{
public:
  Queue();
  void Enqueue(const E& element);
  E* Dequeue();
  size_t size() const;
};

class QueueTest : public ::testing::Test{
 protected:
    void SetUp() override {
        q1_.Enqueue(1);
        q2_.Enqueue(2);
        q2_.Enqueue(3);
    }
    void TearDown() override{}
    Queue q0_;
    Queue q1_;
    Queue q2_;
} 

TEST_F(QueueTest, IsEmptyInitially){
    EXPECT_EQ(q0_.size(), 0);
}

TEST_F(QueueTest, DequeueWorks)
{
    int *n = q0_Dequeue();
    EXPECT_EQ(n, nullptr);

    n = q1_.Dequeue();
    ASSERT_NE(n, nullptr);
    EXPECT_EQ(*n, 1);
    EXPECT_EQ(q1_.size(), 0);
    delete n;

  n = q2_.Dequeue();
  ASSERT_NE(n, nullptr);
  EXPECT_EQ(*n, 2);
  EXPECT_EQ(q2_.size(), 1);
  delete n;
}
} //namespace

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

上面的代码就可以作为一个完整的测试框架。测试从main进入,先调用::testing::InitGoogleTest(&argc, argv);再调用RUN_ALL_TESTS();。InitGoogleTest解析输入的命令行,通过与google test的flag比较,决定执行什么样的动作。RUN_ALL_TESTS()会创建test对象,并运行test。

你可能感兴趣的:(google test)