当前位置: 首页 > 知识库问答 >
问题:

GTest参数化测试从数组或类似文件中解包值参数

毋宪
2023-03-14

使用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


共有1个答案

喻昀
2023-03-14

问题的关键在于使用::testing::Values in而不是::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())
);
 类似资料:
  • 主要内容:1. 使用XML传递参数,2. 通过@DataProvider传递参数,3. @DataProvider + 方法,4. @DataProvider + ITestContextTestNG中的另一个有趣的功能是参数化测试。 在大多数情况下,您会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。 TestNG可以通过两种不同的方式将参数直接传递给测试方法: 使用 使用数据提供者 在本教程中,我们将向您展示如何通过XML 或将参数传递给方法。

  • 主要内容:1 参数化测试的介绍,2 使用@Parameter进行字段注入而不是构造函数,3 使用单个参数进行测试,4 识别单个测试用例1 参数化测试的介绍 自定义流道参数化实现参数化测试。运行参数化测试类时,将为测试方法和测试数据元素的叉积创建实例。 例如,要测试斐波那契函数,请编写: FibonacciTest的每个实例都将使用二元参数构造函数和方法中的数据值构造 @Parameters 。 2 使用@Parameter进行字段注入而不是构造函数 也可以将数据值直接注入字段中,而无需使用@Pa

  • 参数化测试可以用不同的参数多次运行测试。它们和普通的@Test方法一样声明,但是使用@ParameterizedTest注解。另外,您必须声明至少一个将为每次调用提供参数的来源(source)。 参数化测试目前是实验性功能。有关详细信息,请参阅实验性API中的表格。 @ParameterizedTest @ValueSource(strings = { "racecar", "radar", "a

  • 问题内容: 我在弄清楚以下RHS中期望使用什么类型参数时遇到问题 为什么副本不合法? 问题答案: 具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array Store检查无法从中分辨出来。 泛型的基本约定是:“我,编译器,保证如果编写的代码不生成警告,则在运行时永远不会得到类强制转换异常。” 编译器也不能向您保证,如果在数组中放

  • 我对JUnit测试非常陌生,我试图理解如何测试类的实例化。 假设我有以下类,它需要一个来实例化。当然,这个玩具列表是在程序的另一部分上创建的,但是我不太清楚应该在哪里创建它,以便对进行单元测试。 应该是这样吗? 基本上,我的问题是应该在哪里以及如何创建测试依赖于创建的列表的类所需的arraylist对象。

  • JUnit 4引入了一项名为parameterized tests的新功能。 参数化测试允许开发人员使用不同的值反复运行相同的测试。 创建参数化测试需要遵循五个步骤。 使用@RunWith(Parameterized.class)注释测试类。 创建一个使用@Parameters注释的公共静态方法,该方法返回一个对象集合(作为数组)作为测试数据集。 创建一个公共构造函数,它接受相当于一行“测试数据”