Как инициализировать тестовые переменные с помощью Visual Studio CppUnitTestFramework - PullRequest
0 голосов
/ 08 декабря 2018

Я пишу класс контроллера робота Контроллер , в котором я использую структуру Ось для каждого из 4 управляемых двигателей.

Для каждого теста я хочу сбросить все, поэтому я создал указатель в классе, который перед каждым методом теста заменяется новым контроллером.Инициализация отлично работает в TEST_METHOD_INITIALIZE, но после вызова любого TEST_METHOD программа, кажется, сбрасывает указатели Axis.

Спасибо за вашу помощь!

Редактировать: После дальнейшего анализа у меня есть теория, чтоинициализированные объекты Оси Ось init_mx удаляется после завершения метода.

Edit2: я думаю, что это немного более сложная проблема, подобная этой: Указатель на локальную переменную в 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 голосов
/ 24 марта 2019

Вы нашли исходную ошибку, но я думаю, что стоит указать некоторые детали того, как тестовые модули, классы, методы и специальные методы инициализации / очистки предназначены для работы.

Самое важное дляобратите внимание, что новый экземпляр класса создается каждый раз, когда выполняется метод теста, поэтому каждый тест будет иметь новый набор переменных класса.Это означает, что ваш пример тестового класса может выглядеть следующим образом:

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());
        }
    };
} 

Framework также предоставляет следующие функции инициализации и очистки, которые можно использовать для манипулирования тестовой средой и приборами:

  • TEST_METHOD_INITIALIZE - вызывается один раз перед запуском каждого метода тестирования.
  • TEST_METHOD_CLEANUP - Вызывается один раз после запуска каждого метода тестирования.
  • TEST_CLASS_INITIALIZE - Вызывается один раз для модуля перед выполнением любых тестов, принадлежащих этому классу.
  • TEST_CLASS_CLEANUP - Вызывается один раз для модуля после запуска всехтесты, принадлежащие этому классу.
  • TEST_MODULE_INITIALIZE - Вызывается один раз для модуля перед запуском любых тестов или инициализаторов класса.
  • TEST_MODULE_CLEANUP - Вызывается один раз для модуля после выполнения всех тестов и очистки класса.
...