【问题标题】:How to test client-server flows with boost::test如何使用 boost::test 测试客户端-服务器流
【发布时间】:2017-03-18 01:15:18
【问题描述】:

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

#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 这样下一个测试根本不做任何事情并退出。服务器测试启动相同的测试可执行文件,run_test arg 设置为仅运行客户端测试。在第二个进程中testingClient 标志没有翻转,这使它实际运行客户端测试。

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

【问题讨论】:

  • 看来你绝对可以使用fixtures
  • 我们使用它们,但这对我来说无济于事。它与启动单独的进程没有关系(我不能在同一个进程中运行它们)

标签: unit-testing boost boost-test


【解决方案1】:

如前所述,夹具将帮助您:

  • 在测试前设置服务器
  • 测试后杀死此服务器

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

出于各种原因,我会避免按照您的建议使用不同的参数调用相同的测试模块:

  • 服务器实际上不是测试:如果您在没有例如的情况下运行测试模块。命令行上的任何参数,然后此服务器将运行,这是您要在测试之外避免的事情
  • 您对服务器的生命周期没有/几乎没有控制权,而且很难通过一次测试来检查服务器是否实际运行

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多