如何使用Visual Studio CppUnitTestFramework初始化测试变量

时间:2018-12-08 15:09:09

标签: c++ visual-c++ cppunit microsoft-cpp-unit-test

我正在编写机器人控制器类 Controller ,在该类中,我对4个可控制的电动机分别使用结构 Axis

对于每个测试,我都想重置所有内容,因此我在该类中创建了一个指针,该指针在每个测试方法之前已更改为新的Controller。初始化可以在TEST_METHOD_INITIALIZE中正常工作,但是一旦调用了任何TEST_METHOD,程序似乎就会重置Axis指针。

感谢您的帮助!

编辑:经过进一步分析,我有了理论,该方法完成后,将删除初始化的Axis对象Axis init_mx。

Edit2:我认为这是一个稍微复杂的问题,例如:Pointer to local variable in C++ 但是,我没有找到一种方法来重置每个方法的Axis变量,而没有实际重置其中的每个变量。

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
...
namespace UnitTest
{

    TEST_CLASS(UnitTestController)
    {
    public:
        Controller* controller;
        struct Axis *mx, *my, *mz, *mg;

        TEST_METHOD_INITIALIZE(methodName)
        {
            Axis init_mx(50), init_my(50), init_mz(50), init_mg(5);         
            mx = &init_mx;
            my = &init_my;
            mz = &init_mz;
            mg = &init_mg;
            Controller init_controller(mx, my, mz, mg);
            controller = &init_controller;

enter image description here

        }
        ...
        TEST_METHOD(id_3_next_mode)
        {
            mx->position = 5; 
            controller->getAxisPositionMx();              
            //Axis in pointers got reset and therefore have no pointers to the 
            //provided structs from TEST_METHOD_INITIALIZE

        }

        }

    };
}

enter image description here Controller.h(摘录):

private:
struct Axis *mx, *my, *mz, *mg;

Controller.cpp(节选)

Controller::Controller(Axis *mx_in, Axis *my_in, Axis *mz_in, Axis *mg_in)
{
    mx = mx_in;
    my = my_in;
    mz = mz_in;
    mg = mg_in;
}

1 个答案:

答案 0 :(得分:1)

您找到了原始错误,但是我认为有必要指出一些有关测试模块,类,方法以及特殊的初始化/清除方法是如何工作的细节。

最要注意的是,每次执行测试方法时都会实例化该类的新实例,因此每个测试将具有一组新的类变量。这意味着您的示例测试类可能如下所示:

TEST_CLASS(UnitTestController)
{
public:
    struct Axis mx, my, mz, mg;
    Controller controller;

    // Define a constructor to initialize the class variables
    UnitTestController() : 
        mx(50), my(50), mz(50), mg(50),
        controller(mx, my, mz, mg)
    {
    }

    TEST_METHOD(id_3_next_mode)
    {
        mx.position = 5; 
        controller.getAxisPositionMx();              
    }
};

如果要在测试之间保留变量,可以将其放在测试类之外。

namespace UnitTest {

    SomeClass moduleVar1;

    TEST_CLASS(UnitTestClass)
    {
    public:

        TEST_METHOD(TestMethod1)
        {
           Assert::IsTrue(moduleVar1.SomeMethod());
        }

        TEST_METHOD(TestMethod2)
        {
           Assert::IsFalse(moduleVar1.SomeOtherMethod());
        }
    };
} 

该框架还提供以下初始化和清除功能,可用于操纵测试环境和固定装置:

  • TEST_METHOD_INITIALIZE-在运行每种测试方法之前调用一次。
  • TEST_METHOD_CLEANUP-运行每种测试方法后调用一次。
  • TEST_CLASS_INITIALIZE-在运行任何属于此类的测试之前,每个模块调用一次。
  • TEST_CLASS_CLEANUP-运行属于该类的所有测试后,每个模块调用一次。
  • TEST_MODULE_INITIALIZE-在运行任何测试或类初始化器之前,每个模块调用一次。
  • TEST_MODULE_CLEANUP-运行所有测试和类清除后,每个模块调用一次。