首页 > 解决方案 > C++ 模板和参数化 Google 测试

问题描述

假设我正在为一个名为的类编写模板class_a

bool test_success;
template <uint32_t len>
class class_a
{
    uint32_t do_something(void)
    {
        return len+1;
    }
};

我想用一系列不同的len值来测试这个类,所以我正在做一个参数化测试。

现在,在编写测试夹具时出现了问题:

class test_classa : public::testing::TestWithParam<    uint32_t    >
{
    void SetUp() override
    {
        test_success = false;
        // constexpr uint32_t a_len = GetParam(); //compiler error 1 (See below)
        // const uint32_t a_len = GetParam(); //compiler error 2 (See below)
        constexpr uint32_t a_len = 5; //Works! But that's not using the test parameter!
        class_a<a_len> a_test;
        if (a_test.do_something() == (a_len+1))
        {
           test_success = true;
        }
    }

    void TearDown() override
    {

    }
};

我的其余代码如下:

TEST_P(test_classa, test_classa) {
    EXPECT_EQ (test_success, true);
}

INSTANTIATE_TEST_SUITE_P(
        class_a,
        test_classa,
        ::testing::Values(
            10,
            20
            ));

那么有人可以帮助我如何完成这项工作吗?甚至可能吗?

编辑:

根据要求,这里是编译错误: (1) constexpr 变量 'a_len' 必须由常量表达式初始化 (2) 非类型模板参数不是常量表达式

标签: c++googletest

解决方案


至少您错误地派生了该类。尝试推导

class test_classa : public testing::TestWithParam<    uint32_t    >

编辑

提供详细信息后,我看到您正在为 a 分配一个函数调用constexpr,如果您的函数也是一个函数,这可能会起作用constexpr,因为constexpr已在编译时解析。我相信编译器消息包含类似的消息,例如“Function must be a constexpr”。

对于第二种情况,我不太了解您的GetParam函数的详细信息,并且由于您没有包含整个编译器消息,我相信,仔细阅读它会提示您在哪里找到要解决的问题。

如果到那时您还没有找到它,请更新问题并尝试在此处发布问题时提供尽可能多的信息。

编辑 2

现在我看到了第二个问题。它正在尝试使用const变量实例化模板。这是不可能的,因为 的值const variable是在运行时获取的,而模板是在编译期间实例化的。你不能做这样的事情。


推荐阅读