【问题标题】:Is it possible to define (pure virtual) test cases in a base class using googletest是否可以使用 googletest 在基类中定义(纯虚拟)测试用例
【发布时间】:2015-10-13 08:26:55
【问题描述】:

是否可以使用(抽象)测试用例定义基本测试装置并从中派生类?

我想支持两个场景(取自 Roy Overshores “单元测试的艺术”):

  1. 模板测试类模式在基础测试装置中定义抽象测试用例,从而强制派生类实现它们。
  2. 抽象测试驱动类模式在所有派生类自动继承的基类中实现测试

我无法弄清楚这如何与 googletest 一起使用。如果我有一个基类

#pragma once

class BaseClass : public ::testing::Test
{
};

TEST_F(BaseClass, T1)
{

}

和两个派生类(在不同的文件中)

#include "stdafx.h"

#include "BaseClass.h"

class DerivedClass1 : public BaseClass
{

};

#include "stdafx.h"

#include "BaseClass.h"

class DerivedClass2 : public BaseClass
{

};

我得到编译器错误

virtual void __thiscall BaseClass_T1_Test::TestBody(void)" (?TestBody@BaseClass_T1_Test@@EAEXXZ) already defined in DerivedClass1.obj

是否有可能在测试基类中定义具体和纯虚拟测试?

【问题讨论】:

标签: c++ unit-testing inheritance abstract-class googletest


【解决方案1】:

尝试将 TEST_F(BaseClass, T1){} 从 BaseClass.h 移出到它自己的 .cpp 文件中。 BaseClass.h 包含在 DerivedClass1 和 DerivedClass2 的 2 个 .cpp 文件中,在编译期间,TEST_F 将扩展为一堆可执行函数,这些函数将包含在这两个 .cpp 文件中。这就是链接器不满意并抱怨重复符号 TestBody@BaseClass_T1_Test@@EAEXXZ) 的原因。

【讨论】:

  • 是的,然后它编译。但是测试不是针对每个派生类执行的,而是只执行一次。因为它本身包含在派生类中。我担心我将不得不做一个丑陋的解决方法,比如在我从 DerivedClasses 的测试中调用的 BaseClass 中定义纯虚拟方法
  • 您必须提供有关您的代码的更多详细示例,否则将很难提供帮助。也许在 SO 中提出另一个问题。
猜你喜欢
  • 2020-04-09
  • 2010-09-25
  • 2020-10-21
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多