如何使用boost :: test测试客户端 - 服务器流

时间:2017-03-18 01:15:19

标签: unit-testing boost boost-test

目前我这样做(伪代码):

#include <boost/test/unit_test.hpp>
#include <string>

bool testingClient = true;

BOOST_AUTO_TEST_SUITE(ProtocolSchema)
BOOST_AUTO_TEST_CASE(server)
{
    testingClient = false;
    // start server listener
    FILE *client_stdout = popen((argv[0] + std::string(" --run_test=ProtocolSchema/client 2>&1")).c_str(), "r");
    for (1000ms)
    {
       // listen for ping, reply with a pong  
    }
    pclose(fl);
}

BOOST_AUTO_TEST_CASE(client)
{
    if (!testingClient)
        return;
    // send ping to the server
    // check that it replies with a pong
}
}

这个想法很明确:boost::test按顺序运行测试,一旦尝试运行服务器,服务器单元测试就会翻转testingClient,这样下一次测试就不会做任何事情并退出。 server test启动相同的测试可执行文件,run_test arg设置为仅运行客户端测试。在第二个过程testingClient标记未被翻转,这使它实际上运行客户端测试。

有没有一种正确的方法来使用boost :: test进行这种客户端 - 服务器单元测试?在我的情况下,客户端进程的所有测试日志记录都丢失了:我需要从client_stdout中将它们写入,然后将它们全部写入BOOST_MESSAGE?

1 个答案:

答案 0 :(得分:0)

如上所述,灯具会帮助你:

  • 在测试前设置服务器
  • 在测试后终止此服务器

设置服务器意味着您在fixture中启动另一个线程(跟踪该线程或任何让您与该线程通信的信令)。在测试期间,该线程应该是活动的。在夹具拆解中,只需发出线程信号即可退出。

由于各种原因,我会避免使用不同的参数调用相同的测试模块:

  • 服务器实际上不是测试:如果没有eg运行测试模块。在命令行上的任何参数,然后这个服务器将运行,这是你想要在测试之外避免的东西
  • 您没有/很少控制服务器生命周期,并且很难从一次测试中检查服务器是否实际运行

希望这有帮助