微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GTest 参数化测试从数组或类似解包 Values 参数

如何解决GTest 参数化测试从数组或类似解包 Values 参数

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

        // Add an OnClickListener to the dialog,so that the selection will be handled.
        builder.setMultiChoiceItems(
                categories,checkedItems,new DialogInterface.OnMultiChoiceClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog,int which,boolean isChecked) {
                        checkedItems[which] = isChecked;
                    }
                }
        );

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

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,::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<2>{} 来提供第二个参数是可能的吗?

解决方法

问题的关键是使用 ::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())
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。