簡體   English   中英

如何在google測試中測試多線程?

[英]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 0return

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM