![](/img/trans.png)
[英]What's the proper way using GTest to repeat a multi-threaded test multiple times?
[英]How to test multi-threaded in google test?
以下測試代碼創建服務器和clientocket。 然后客戶端向服務器和服務器回復發送消息。 就這樣。 但我無法編譯。 線程函數中的所有ASSERT_EQ
都會引發錯誤"error: void value not ignored as it ought to be"
。 我不知道這應該告訴我什么。 這里有什么問題? 類型與ASSERT_EQ(1, 1);
無關ASSERT_EQ(1, 1);
也引發了錯誤。
編輯在谷歌的常見問題解答中找到了這個:
問:我的編譯器抱怨“無法忽略空值,因為它應該是。” 這是什么意思?
答:你可能在一個不返回void的函數中使用ASSERT_XY()。 ASSERT_XY()只能在void函數中使用。
我怎么理解這個?
void * serverfunc(void * ptr);
void * clientfunc(void * ptr);
TEST(netTest, insert)
{
pthread_t mThreadID1, mThreadID2;
::pthread_create(&mThreadID1, nullptr, serverfunc, nullptr);
::sleep(1);
::pthread_create(&mThreadID1, nullptr, clientfunc, nullptr);
::pthread_join(mThreadID1, nullptr);
::pthread_join(mThreadID2, nullptr);
}
void * serverfunc(void * ptr)
{
net::ServerSocket serv(IPV4, TCP, 55555,5);
net::ServerSocket * conn = serv.accept();
net::Message msg;
conn->recvmsg(&msg);
ASSERT_EQ(msg.size(),5);
ASSERT_EQ(msg[0],1);
ASSERT_EQ(msg[1],2);
ASSERT_EQ(msg[2],3);
ASSERT_EQ(msg[3],4);
ASSERT_EQ(msg[4],5);
msg = {9,8,6};
ASSERT_EQ(msg.size(),3);
ASSERT_EQ(msg[0],9);
ASSERT_EQ(msg[1],8);
ASSERT_EQ(msg[2],6);
conn->sendmsg(msg);
::sleep(1);
delete conn;
return 0;
}
void * clientfunc(void * ptr)
{
net::ClientSocket clie(IPV4, TCP, "localhost",55555);
net::Message msg;
msg = {1,2,3,4,5};
ASSERT_EQ(msg.size(),5);
ASSERT_EQ(msg[0],1);
ASSERT_EQ(msg[1],2);
ASSERT_EQ(msg[2],3);
ASSERT_EQ(msg[3],4);
ASSERT_EQ(msg[4],5);
clie.sendmsg(msg);
clie.recvmsg(&msg);
ASSERT_EQ(msg.size(),3);
ASSERT_EQ(msg[0],9);
ASSERT_EQ(msg[1],8);
ASSERT_EQ(msg[2],6);
return 0;
}
問:我的編譯器抱怨“無法忽略空值,因為它應該是。” 這是什么意思?
答:你可能在一個不返回void的函數中使用ASSERT_XY()。 ASSERT_XY()只能在void函數中使用。
我怎么理解這個?
你的函數不返回void
,它們返回void*
- 即它們返回一些東西( void*
是一個指向任何東西的指針),而它們應該什么都不返回。 常見問題解答說,使用ASSERT_EQ()的函數需要具有void
返回類型。
我也有同樣的問題,我發現了一種“丑陋”的方法來解決它:
void* your_func(void* ptr)
{
_your_func(ptr);
reutrn NULL;
}
void _your_func(void* ptr)
{
...
ASSERT_EQ(1, 1);
...
}
看起來ASSERT_EQ只能在具有正確返回類型的函數中調用(當您返回void *時,它看起來是無效的)
我個人不喜歡宏過度使用,但這就是它的方式。 宏的問題是它混淆了代碼,所以你無法看到它做錯了什么。
所以只需編寫這樣的函數並獲取serverfunc和clientfunc來調用它。
至於建議,應更換void*
類型,請法void
,並return 0
與return
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.