日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gtest:事件

發布時間:2023/12/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gtest:事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

有時候在測試的時候,我們會在測試前做一些初始化活動,和測試后做一些清理工作,gtest提供了多種事件機制,非常方便我們在案例之前或之后做一些操作。總結一下gtest的事件一共有3種:

  • 全局的,所有案例執行前后。
  • TestSuite級別的,在某一批案例中第一個案例前,最后一個案例執行后。
  • TestCase級別的,每個TestCase前后。
  • 接下來按照倒敘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 Code

    sample-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

    總結

    以上是生活随笔為你收集整理的Gtest:事件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。