【发布时间】:2021-02-06 05:29:12
【问题描述】:
我有一个封装 Asio 的类。它旨在模拟域和 tcp 套接字上的通信,但我对自动化单元测试感到茫然。我查看了FakeIt,但它只测试虚拟方法,GoogleMocks suggests 模板化我的代码,这样我就可以通过 MockAsio 实现进行单元测试和生产中的真实 Asio。
还有其他方法可以对网络代码进行单元测试吗?伪造域和 tcp 套接字而不是运行整个堆栈?如果我使用 GoogleMock,为什么要使用使用 GoogleMock 的类而不是我自己的实现来满足我的需要?
【问题讨论】:
-
好吧,如果您依赖 ASIO,您将不再测试小“单元”。单元测试框架作为测试非单元测试的工具变得越来越难
-
我想模拟 asio 的输出,以便我可以专注于单元。
-
我经常mock I/O对象或者他们的I/O服务来对应用协议进行单元测试(见官方custom service example)。在测试计时器时,还可以自定义 TimeTrait(请参阅 here。对于测试 I/O,我经常发现编写一组离散的 minimal reproducible examples 更有价值,允许发生系统调用,从而掩盖操作系统行为通过模拟 I/O 对象。
-
如果我理解正确,您可以为 IO 服务模板化吗?
-
@ruipacheco 每个 I/O 对象都有一个模板参数,指示它将使用的 I/O 服务(不是
io_service类)。例如basic_stream_socket的第二个模板参数是StreamSocketService。 I/O 服务的句柄可通过use_service获得。这有助于模拟特定的 I/O 行为,而无需直接访问asio::socket。
标签: c++ unit-testing sockets network-programming boost-asio