【问题标题】:Controlling time of QTimer?控制 QTimer 的时间?
【发布时间】:2017-03-17 01:25:09
【问题描述】:

我正在考虑使用 C++ 和 Qt 重写一些现有的 C 代码。在 C 代码中,poll 用于检查来自多个源的输入,每个源都有一个超时值和一些与之相关的特定行为。比如

  • intput0 沉默 5 分钟后,我们假设对方已经死了,我们尝试重新建立联系
  • 我们希望客户端连接到socket0
  • 一旦客户端连接到socket0,就会调用accept (socket1),在关闭socket1 之前,客户端有一分钟时间发出请求

这种事情并不是太难的测试,通过使用LD_PRELOAD 和“隐藏”涉及的系统函数(pollgettimeofday),可以(在某种程度上)轻松控制时间流逝并触发超时。

迁移到 Qt 我计划将文件描述符包装在 QSocketNotifier 的实例中,并将 activated(int) 信号连接到合适的插槽。这基本上提供了一个 Qt 风格的poll——除了没有超时!

对于超时,我正在考虑将QTimer 耦合到每个QSocketNotifier。我的实验表明这是可行的,而且相当优雅。但是,测试并不愉快。我真的不能让测试坐下来等待 5 分钟超时。

如何使此解决方案中的超时可测试?

(或者也许我只是想错了,应该做一些完全不同的事情。)

【问题讨论】:

  • 你不能把超时设置为一个变量,然后在单元测试之前将它设置为较低的值吗?
  • 我删除了“单元”这个词,因为它不是真正的“单元测试”。我可以减少超时时间,但这不是我通常尝试进行测试的方式。我宁愿控制环境,在本例中为 time,并让被测事物保持原样。在这种特殊情况下,我还想在集成测试中测试超时(我们有几个进程正在通信),然后更改超时值会产生更多影响。
  • 具有可配置的超时听起来是一个不错的功能。如果不在那里等待 5 分钟,我不明白如何做到这一点。尤其是 Qt。如果你有自己的时间测量框架,你可以在其中实现一个功能来“设置”提前 5 分钟的时间,但我认为这也会在你想用多个进程进行测试时产生问题,因为它们相互依赖于时间。 (+ AFAIK 你不能用 Qt 做到这一点)。

标签: c++ qt testing time


【解决方案1】:

我相信这个问题可以解释为“如何模拟QTimer?”这个重新措辞的问题的答案是“间接地”。您可以使用QTimer 上的抽象来编写主程序,然后测试代码会模拟它以根据测试需要而不是根据时间发出信号。

解决此问题的一种特殊方法可能是让测试代码断开插槽与QTimer 的信号的连接,并在其位置连接它自己的信号。

【讨论】:

  • 是的,标准的 OO 方法是通过依赖注入实现控制反转。这种方法在具有名义类型的语言中也有点痛苦。我真的希望QTimer 可以通过其他方式进行测试。
  • @Magnus 决定你想测试什么。你想测试你对信号的反应吗?然后从其他东西发出信号。你想测试你对QTimer 的反应吗?然后你就被QTimer困住了。
  • 好吧,我想测试对信号的反应,但只有QTimer 实例的信号附加到插槽,所以它们几乎相同。请注意,我在这里谈论的不仅仅是“单元测试”(其中“单元”是一个类)。
  • @Magnus 尽管如此,Qt 的信号和插槽可以从所涉及的类外部连接/断开,因此您应该能够将所有内容重新连接到模拟计时器以进行测试,甚至不必修改生产代码。
  • 我的意思是不得不等待 5 分钟在我看来对于集成测试来说是合理的。只需将它们自动化,让它们在某个地方定期运行,并在出现问题时收到电子邮件通知。因此,您不必“积极”等待。但是,如果 Qt 测试框架能够提供一些“时间变化”功能,那就太好了
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多