【问题标题】:When to run a singleton destructor during unit testing在单元测试期间何时运行单例析构函数
【发布时间】:2014-06-13 13:29:00
【问题描述】:

对于我系统中的单例类,在我的类测试(代码覆盖率分析部分)期间,我很难将析构函数报告为“已覆盖”。我认为这是因为测试框架在我的静态单例实例之前被破坏,因此我试图通过稍后创建单例实例来更改破坏顺序 - 而不是在程序启动时。

我的公共 getInstance 方法现在看起来像这样:

SingletonClass* SingletonClass::getInstance()
{
  static SingletonClass instance;
  return &instance;
}

构造函数像往常一样是私有的,但我没有经典的单例静态实例指针作为类成员。相反,我将实例存储为静态函数内部数据(如上所示),这是第一次调用 getInstance 方法时创建的。

我认为 C++ 标准规定静态函数内部变量以相反的创建顺序被破坏。使用 getInstance 的这个解决方案,在类测试代码覆盖分析期间,据报告析构函数被“覆盖”了,所以看来我的理论至少在那里没有被证明是错误的。

这引出了三个问题:

  1. 我能有更经典的单例实现吗? 而是静态类成员,并显式调用析构函数 在课堂考试中?在这种情况下,静态数据会发生什么, 它真的会被释放吗?

  2. 我关于破坏顺序和影响的理论是否 代码覆盖率分析似乎完全令人难以置信?

  3. 我当前的实现是否有任何明显的问题 获取实例?我的程序是单线程的。

谢谢

【问题讨论】:

    标签: c++ unit-testing static singleton


    【解决方案1】:

    在 C++ 中,对单音使用类级静态实例可能会出现问题。由于不同翻译单元中两个静态对象的初始化顺序是未定义的。因此,建议使用您所做的方法级别的静态对象。在这种情况下,它保证在第一次调用方法时被初始化,还有一个优点是不需要时不创建对象。

    编辑

    我猜它总结了答案:

    1. 对于 C++,使用静态方法级别更安全
    2. 不适合我
    3. 对于单线程应用,这没问题。

    【讨论】:

    • 我认为更常见的实现是使用静态类成员。但即便如此,我认为你的回答并不能真正回答我的任何问题。
    • @scy7he,你是对的,对于托管语言(Java、C#),类级别的静态更常见。更新了我的回复。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2012-11-28
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多