LoginSignup
1

More than 5 years have passed since last update.

【Qt】非同期なEventをテストしたい

Posted at

それっぽいテストができるようになりましたが、方法がシックリきていません…。
マサカリが投げ込まれることを、心より望んでおります。

やりたいこと

UDPでデータを受信できることをテストしたいです。
テスティングフレームワークにはgoogletestを使用します。

  TEST_F(UdpRecieverTest, SocketReadReady)
  {
    QUdpSocket reciever;
    reciever.bind(QHostAddress::LocalHost, 45454);

    QUdpSocket sender;
    QByteArray datagram = "message";
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);

    // recieverにデータが届いたことをテストする
  }

とりあえずできたこと

recieverにデータが届くと、readReadyシグナルを受信できることをテストできました。
実装は次の通り。

【main.cpp】
main()内でQCoreApplicationを初期化し、Event loopを作成できるようにします。

#include <gtest/gtest.h>
#include <QCoreApplication>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

【UdpRecieverTest.cpp】
(1) QtテスティングフレームワークのQSignalSpyを使って、recieverのreadyRead()をスパイします。
(2) spy.wait()でEvent loopを開始し、シグナルをキャッチした(trueが返る)ことをテストします。
(3) spy.count()で、シグナルをちょうど1回キャッチしたことをテストします。

  TEST_F(UdpRecieverTest, SocketReadReady)
  {
    QUdpSocket reciever;
    reciever.bind(QHostAddress::LocalHost, 45454);
    QSignalSpy spy(&reciever, SIGNAL(readyRead())); // (1)

    QUdpSocket sender;
    QByteArray datagram = "message";
    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);

    EXPECT_TRUE(spy.wait(1000)); // (2)
    EXPECT_EQ(1, spy.count()); // (3)
  }

このテストはパスします。

気になっている点

    sender.writeDatagram(datagram.data(), datagram.size(),
                         QHostAddress::LocalHost, 45454);
// ↑
// この間にreadyRead()シグナルが発生すると、wait()がtimeoutするのでは?
// ↓
    EXPECT_TRUE(spy.wait(1000));

本当はこうするべき?

spyを別スレッドに移して、wait()かけてから、writeDatagram()を呼べば良い気がしますが、
wait()でタイムアウトするようになってしまいました…。

うーむ…。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1