【问题标题】:Testing static functions with CppUnit使用 CppUnit 测试静态函数
【发布时间】:2013-04-09 03:42:35
【问题描述】:

我的项目包含 C 文件。在某些文件中,我将函数定义为静态。

我在单元测试中使用 CppUnit,我想测试这些静态函数。我知道不允许从文件外部(定义它的地方)调用函数。为了从我的 C++ 测试文件中调用这些静态函数,是否有避免此问题的解决方案?

【问题讨论】:

标签: c++ c unit-testing cppunit


【解决方案1】:

假设我们谈论的是 C 静态函数,那么最简单的解决方案是在编译调试版本时使函数成为非静态函数。这意味着您可以在单元测试中使用这些符号。这仅在没有符号别名的情况下才有效。

如果您在所有调试版本中定义符号 DEBUG,则类似于:

#ifdef DEBUG
#define debug_export 
#else
#define debug_export static
#endif

然后像这样定义你的静态函数

debug_export void foo(void)
{
...
}

并且要么有条件地在头文件中包含声明,要么在你的单元测试文件中手动导入它们:

extern void foo(void);

解决它的其他方法是将单元测试包含在源文件本身中(如果它失控会有点混乱),而不是对函数进行单元测试(有点逃避)或标记函数as dll-local 而不是静态的,并确保您的单元测试是该动态对象的一部分。

【讨论】:

  • 谢谢我根据您的回答启发了一个解决方案。详情请看我的回答
【解决方案2】:

我有一个通用头文件,我将它包含在我项目的所有源文件中。我添加了这些行,问题就解决了:

#ifdef TEST
#define static
#endif

我什至可以避免在我的原始 C 代码中添加上述代码。我可以在 gcc 命令中添加标志 -Dstatic=,我发现这也可以。

但我们在使用此解决方案时必须小心,因为:

  • 我们可以在 2 个单独的文件中将相同的变量/函数名称定义为静态。
  • 我们可以有一个包含定义为静态变量的函数。

【讨论】:

    【解决方案3】:

    有没有办法重构代码以消除对静态方法的需求?从 OO 设计的角度来看,静态是羊皮中的全局变量。

    我知道这不一定是实用或最快的答案,但您可以通过消除它来改进您的设计。

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 2010-11-04
      • 2010-10-10
      • 1970-01-01
      • 2015-11-12
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多