Правильный подход к изменению функциональности класса для модульного тестирования? - PullRequest
0 голосов
/ 10 января 2019

Я работаю над старой и большой кодовой базой C ++ и занимаюсь созданием модульных тестов для компонентов, в которых они отсутствуют.

Как правильно проверять функциональность этих классов в целях тестирования? В настоящее время я использую виртуальные функции, и в своем тестовом модуле я извлекаю фиктивный класс из базового «производственного» класса и при необходимости переопределяю функциональность.

Вот пример:

Production.cpp

class Production {
protected:
    int Servers = 0;
public:

    virtual bool IsValInRegistry(const std::string& regVal);
};

bool Production::IsValInRegistry(const std::string& regVal)
{
    HRESULT hr = GOOD;
    hr = WinSysCallToRegistry(regVal);

    if (HR)
        return true;
    else
        return false;
}

Mock.cpp

class Mock : public Production {
public:
    bool IsValInRegistry(const std::string& regVal) override final;
};

Mock::IsValInRegistry(const std::string& regVal)
{
    return true;
}

Это правильный путь вперед? Я обеспокоен, если я введу слишком много virtual функций, я могу увидеть снижение производительности, которого я хотел бы избежать. Если эта virutal модель не идеальна, то какой метод хорош?

1 Ответ

0 голосов
/ 10 января 2019

Если вы хотите сделать это без какого-либо влияния на производительность, вы можете попробовать макетирование во время компиляции следующим образом:

class Production {
protected:
    int Servers = 0;
public:

    bool IsValInRegistry(const std::string& regVal);
};

bool Production::IsValInRegistry(const std::string& regVal)
{
#ifdef USE_MOCK_PRODUCTION
    return true;
#else
    HRESULT hr = GOOD;
    hr = WinSysCallToRegistry(regVal);

    if (HR)
        return true;
    else
        return false;
#endif
}

Это потребует перекомпиляции с необходимыми флагами для нужных вам тестов, но производственная сборка останется прежней. Так что это просто вопрос времени, которое вы можете потратить на выполнение этих юнит-тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...