当我编写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()吗?
答案 0 :(得分:4)
gtest的正确行为是为您定义的每个TEST_F创建一个新的MyTest实例。
因此,通过在测试装置中定义成员属性,可以确保每个TEST_F中的成员属性实例都不同
不幸的是,您正在测试一次实例化的静态变量。 gtest对此并不了解。因此,是的,您必须在每个TEST_F之间重置静态结构的值。
我个人将使用SetUp()而不是TearDown来调用stats_init。