【发布时间】:2017-03-17 01:25:09
【问题描述】:
我正在考虑使用 C++ 和 Qt 重写一些现有的 C 代码。在 C 代码中,poll 用于检查来自多个源的输入,每个源都有一个超时值和一些与之相关的特定行为。比如
- 在
intput0沉默 5 分钟后,我们假设对方已经死了,我们尝试重新建立联系 - 我们希望客户端连接到
socket0 - 一旦客户端连接到
socket0,就会调用accept(socket1),在关闭socket1之前,客户端有一分钟时间发出请求
这种事情并不是太难的测试,通过使用LD_PRELOAD 和“隐藏”涉及的系统函数(poll、gettimeofday),可以(在某种程度上)轻松控制时间流逝并触发超时。
迁移到 Qt 我计划将文件描述符包装在 QSocketNotifier 的实例中,并将 activated(int) 信号连接到合适的插槽。这基本上提供了一个 Qt 风格的poll——除了没有超时!
对于超时,我正在考虑将QTimer 耦合到每个QSocketNotifier。我的实验表明这是可行的,而且相当优雅。但是,测试并不愉快。我真的不能让测试坐下来等待 5 分钟超时。
如何使此解决方案中的超时可测试?
(或者也许我只是想错了,应该做一些完全不同的事情。)
【问题讨论】:
-
你不能把超时设置为一个变量,然后在单元测试之前将它设置为较低的值吗?
-
我删除了“单元”这个词,因为它不是真正的“单元测试”。我可以减少超时时间,但这不是我通常尝试进行测试的方式。我宁愿控制环境,在本例中为 time,并让被测事物保持原样。在这种特殊情况下,我还想在集成测试中测试超时(我们有几个进程正在通信),然后更改超时值会产生更多影响。
-
具有可配置的超时听起来是一个不错的功能。如果不在那里等待 5 分钟,我不明白如何做到这一点。尤其是 Qt。如果你有自己的时间测量框架,你可以在其中实现一个功能来“设置”提前 5 分钟的时间,但我认为这也会在你想用多个进程进行测试时产生问题,因为它们相互依赖于时间。 (+ AFAIK 你不能用 Qt 做到这一点)。