GTest原始碼剖析(三) TEST F巨集

2021-08-08 09:53:54 字數 3231 閱讀 1041

test_f巨集作用參考

test_f巨集和test巨集的實現非常接近,只是test_f巨集的封裝更加開放一些,所以對test巨集的功能多了一些擴充套件。

詳細見gtest原始碼剖析——test巨集

#define

test_f(test_fixture, test_name)

gtest_test_(test_fixture, test_name, test_fixture,

::testing

::internal

::gettypeid

())

//step1

#if !gtest_dont_define_test

# define test(test_case_name, test_name) gtest_test(test_case_name, test_name)

#endif

//step2

#define gtest_test(test_case_name, test_name)

gtest_test_(test_case_name, test_name,::testing::test, ::testing::internal::gettesttypeid())

eg:

test(call,makecall);

test_f(call,makecall);

1.3.1 拼接類對比

區別在於:

test巨集中的拼接類call_makecall_test繼承於test類;

test_f巨集中的拼接類call_makecall_test繼承於call類;

即相對於test巨集,test_f可以覆蓋test類中的虛函式setup()和teardown()。

test巨集:

class call_makecall_test : public ::testing::test    

;

test_f巨集:

class call_makecall_test : public ::testing::call    

;

1.3.2 呼叫makeandregistertestinfo()傳參對比

區別在於:

test巨集: 傳入makeandregistertestinfo()的引數為::testing::test::setuptestcase和::testing::test::teardowntestcase。

test_f巨集: 傳入makeandregistertestinfo()的引數為call::setuptestcase和call::teardowntestcase。

即相對於test巨集,test_f可以定義自己的setuptestcase和teardowntestcase。

test巨集:

::testing

::testinfo

* const call_makecall_test::test_info_

=::testing

::internal

::makeandregistertestinfo(

"call",

"makecall",

null,

null,

::testing

::internal

::codelocation(__file__, __line__),

::testing

::internal

::gettesttypeid(),

::testing

::test

::setuptestcase,

::testing

::test

::teardowntestcase,

new::testing

::internal

::testfactoryimpl

);

test_f巨集:

::testing

::testinfo

* const call_makecall_test::test_info_

=::testing

::internal

::makeandregistertestinfo(

"call",

"makecall",

null,

null,

::testing

::internal

::codelocation(__file__, __line__),

::testing

::internal

::gettesttypeid(),

call::setuptestcase,

call::teardowntestcase,

new::testing

::internal

::testfactoryimpl

);

setuptestcase()方法在testcase的第乙個test之前執行.

teardowntestcase()方法在testcase的最後乙個test之後執行.

在testcase為call的測試用例中,可以共享_callserver,可以跨越多個test。

class call : public testing::test 

static

void teardowntestcase()

static callserver* _callserver;

};

setup()方法在每個test之前執行

teardown()方法在每個test之後執行

在testcase為call的測試用例中,可以共享_callinfo,setup會在下乙個test重新呼叫,所以逐個對每乙個test生效。

class call : public testing::test 

virtual

void teardown()

callinfo* _callinfo;

};

github: googletest

zhaipillar

2017-09-16

Azureus原始碼剖析(三)

接著第一篇 的工作,本篇繼續分析種子檔案監聽伺服器的實現細節。先簡單描述下其工作流程,首先伺服器在 6880 埠處開啟乙個套接字監聽,然後開啟乙個守護執行緒用於處理到來的 開啟種子檔案列表 請求,在這個服務執行緒中不斷迴圈讀取來自客戶的請求,對 torrent 檔案列表進行解析。如果此時 azure...

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...

libevent原始碼深度剖析三

libevent基本使用場景和事件流程 張亮學習源 該從 入手?我覺得從程式的基本使用場景和 的整體處理流程入手是個不錯的方法,至少從個人的經驗上講,用此方法分析libevent是比較有效的。基本應用場景也是使用libevnet的基本流程,下面來考慮乙個最簡單的場景,使用livevent設定定時器,...