2

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

我最近被聘用到这个项目中,发现 UnitTest++ 被用于进行单元测试。让我感到困惑的一件事是 UnitTest++ 如何使用宏。它使用宏定义派生类,然后调用宏调用基类方法。这是非常不寻常的,我试图在一个小的示例 C++ 程序中重现同样的事情,但无法让它工作。注意示例程序的源代码。由于保密协议,我无法在我们的项目中发布特定代码。

应该有办法让它工作,它在我们的单元测试中使用 UnitTest++

// 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;
}
4

1 回答 1

0

免责声明:不是 100% 确定 UnitTest++ 是如何做到的,但 Boost 单元测试似乎也在做同样的事情,我想不出还有什么可以做到的。

解决方案是用类中的方法签名结束 TEST_MACRO,TestDerivedClass以便后面的范围 ( { //call to things within TestDerivedClass}) 用作该方法的实现。

由于您不能在函数范围内声明一个类,因此您还需要通过其他一些结构发出对该方法的调用(即 Boost 单元测试也通过宏生成 main 方法)

这是一个工作示例:

#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;
}
于 2019-11-14T18:01:43.683 回答