C++ 和 Google 测试

Yos*_*Yos 4 c++ googletest

我正在研究 Google Test 参数化测试。然而,它们看起来真的很好,除非我错过了一个技巧,否则我看不到你如何为每个测试使用一组不同的测试数据。我使用了一个在网上找到的示例,效果很好,但看起来我如果我想提供具有不同参数的 TEST_P,则需要创建一个新类,即 FooTest1、2、3、4 等,以便为每个类提供 INSTANTIATE_TEST_CASE_P。我想我一定错过了一些东西。

class FooTest: public ::testing::TestWithParam < int >{....};

TEST_P(FooTest, DoesBar)
{
    ASSERT_TRUE(foo.DoesBar(GetParam());
}

INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); 
Run Code Online (Sandbox Code Playgroud)

有人能确认这是否可以通过不同的方式实现吗?

谢谢

Cha*_*onX 5

不幸的是,没有简单的方法可以解决这个问题。

每个INSTANTIATE_TEST_CASE_P实例化一个(参数化)测试夹具( ),并具有提供的测试值范围(在值从 1 到 9 的class FooTest: public ::testing::TestWithParam < int >{....}情况下- 请记住,不包括最终值INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10))

每个TEST_P定义为使用该固定装置(例如TEST_P(FooTest, DoesBar))将针对值范围内的每个值执行一次(即 GetParam() 将在所有执行中返回 1 到 9,并以“OneToTenRange”作为测试前缀)。

INSTANTIATE_TEST_CASE_P您可以为同一测试装置添加第二个(例如INSTANTIATE_TEST_CASE_P(TenToTwentyRange, FooTest, ::testing::Range(10, 20))),这将导致使用 FooTest 装置的所有测试也执行该范围(在本例中为 10 到 19,带有前缀“TenToTwentyRange”)。

如果您希望 TEST_P 执行特定范围(或使用不同的参数),您需要创建一个单独的测试装置并根据您的需要实例化它。翻转视角,测试装置定义了您运行的测试的参数(即 GetParam() 返回的内容),并确保与其关联的每个 TEST_P 针对每个参数执行一次。

幸运的是,您可以使用以下技巧来使事情变得更轻松:

创建一个包含所有设置/拆卸的普通(非参数化)测试夹具。然后从中导出一个简单的参数化测试夹具,并通过以下方式实例化它INSTANTIATE_TEST_CASE_P

#include "gtest/gtest.h"

class BaseTest : public ::testing::Test
{
  // Do your common stuff here
};

// FooTest
class FooTest: public BaseTest, public testing::WithParamInterface<int>
{
 public:
  FooTest() : BaseTest() {}
};

TEST_P(FooTest, DoesFoo)
{
  ASSERT_TRUE(true);
}

INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));

// BarTest
class BarTest: public BaseTest, public testing::WithParamInterface<int>
{
 public:
  BarTest() : BaseTest() {}
};

TEST_P(BarTest, DoesBar)
{
  ASSERT_TRUE(true);
}

INSTANTIATE_TEST_SUITE_P(TenToTwentyRange, BarTest, ::testing::Range(10, 20));


int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
Run Code Online (Sandbox Code Playgroud)