4

我实际上正在使用 googletest 框架。我有一个值参数化测试

std::tuple<int, double> 

这个 int 表示正多边形中的顶点数,double 表示它的半径。我可以使用这样的结构来表示这一点:

struct RegularPolygon{
    int NbVertices;
    double Radius;
}

问题是我实际上使用组合参数生成器创建测试:

INSTANTIATE_TEST_CASE_P(RegularPolygon, PolygonTestCase, testing::Combine(
    testing::Range(3, 10),
    testing::Range(1.0, 10.0)));

所以如果我想切换到使用

RegularPolygon

struct 作为我的参数,我必须对两个范围的笛卡尔积进行硬编码。

除非有一种方法可以定义我自己的 RegularPolygon Generator,它只会将 int 映射到 RegularPolygon::NbVertices 并将 double 映射到 RegularPolygon::Radius。

有没有办法这样做?

如果没有,将元组转换为 RegularPolygon 实例的最佳做法是什么?

4

2 回答 2

1

只需将此元组转换为您的测试夹具类中所需的类型(请参阅polygonToTest成员变量):

class PolygonTestCase : public ::testing::TestWithParam<std::tuple<int, double>>
{
protected:
    RegularPolygon polygonToTest{ 
            std::get<0>(GetParam()), 
            std::get<1>(GetParam())
    };
};

TEST_P(PolygonTestCase, SomeTest)
{
    // have access here to polygonToTest.NbVertices and polygonToTest.Radius
}

INSTANTIATE_TEST_CASE_P(RegularPolygon, PolygonTestCase, testing::Combine(
    testing::Range(3, 10),
    testing::Range(1.0, 10.0)));
于 2017-07-20T08:41:08.317 回答
0

我尝试重载operator+operator<为您RegularPolygon

struct RegularPolygon{
    int NbVertices;
    double Radius;

    RegularPolygon(int a, double b) : NbVertices(a), Radius(b) {};

    bool operator<(const RegularPolygon& o) { return (NbVertices < o.NbVertices && Radius < o.Radius); }
    RegularPolygon operator+(const RegularPolygon& o) { return RegularPolygon(NbVertices + o.NbVertices, Radius + o.Radius);}
};

并使用:

RegularPolygon first(1, 1.0);
RegularPolygon end(10, 10.0);
RegularPolygon step(1, 1.0);

INSTANTIATE_TEST_CASE_P(RegularPolygonTest,
                        PolygonTestCase,
                        ::testing::Range(::first, ::end, ::step));
于 2017-07-17T15:58:43.897 回答