Как проверить поведение на основе закрытого класса, используя члены c ++, используя gtest - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу использовать тест Google для тестирования моего класса. Предположим, у меня есть реализация конечного автомата, а текущее состояние является частным поэтому у меня есть метод SetNextState, который выглядит так:

void setNextState
{
  switch(m_currentState) //m_currentState is a private member
  {
    case INIT_STATE:
    {
       if some conditions occurred m_currentState=GO_STATE
    } 
......
  }
}

поэтому у меня есть несколько случаев, и каждый из них определяет поведение для перехода из одного состояния в другое. Мой вопрос: Как мне выполнить тесты для этого метода, предполагая, что состояние относится только к этому классу, поэтому нет вывода Как мне установить его значение, например, "GO_STATE", чтобы проверить случай GO_STATE и как я могу проверить m_currentState в конце теста Я стараюсь не добавлять друзей и т. Д. В свой код проверяемого оборудования, поскольку я хочу, чтобы он был как можно более оригинальным

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Легкость Гонки на орбите верны .Однако, если иногда вы чувствуете, что полезно тестировать закрытые функции-члены вашего класса, это часто означает, что ваш класс может быть разбит на несколько более мелких частей.

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

0 голосов
/ 14 сентября 2018

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

Original code
=============== 

class UUT //That's the actual class I want to test
{
  protected: 
     int m_protectedMember;
  public:
     void methodToTest()
     {
        //Do something with m_protectedMember use its value as input 
        //and set it as output 
     }
};

In the tester 
==============
class UUTHelper: public UUT
{
   public:
     int getProtectedMember() { return m_protectedMember; }
     void setProtectedMember(int value) { m_protectedMember = value; } 
};

Плюсы:

  • Мой тестовый код очень прост, и я легко создаю сложные сценарии.
  • Я тестирую реальный код без каких-либо "друзей" или каких-либо других манипуляций.

Минусы:

  • Как написано в дискуссии, не самая лучшая "хорошая практика", касающаяся частных членов

Спасибо всем:)

0 голосов
/ 12 сентября 2018

Ты не.Вы делаете то же самое, что и ваша настоящая программа: ввод данных, а затем проверка результата;вы говорите, что нет вывода, но должен быть какой-то эффект, иначе класс будет бессмысленным!

В противном случае вы сможете сделать тест "другом"класс, чтобы он мог осматривать свои внутренние компоненты или добавлять неизменяемый метод получения текущего состояния (и кого действительно волнует, увидят ли пользователи вашего класса это?), но ни один из вариантов на самом деле не соответствует духу.

По моему опыту, вы время от времени понимаете, что на самом деле вы больше не юнит-тестирование, а вместо этого функциональное тестирование, и Google Test может оказаться неподходящим инструментом для этой работы.Если ваш класс такой большой, как кажется, это может быть и здесь.И наоборот, вы можете помочь себе, разделив класс на более мелкие куски, а затем проведя модульное тестирование те .Зависит от того, что вы собираетесь, действительно.

...