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