googletest--Test Fixture

前面博客中我们在单元测试之前会做一些变量初始化等工作,而同一个testcase的不同test之间往往会有一些初始化工作是相同的。我们不想做多余的重复的工作,当然同时也不想设置全局变量。

这个时候我们可以使用Test Fixture。

所谓Test Fixture就是一个类,其包含了公共的设置代码和数据。它必须从googletest的testing命名空间中的Test类派生而来

#include <gtest/gtest.h>
#include "MyStack.h"

class MyStackTest : public ::testing::Test {
protected:                    // 公有或者保护类型.  不能是私有的
    virtual void SetUp() {   // 在构造函数之后,测试执行之前执行
        st.push(34);
        st.push(28);
        st.push(56);
    }
    virtual void TearDown() {  //在测试结束后,析构函数之前执行
    }

    MyStackTest() {
        std::cout << "MyStackTest is constructed." << std::endl;
        st.push(22);
    }
    ~MyStackTest() {
        std::cout << "Destructing MyStackTest." << std::endl;
    }

    MyStack st;
};


// 使用Test Fixture的测试
TEST_F(MyStackTest, testPop) {  // 第一个参数是test fixture的类名
    int val = st.pop();    // test fixture可以在内部访问
    EXPECT_EQ(56, val);

    EXPECT_EQ(54, val) << "This value must be 56";

    EXPECT_EQ(54, val) << "This value cannot be different from " << val;

    EXPECT_EQ(54, val) << "Let's see what is inside st: " << st;
}

/* 
    问题:  应该使用构造/析构函数还是SetUp()/TearDown()?

    1. 作为指导原则, 构造函数应该做最少的事情使对象处于一个合法的状态,析构函数应该做构造函数相反的事情
    2. 如果函数是虚的,将其放入Setup()/TearDown()中
    3. 如果可能抛出异常,将代码放入TearDown(), 而不是析构函数
    4. 将gtest assertions放在TearDown()中, 而不是析构函数
*/

注意MyStack中需要重载输出运算符

// MyStack.h类声明中
friend  std::ostream  &operator<<(std::ostream &, const MyStack&);

//
MyStack.cpp std::ostream &operator<<(std::ostream& os, const MyStack& st) { return os << st.toString(); }
原文地址:https://www.cnblogs.com/logchen/p/10259958.html