C++和Google测试

yquaqz18  于 2023-05-20  发布在  Go
关注(0)|答案(1)|浏览(120)

我正在查看Google Test参数化测试。他们看起来真的很好,但是,除非我错过了一个技巧,我不能看到你如何使用一个不同的测试数据集为每个测试..我用了一个例子,我发现online工作得很好,但看起来我需要创建一个新的类,即。FooTest1,2,3,4等,以便为每个人提供INSTANTIATE_TEST_CASE_P,如果我想提供不同参数的TEST_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));

有谁能证实这是否可以以不同的方式实现?
谢谢

83qze16e

83qze16e1#

不幸的是,没有简单的方法可以解决这个问题。
每个INSTANTIATE_TEST_CASE_P示例化一个(参数化的)测试夹具(class FooTest: public ::testing::TestWithParam < int >{....}),并提供测试值范围(在INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10))的情况下,值从1到9 -记住,不包括最终值
每个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 fixture的测试也执行该范围(在本例中为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();
}

相关问题