【问题标题】:GTest parametrized test unpack Values arguments from array or similarGTest 参数化测试从数组或类似文件中解包 Values 参数
【发布时间】:2021-07-14 21:04:00
【问题描述】:

使用 GTest 进行简单的参数化测试,例如:

class Example :public ::testing::TestWithParam<std::tuple<int, int>> {

};

TEST_P(LeapYearMultipleParametersTests, ChecksIfLeapYear) {
    int a = std::get<0>(GetParam());
    int b = std::get<1>(GetParam());
    ASSERT_EQ(a, b);
}

INSTANTIATE_TEST_CASE_P(
        Ex,
        Example,
        ::testing::Values(
                std::make_tuple(0, 0),
                std::make_tuple(1, 2)
));
                

如果我想从数组中生成值,例如:

auto make_values() {
 std::tuple<int, int> res[2];
 res[0] = std::make_tuple(0, 0);
 res[1] = std::make_tuple(1, 2);

 return res;
}

然后将该数组用作::testing::Values(...) 中的参数,例如:

INSTANTIATE_TEST_CASE_P(
        Ex,
        Example,
        ::testing::Values(make_values())
));

如何将数组解包为多个参数?


编辑:

我已经找到了定义模板函数的部分解决方案

template<typename T, std::size_t... I>
    auto values(T* t, std::index_sequence<I...>)
    {
        return ::testing::Values(t[I]...);
    }

然后像这样使用它:

values(make_values() /*res*/, std::make_index_sequence<2>{});

但是第二个参数std::make_index_sequence&lt;2&gt;{} 并不是很优雅。无论如何,另一个template 可以提供第二个参数吗?

【问题讨论】:

    标签: c++ c++17 googletest parametrized-testing


    【解决方案1】:

    问题的关键是使用::testing::ValuesIn 而不是::testing::Values。因为在您的情况下,您传递的是容器而不是一堆值。完整的答案如下所示:

    class Example : public ::testing::TestWithParam<std::tuple<int, int>> {
    };
    
    TEST_P(Example, ChecksIfLeapYear)
    {
        int a = std::get<0>(GetParam());
        int b = std::get<1>(GetParam());
        ASSERT_EQ(a, b);
    }
    
    using ValuesContainer = std::vector<std::tuple<int, int>>;
    
    ValuesContainer make_values()
    {
        ValuesContainer res;
        res.emplace_back(0, 0);
        res.emplace_back(1, 2);
    
        return res;
    }
    
    INSTANTIATE_TEST_CASE_P(
        Ex,
        Example,
        ::testing::ValuesIn(make_values())
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多