C++ 如何使用Visual Studio cpputTestFramework初始化测试变量

C++ 如何使用Visual Studio cpputTestFramework初始化测试变量,c++,visual-c++,cppunit,microsoft-cpp-unit-test,C++,Visual C++,Cppunit,Microsoft Cpp Unit Test,我正在编写一个roboter控制器类controller,其中我为4个可控电机中的每一个使用一个structAxis 对于每个测试,我想重置所有内容,因此我在类中创建了一个指针,在每个测试方法之前,该指针会被更改为一个新的控制器。初始化在TEST_METHOD_INITIALIZE中工作正常,但一旦调用任何TEST_METHOD,程序似乎会重置轴指针 谢谢你的帮助 编辑:经过进一步分析,我有了一个理论,即初始化的Axis对象Axis init_mx在方法完成后被删除 编辑2:我认为这是一个稍微复

我正在编写一个roboter控制器类controller,其中我为4个可控电机中的每一个使用一个structAxis

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

谢谢你的帮助

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

编辑2:我认为这是一个稍微复杂一点的问题,像这样: 然而,我没有找到一种方法,在没有实际重置其中每个变量的情况下,在每个方法中重置轴变量

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;

Controller.h(节选):

Controller.cpp(节选)


您发现了最初的bug,但我认为值得指出一些关于测试模块、类、方法和特殊初始化/清理方法如何工作的细节

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

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\u METHOD\u INITIALIZE
    -在运行每个测试方法之前调用一次
  • TEST\u METHOD\u CLEANUP
    -在运行每个测试方法后调用一次
  • TEST\u CLASS\u INITIALIZE
    -在运行属于该类的任何测试之前,为每个模块调用一次
  • TEST\u CLASS\u CLEANUP
    -在运行属于该类的所有测试后,为每个模块调用一次
  • TEST\u MODULE\u INITIALIZE
    -在运行任何测试或类初始化器之前,为每个模块调用一次
  • TEST\u MODULE\u CLEANUP
    -在运行所有测试和类清理后,为每个模块调用一次
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;
}
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());
        }
    };
}