Gtest:事件
前言
有時候在測試的時候,我們會在測試前做一些初始化活動,和測試后做一些清理工作,gtest提供了多種事件機制,非常方便我們在案例之前或之后做一些操作。總結一下gtest的事件一共有3種:
接下來按照倒敘3→2→1介紹如何使用事件機制
TestCase事件?
TestCase事件是掛在每個案例執行前后的,實現方式和上面的幾乎一樣,不過需要實現的是SetUp方法和TearDown方法:
1. SetUp()方法在每個TestCase之前執行
2. TearDown()方法在每個TestCase之后執行
演示代碼(Linux環境)
main.cpp
#include "sample-inl.h" #include "gtest/gtest.h" namespace {class QueueTestSmpl : public testing::Test {protected:virtual void SetUp() {//q0_.Enqueue(1);q1_.Enqueue(1);q1_.Enqueue(2);q2_.Enqueue(3);}virtual void TearDown() {}static int Double(int n) {return 2 * n;}// A helper function for testing Queue::Map().void MapTester(const Queue<int> * q) {// Creates a new queue, where each element is twice as big as the// corresponding one in q.const Queue<int> * const new_q = q->Map(Double);// Verifies that the new queue has the same size as q.ASSERT_EQ(q->Size(), new_q->Size());// Verifies the relationship between the elements of the two queues.for (const QueueNode<int>*n1 = q->Head(), *n2 = new_q->Head();n1 != nullptr; n1 = n1->next(), n2 = n2->next()) {EXPECT_EQ(2 * n1->element(), n2->element());}delete new_q;}// Declares the variables your tests want to use.Queue<int> q0_;Queue<int> q1_;Queue<int> q2_;};// Tests Dequeue(). TEST_F(QueueTestSmpl, Dequeue) {int * n = q0_.Dequeue();EXPECT_TRUE(n == nullptr);n = q1_.Dequeue();ASSERT_TRUE(n != nullptr);EXPECT_EQ(1, *n);EXPECT_EQ(1u, q1_.Size());delete n;n = q1_.Dequeue();ASSERT_TRUE(n != nullptr);EXPECT_EQ(2, *n);EXPECT_EQ(0u, q1_.Size());delete n;n = q2_.Dequeue();ASSERT_TRUE(n != nullptr);EXPECT_EQ(3, *n);EXPECT_EQ(0u, q2_.Size());delete n;} } // namespace View Codesample-inl.h
#ifndef GTEST_SAMPLES_SAMPLE_INL_H_ #define GTEST_SAMPLES_SAMPLE_INL_H_#include <stddef.h>template <typename E> // E is the element type class Queue;template <typename E> // E is the element type class QueueNode {friend class Queue<E>;public:// Gets the element in this node.const E& element() const { return element_; }// Gets the next node in the queue.QueueNode* next() { return next_; }const QueueNode* next() const { return next_; }private:// Creates a node with a given element value. The next pointer is// set to NULL.explicit QueueNode(const E& an_element): element_(an_element), next_(nullptr) {}// We disable the default assignment operator and copy c'tor.const QueueNode& operator = (const QueueNode&);QueueNode(const QueueNode&);E element_;QueueNode* next_; };template <typename E> // E is the element type. class Queue { public:// Creates an empty queue.Queue() : head_(nullptr), last_(nullptr), size_(0) {}// D'tor. Clears the queue.~Queue() { Clear(); }// Clears the queue. void Clear() {if (size_ > 0) {// 1. Deletes every node.QueueNode<E>* node = head_;QueueNode<E>* next = node->next();for (; ;) {delete node;node = next;if (node == nullptr) break;next = node->next();}// 2. Resets the member variables.head_ = last_ = nullptr;size_ = 0;}}size_t Size() const { return size_; }QueueNode<E>* Head() { return head_; }const QueueNode<E>* Head() const { return head_; }QueueNode<E>* Last() { return last_; }const QueueNode<E>* Last() const { return last_; }void Enqueue(const E& element) {QueueNode<E>* new_node = new QueueNode<E>(element);if (size_ == 0) {head_ = last_ = new_node;size_ = 1;}else {last_->next_ = new_node;last_ = new_node;size_++;}}E* Dequeue() {if (size_ == 0) {return nullptr;}const QueueNode<E>* const old_head = head_;head_ = head_->next_;size_--;if (size_ == 0) {last_ = nullptr;}E* element = new E(old_head->element());delete old_head;return element;}template <typename F>Queue* Map(F function) const {Queue* new_queue = new Queue();for (const QueueNode<E>* node = head_; node != nullptr;node = node->next_) {new_queue->Enqueue(function(node->element()));}return new_queue;}private:QueueNode<E>* head_; // The first node of the queue.QueueNode<E>* last_; // The last node of the queue.size_t size_; // The number of elements in the queue.// We disallow copying a queue.Queue(const Queue&);const Queue& operator = (const Queue&); };#endif // GTEST_SAMPLES_SAMPLE3_INL_H_ View Code?
TestSuite事件
這個相對來說比較簡單,相對上面的實現就是替換成靜態的SetUpTestCase,代碼
class FooTest : public testing::Test {protected://準備資源static void SetUpTestCase() {shared_resource_ = new ;}//釋放資源static void TearDownTestCase() {delete shared_resource_;shared_resource_ = NULL;}// 資源static T* shared_resource_; };
全局事件
也是很簡單的,就是繼承于testing::Environment而已。
class FooEnvironment: public testing::Environment {public:virtual void SetUp(){printf("Environment SetUp!\n");a = 100;}virtual void TearDown(){printf("Environment TearDown!\n");}int a; //共享數據 }; FooEnvironment* foo_env; //對象指針聲明 TEST(firstTest, first) //訪問共享數據并改變它的值 {printf("in the firstTest, foo_env->p is %d\n", foo_env->a);foo_env->a ++; } TEST(secondTest, second) //訪問共享數據 {printf("in the secondTest, foo_env->p is %d\n", foo_env->a); } int main(int argc, char* argv[]) {foo_env = new FooEnvironment;testing::AddGlobalTestEnvironment(foo_env); //注冊testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS(); }
轉載于:https://www.cnblogs.com/kelamoyujuzhen/p/10229941.html
總結
- 上一篇: 从集合中查找最值得方法——max(),m
- 下一篇: 对象池的简单使用