首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++和UnitTest++中使用宏

在C++和UnitTest++中使用宏
EN

Stack Overflow用户
提问于 2019-11-15 01:39:04
回答 1查看 48关注 0票数 2

我正在做一个大型的C++项目,对于安全关键的航空航天软件,我们有大约50名开发人员在这个项目上工作,所以这个项目当然是巨大的,我们在Red Hat Linux上使用C++,并使用了一点Java和Python,而且系统的一小部分托管在IBM AIX Unix和Windows上。

我最近受雇于这个项目,发现UnitTest++被用来做单元测试。有一件事让我感到困惑,那就是UnitTest++是如何使用宏的。它使用宏定义派生类,然后调用宏调用基类方法。这是非常不寻常的,我试图在一个小的示例C++程序中重现相同的东西,但无法使其工作。注意示例程序的源代码。我不能在我们的项目中张贴的具体代码,因为保密协议。

应该有一种方法可以让它工作,它可以在我们的单元测试中使用UnitTest++

代码语言:javascript
复制
// macro2.cpp

#include <iostream>

using namespace std;

class TestBaseClass
{
    public:

    // class constructor
    TestBaseClass() : num1(3), num2(8)
    {
        cout << "Object Created" << endl;
    }

    // class properties
    int num1;
    int num2;

    // class method
    void testMethod()
    {
        cout << "testMethod() called" << endl;
    }

    // class destructor
    ~TestBaseClass()
    {
        cout << "Object Destroyed" << endl;
    }

};


#define TEST_MACRO(TestBaseClass) \
    class TestDerivedClass : public TestBaseClass \
    { \
        public: \
        TestDerivedClass() { num1 = 10; } \ 
    }; \

int main() 
{

    // call macro base class method
    TEST_MACRO(TestBaseClass)
    {
        testMethod();
    }

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2019-11-15 02:01:44

免责声明:不是100%确定UnitTest++是如何做到这一点的,但是Boost单元测试似乎也在做同样的事情,而且我想不出任何其他可以做到的事情。

解决方案是在类TestDerivedClass中使用方法签名结束TEST_MACRO,这样后面的作用域({ //call to things within TestDerivedClass})就可以作为该方法的实现。

因为你不能在一个函数作用域中声明一个类,所以你还需要通过一些其他的结构来调用这个方法(例如,Boost单元测试也会通过宏生成main方法)

下面是一个有效的示例:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class TestBaseClass
{
public:

    // class constructor
    TestBaseClass() : num1(3), num2(8)
    {
        cout << "Object Created" << endl;
    }

    // class properties
    int num1;
    int num2;

    // class method
    void testMethod()
    {
        cout << "testMethod() called" << endl;
    }

    // class destructor
    ~TestBaseClass()
    {
        cout << "Object Destroyed" << endl;
    }

};


#define TEST_MACRO(TestBaseClass) \
class TestDerivedClass : public TestBaseClass \
{ \
    public: \
    TestDerivedClass() { num1 = 10; } \
    void testMethodInternal(); \
}; \
   \
void TestDerivedClass::testMethodInternal()

// call macro base class method
TEST_MACRO(TestBaseClass)
{
    testMethod();
}

int main()
{
    TestDerivedClass inst;
    inst.testMethodInternal();
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58862779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档