【问题标题】:How can I start a TCP server in the background during a Perl unit test?如何在 Perl 单元测试期间在后台启动 TCP 服务器?
【发布时间】:2010-04-16 12:04:39
【问题描述】:

我正在尝试为客户端服务器应用程序编写单元测试。为了测试客户端,在我的单元测试中,我想首先启动我的 tcp 服务器(它本身是另一个 perl 文件)。我尝试通过分叉启动 TCP 服务器:

if (! fork()) {
    system ("$^X server.pl") == 0 or die "couldn't start server"
}

所以当我在perl Makefile.PL 之后调用make test 时,这个测试开始了,我可以看到服务器正在启动,但是之后单元测试就挂在那里了。所以我想我需要在后台启动这个服务器,最后我尝试了& 来强制它在后台启动,然后测试继续。但是,我还是没能成功。我究竟做错了什么?谢谢。

【问题讨论】:

    标签: perl unit-testing fork


    【解决方案1】:

    1 .试试Ether's suggestion from a similar Q

    使用 Proc::Daemon; # 在 fork 孩子之前做所有你需要做的事情...... # 进入守护进程;关闭所有打开的 fd Proc::守护进程::Init();

    2 。如果您使用IO::Socket 进行 TCP 连接(或任何其他模块 - CPAN 或您自己的),您应该真正使用模拟(例如Test::MockObject)来模拟实际的套接字通信。这样,您的客户端(或服务器的)测试将在测试时与另一段代码隔离(尽管您仍然需要服务器运行 - 但这次手动可以 - 记录初始的待模拟调用IO::Socket.

    【讨论】:

    • 谢谢,实际上这或多或少是我想要的。我最初考虑使用 Test::MockObject 但我被卡住的地方是客户端由一堆模块组成,其中只有一个模块使用 IO::Socket 进行通信。也就是说,如果我使用模块 Client.pm,它会“使用”communicator.pm,它实际上与服务器对话。那么当我测试 Client.pm 时,我该如何使用 Test::MockObject?
    • 我的建议是:对于单元测试,你可以模拟除被单元测试的模块之外的任何模块。对于应用程序级别的测试,您可以模拟充当外部接口的模块(例如 IO::Socket)。
    猜你喜欢
    • 2013-05-04
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-03-18
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多