Как инициализировать тестовые переменные с помощью Visual Studio CppUnitTestFramework

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

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

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

Изменить: после дальнейшего анализа у меня появилась теория, что инициализированные объекты Axis 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;

введите описание изображения здесь

        }
        ...
        TEST_METHOD(id
private:
struct Axis *mx, *my, *mz, *mg;
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 } } }; }

введите здесь описание изображения 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;
}

person JoschJava    schedule 08.12.2018    source источник


Ответы (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(idTEST_METHOD_INITIALIZEnext_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 - Вызывается один раз для каждого модуля после выполнения всех тестов и очистки классов.
person Chris Olsen    schedule 24.03.2019