【问题标题】:Unit/integration testing time sensitive C++ code单元/集成测试时间敏感的 C++ 代码
【发布时间】:2011-07-12 14:12:43
【问题描述】:

有没有办法创建单元/集成测试,不仅可以测试正确性,还可以测试步骤是否在特定时间段内完成?

例如:

// MyTestSuite.h
#include <cxxtest/TestSuite.h>
class MyTestSuite : public CxxTest::TestSuite
{
    public:
    void testTimeCriticalFunction(void)
    {
        TS_ASSERT_EQUALS(timeCriticalFunction(), correctValue);

        // timeCriticalFunction() must correctly return within 5 milliseconds
        TS_ASSERT_DID_COMPLETE_WITHIN_MILLISECONDS(timeCriticalFunction(), 5);
    }
}

虽然该示例只是一个函数,但如果有一种方法可以将它们链接在一起以对更长的序列执行集成测试,这样如果每个步骤都正确并在指定时间内完成,测试将返回 true,那将是理想的以及整个小组。

亚毫秒精度是首选,但典型的时间要求在 5-15 毫秒之间。

更新 1: 目标平台是 UNIX (Mac OS X)。精确的时间要求取决于问题域(通信)。

更新 2: 鉴于 cmets,假设我专注于 集成 测试。

【问题讨论】:

  • 我可以建议你写一个单独的测试来报告操作是否足够快吗?理想情况下,每个单元测试只会因为一个原因而失败。否则,每次测试变红时,您都必须找出这一次失败的 n 个失败原因中的哪一个。
  • razlebe:感谢您的回复。你提出了一个有效的观点。

标签: c++ unit-testing testing integration-testing


【解决方案1】:

一般来说,将特定的时序要求设置为小粒度并不是一个好主意。由于您使用的是 OSX,因此您至多拥有一个软实时系统。 (如果您有严格的实时要求,那么 OSX 等通用操作系统不是答案。)可用的 CPU / CPU 内核数量有限。操作系统可以在某种程度上任意决定让您的线程进入睡眠状态,即使您的进程/进程组以具有非常高优先级的超级用户身份运行。

【讨论】:

  • 感谢您的回复。我同意使用 Mac OS X 不是一个理想的解决方案,因为它不是实时操作系统。
  • 您要做的是在整个系统上构建性能要求。单元测试应该只关心产生正确的结果。当您测试系统响应时,您确实关心满足性能要求。如果你达到了这些目标,那很好。你不必改变任何事情。如果你不这样做,你需要找到瓶颈。几个问题:#1。这些瓶颈可能不在您的代码中的任何地方。相反,它们存在于线程之间以及与操作系统之间的非确定性交互中。 #2 没有一台 Mac OSX 机器。如果有人使用旧笔记本电脑怎么办?
【解决方案2】:

如果您在单元测试中检查您的功能是否在一定时间内完成,那么您做错了,因为这不应该在单元测试级别完成(更适合集成级别)。这也会增加单元测试的运行时间,这很糟糕。此外,这将取决于运行的平台单元测试。

集成测试可以查看expect

【讨论】:

  • 当然时间是平台相关的,VJo。具有此类时序约束的一个典型原因是为了在非常特定的平台上为实时应用程序实现有保证的性能。
  • VJo:感谢您的回复。我与您一样担心任何会导致时间问题的测试逻辑。为了更加清楚,我更新了我原来的问题。
  • @David 你不明白我写了什么。单元测试应该独立于硬件。您不会使用目标来执行单元测试,但很可能会使用更强大的东西,
  • @VJO:Noren 的目标是 OSX。也就是说,我同意你的观点,Noren 混淆了单元测试和集成测试之间的区别。
【解决方案3】:

单元测试应该在确定(且很短)的时间内完成。您可能有点混淆了集成和单元测试之间的区别。

话虽如此,您的测试框架应该可以为您解决这个问题。我推荐UnitTest++ 很棒。

【讨论】:

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