【问题标题】:Is there a way to create a custom parameters generator with googletest?有没有办法使用 googletest 创建自定义参数生成器?
【发布时间】:2017-07-17 15:02:04
【问题描述】:

我实际上正在使用 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 生成器,它只会将 int 映射到 RegularPolygon::NbVertices 并将 double 映射到 RegularPolygon::Radius。

有办法吗?

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

【问题讨论】:

    标签: c++ googletest parameterized-unit-test


    【解决方案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)));
    

    【讨论】:

      【解决方案2】:

      我尝试为您的RegularPolygon 重载operator+operator&lt;

      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));
      

      【讨论】:

      • 这是一个很好的解决方案,但不完全是问题中所说的,因为这不提供对多边形属性的笛卡尔积的测试
      • @Kongol 因为我不太了解笛卡尔积所以我只给你一个原型。您必须以自己的方式实现operator&lt;operator+(符合笛卡尔积)。
      猜你喜欢
      • 2010-12-07
      • 2014-08-22
      • 2023-02-03
      • 2019-08-22
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2022-01-19
      相关资源
      最近更新 更多