GoogleTest测试装置说明

时间:2019-04-11 14:42:39

标签: c++ googletest

当我编写Test Fixture来测试某些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());
}

现在我已经注意到,当我为此代码编写不同的测试装置时,不会重置stats结构变量的值,即如果第一个测试应该增加成功次数,那么当我们开始第二个测试时,成功次数= 1不是0,依此类推。我发现此行为很奇怪,因为我认为应该在每次测试时重置所有内容。

为解决此问题,我最终在c代码中添加了以下功能:

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

并将其添加到TearDown():

void TearDown(void)
{
    stats_init();
}

这确保所有内容均被重置。这里的问题是使用测试治具时gtest的正确行为吗?我以为它不应该要求m来定义init()函数并将其添加到TearDown()吗?

1 个答案:

答案 0 :(得分:4)

gtest的正确行为是为您定义的每个TEST_F创建一个新的MyTest实例。

因此,通过在测试装置中定义成员属性,可以确保每个TEST_F中的成员属性实例都不同

不幸的是,您正在测试一次实例化的静态变量。 gtest对此并不了解。因此,是的,您必须在每个TEST_F之间重置静态结构的值。

我个人将使用SetUp()而不是TearDown来调用stats_init。