Уточнение тестового приспособления GoogleTest

#c #googletest

#c #googletest

Вопрос:

Когда я пишу тестовое приспособление для тестирования некоторого кода на c, я использую ту же настройку, что и: https://github.com/google/googletest/blob/master/googletest/docs/primer.md#test-fixtures-using-the-same-data-configuration-for-multiple-tests. Код c, подлежащий тестированию, как таковой:

 static struct {
    uint32_t success;
    uint32_t errors;
}stats;

uint32_t get_errors(void)
{
    return stats.errors;
}
uint32_t get_success(void)
{
    return stats.success;
}

void increment_errors(void)
{
    stats.errors  ;
}
void increment_success(void)
{
    stats.success  ;
}

void main_function(int arg)
{
    if (arg >=0)
        increment_success();
    else
        increment_errors();
}

  

Теперь, когда я пишу модульные тесты для этого как такового:

 class MyTest : public ::testing::Test
{
protected:

    void SetUp(void)
    {
    }

    void TearDown(void)
    {
    }
};

TEST_F(MyTest, Test1)
{
        main_function(1);
    EXPECT_EQ(1, decoder_get_success());
    EXPECT_EQ(0, decoder_get_errors());
}

TEST_F(MyTest, Test2)
{
        main_function(40);
    EXPECT_EQ(1, decoder_get_success()); //This is a fail as number ends up being 2 not 1 which includes prev. test results
    EXPECT_EQ(0, decoder_get_errors());
}
  

Теперь я заметил, что когда я пишу разные тестовые приспособления для этого кода, значения переменных структуры статистики не сбрасываются, т.Е. Если предполагается, что первый тест увеличивает число успешных тестов, то при запуске второго теста число успешных тестов = 1, а не 0, и так далее, и тому подобное. Я нахожу это поведение странным, поскольку я предполагал, что оно должно сбрасывать все с каждым тестом.

Чтобы решить эту проблему, я закончил тем, что добавил в код c следующую функцию:

 void stats_init(void)
{
    decoder_stats.errors = 0;
    decoder_stats.success = 0;
}
  

и добавьте это в TearDown():

 void TearDown(void)
{
    stats_init();
}
  

Это гарантирует, что все будет сброшено. Вопрос здесь в том, является ли это правильным поведением для gtests при использовании тестовых приспособлений? Ошибаюсь ли я, предполагая, что для определения функции init() и добавления ее в TearDown() не должно требоваться m?

Комментарии:

1. У вас есть глобальная переменная. Почему вы ожидали, что он будет сброшен? Если вы поместите свою статистику в MyTest объект и инициализируете их в конструкторе, они будут «сброшены», потому что googletest будет использовать новый MyTest экземпляр для каждого теста. Это просто обычный C .

Ответ №1:

Правильное поведение gtest заключается в создании нового и свежего экземпляра MyTest для каждого определенного вами TEST_F .

Итак, определяя атрибут member в тестовом приборе, вы уверены, что у вас будет другой экземпляр вашего атрибута member в каждом TEST_F

К сожалению, вы тестируете статическую переменную, которая создается один раз. gtest волшебным образом не знает об этом. Итак, да, вам нужно сбросить значение вашей статической структуры между каждым TEST_F .

Лично я буду использовать SetUp() вместо демонтажа для вызова stats_init .