C++ 谷歌测试夹具澄清

C++ 谷歌测试夹具澄清,c++,googletest,C++,Googletest,当我编写测试夹具来测试某些c代码时,我使用以下相同设置: . 待测试的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(voi

当我编写测试夹具来测试某些c代码时,我使用以下相同设置: . 待测试的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());
}
现在,当我为此编写单元测试时:

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;
}
并将其添加到拆卸中:

void TearDown(void)
{
    stats_init();
}

这将确保所有设置都被重置。这里的问题是,当使用测试夹具时,这是GTEST的正确行为吗?假设不需要m来定义init函数并将其添加到TearDown中,我错了吗?

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

因此,通过在测试夹具中定义成员属性,您可以确保在每个测试中都有不同的成员属性实例

不幸的是,您正在测试一个实例化一次的静态变量。gtest并没有神奇地知道这一点。因此,是的,您必须在每个测试之间重置静态结构的值


就个人而言,我将使用SetUp而不是TearDown来调用stats\u init。

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

因此,通过在测试夹具中定义成员属性,您可以确保在每个测试中都有不同的成员属性实例

不幸的是,您正在测试一个实例化一次的静态变量。gtest并没有神奇地知道这一点。因此,是的,您必须在每个测试之间重置静态结构的值


就个人而言,我将使用SetUp而不是TearDown来调用stats\u init。

您有一个全局变量。你为什么期望它被重置?如果您将统计数据放入MyTest对象,并在构造函数中初始化它们,那么它们将被“重置”,因为googletest将为每个测试使用一个新的MyTest实例。这只是普通C++。你有一个全局变量。你为什么期望它被重置?如果您将统计数据放入MyTest对象,并在构造函数中初始化它们,那么它们将被“重置”,因为googletest将为每个测试使用一个新的MyTest实例。这只是普通的C++。