当前位置: 首页 > 知识库问答 >
问题:

在单元测试期间何时运行单例析构函数

鄂昌胤
2023-03-14

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

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

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

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

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

这就引出了三个问题:

>

我关于破坏顺序和对代码覆盖率分析的影响的理论似乎完全不可信吗?

我当前的getInstance实现是否存在任何明显的问题?我的程序是单线程的。

谢谢

共有1个答案

慕阳
2023-03-14

在C语言中,对单音使用类级静态实例可能会有问题。由于不同翻译单元中两个静态对象的初始化顺序未定义。因此,建议使用方法级静态对象,正如您所做的那样。在这种情况下,保证在第一次调用该方法时对其进行初始化,如果不需要,还具有不创建对象的优点。

编辑

我猜它概括了答案:

  1. 对于C,使用静态方法级别更安全
  2. 不是对我
  3. 对于单线程应用程序,这是确定的。
 类似资料:
  • 所以,我的问题是,我正在尝试为我的应用程序进行单元测试。我有两个服务,我们叫它们Foo和Bar,Foo只是Bar的代理。 因此,Foo服务的路由器如下所示: 向Bar服务发出请求的处理程序如下所示: 当我这样写测试时: 它永远冻结了......嗯,我想这是因为它周围的一些协程魔法,但是因为我在这方面还是新手,我不明白这里到底发生了什么。有什么帮助吗?

  • 问题内容: 我有一堂课要添加单元测试。该类具有多个构造函数,这些构造函数采用不同的类型并将其转换为规范形式,然后可以将其转换为其他类型。 实际上,它接受并转换为其他两种类型。 我正在尝试找出最合适的方法来测试这些构造函数。 应该有一个针对每个构造函数的测试和输出类型: 这导致许多不同的测试。如您所见,我正在努力命名它们。 应该有多个断言: 这有多个断言,这使我感到不舒服。它还正在测试getStri

  • 问题内容: 这是我的java类: 这是单元测试: 测试失败,因为没有任何人注入。我应该如何正确处理这种情况?是否存在最佳实践? 问题答案: 如果没有像Spring这样的容器(或诸如基于Spring的Unitils之类的容器),则必须手动注入实体管理器。在这种情况下,您 可以 将以下内容用作基类:

  • 问题内容: 我目前正在运行一些单元测试,这些单元测试可能要花很长时间才能失败或无限期地运行。在成功的测试运行中,它们将始终在一定时间内完成。 是否可以创建pytest单元测试,如果在一定时间内未完成,该测试将失败? 问题答案: 您可以安装pytest-timeout插件,然后用几秒钟的超时标记您的测试功能。 在https://pypi.python.org/pypi/pytest- timeout

  • 我试图在我的项目中使用JerseyTest框架添加ReST调用的单元测试。我复制粘贴了一个最简单的示例,但出现了一个运行时异常: 附加代码和pom依赖项:

  • 问题内容: 我正在尝试为程序中用来验证表单的简单bean编写单元测试。Bean带有注释,并具有使用初始化的类变量 我想为此类中的验证方法编写单元测试,但是,如果可能的话,我希望在不利用属性文件的情况下这样做。我这样做的原因是,如果我从属性文件中提取的值发生更改,我希望这不会影响我的测试用例。我的测试用例正在测试验证值的代码,而不是值本身。 有没有一种方法可以在测试类中使用Java代码来初始化Jav