【问题标题】:Create gtest value parametrized test for a template class为模板类创建 gtest 值参数化测试
【发布时间】:2018-07-18 01:35:31
【问题描述】:

我有一个类型的模板类

<size_t N>
class Line {
   ...
};

我怎样才能为这个类的多个实例创建一个测试?例如行,行,...

我检查了文档,有:

  • 值参数化测试,用于运行时值

  • 类型参数化测试,允许您在编译时更改类型名称。

但是,我没有发现任何可以在编译时更改值的内容。

【问题讨论】:

  • 我猜你仍然可以创建一个模板类,它需要定义 static constexpr T value 作为其模板参数的类型?这可能有点乏味,但至少应该有效。 (ideone.com/4l4H7y)

标签: c++ unit-testing templates testing googletest


【解决方案1】:

Googletest 没有现成的解决方案来生成测试 一组非类型模板参数的模板,随心所欲。

假设 C++11 或更高版本,您可以利用 std::integral_constant&lt;T,N&gt; 创建一个唯一代表std::size_t 的每个范围的类 您希望测试覆盖Line&lt;N&gt; 的参数N,并使用std::integral_constant&lt;std::size_t,N&gt; 作为N 的代理来构造TYPED_TEST_CASE 和关联的TYPED_TESTs。像这样:

一个玩具Line类作说明:

Line.h

#ifndef LINE_H
#define LINE_H
#include <cstddef>

template <std::size_t N>
class Line {
public:
    static constexpr std::size_t capacity() {
        return N;
    }
    explicit Line(std::size_t n)
    : _length{n < N ? n : N}{};

    std::size_t length() const {
        return _length;
    }

private:
    std::size_t _length = 0;

};

#endif

Googletest 测试运行器:

line_test.cpp

#include <gtest/gtest.h>
#include <type_traits>
#include "line.h"

template <typename T>
class line_tester : public ::testing::Test{};

using test_types = ::testing::Types<
    std::integral_constant<std::size_t,2>,
    std::integral_constant<std::size_t,3>, 
    std::integral_constant<std::size_t,5>>;

TYPED_TEST_CASE(line_tester, test_types);

TYPED_TEST(line_tester, get_capacity) {
    static constexpr std::size_t n = TypeParam::value;
    ASSERT_EQ(n,Line<n>::capacity());
}

TYPED_TEST(line_tester, set_length_preserved) {
    Line<TypeParam::value> line{1};
    ASSERT_EQ(line.length(),1);
}

TYPED_TEST(line_tester, set_length_trunctated) {
    static constexpr std::size_t n = TypeParam::value;
    Line<n> line{999};
    ASSERT_EQ(line.length(),Line<n>::capacity());
}

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

运行如下:

$ ./line_tester 
[==========] Running 9 tests from 3 test cases.
[----------] Global test environment set-up.
[----------] 3 tests from line_tester/0, where TypeParam = std::integral_constant<unsigned long, 2ul>
[ RUN      ] line_tester/0.get_capacity
[       OK ] line_tester/0.get_capacity (0 ms)
[ RUN      ] line_tester/0.set_length_preserved
[       OK ] line_tester/0.set_length_preserved (0 ms)
[ RUN      ] line_tester/0.set_length_trunctated
[       OK ] line_tester/0.set_length_trunctated (0 ms)
[----------] 3 tests from line_tester/0 (1 ms total)

[----------] 3 tests from line_tester/1, where TypeParam = std::integral_constant<unsigned long, 3ul>
[ RUN      ] line_tester/1.get_capacity
[       OK ] line_tester/1.get_capacity (0 ms)
[ RUN      ] line_tester/1.set_length_preserved
[       OK ] line_tester/1.set_length_preserved (0 ms)
[ RUN      ] line_tester/1.set_length_trunctated
[       OK ] line_tester/1.set_length_trunctated (0 ms)
[----------] 3 tests from line_tester/1 (0 ms total)

[----------] 3 tests from line_tester/2, where TypeParam = std::integral_constant<unsigned long, 5ul>
[ RUN      ] line_tester/2.get_capacity
[       OK ] line_tester/2.get_capacity (0 ms)
[ RUN      ] line_tester/2.set_length_preserved
[       OK ] line_tester/2.set_length_preserved (0 ms)
[ RUN      ] line_tester/2.set_length_trunctated
[       OK ] line_tester/2.set_length_trunctated (0 ms)
[----------] 3 tests from line_tester/2 (0 ms total)

[----------] Global test environment tear-down
[==========] 9 tests from 3 test cases ran. (1 ms total)
[  PASSED  ] 9 tests.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多