C ++ GTest TYPED_TEST的多个参数

问题描述 投票:2回答:1

我已经完成了几组测试:

TEST_F(FactoryShould, createAFromAModule)
{
    const auto stateMachine = createStateMachine(EModule_A);
    const auto* typedStateMachine =
        dynamic_cast<const BackEnd<transitiontable::A, Guard>*>(stateMachine.get());
    ASSERT_TRUE(typedStateMachine);
}

TEST_F(FactoryShould, createBFromBModule)
{
    const auto stateMachine = createStateMachine(EModule_B);
    const auto* typedStateMachine =
        dynamic_cast<const BackEnd<transitiontable::B, Guard>*>(stateMachine.get());
    ASSERT_TRUE(typedStateMachine);
}

有没有办法将它们变成Typed Tests?我所看到的只是一个变化参数的解决方案,我有2个变化的参数,EModule可以用于多个过渡表,所以像地图这样的东西看起来不错,但它是可行的吗?

c++ googletest
1个回答
3
投票

使用std::pair,您可以从任何其他两种中选择一种。 (并且使用std::tuple,您可以从任何其他N中制作一种类型)。

您可以编写googletest TYPED_TESTs,其中TypeParam假设std::pair<X,Y>列表中的值,对于成对参数类型XY,因此这样的TYPED_TEST的每个实例都有X定义为TypeParam::first_typeY定义为TypeParam::second_type。例如:

gtester.cpp

#include <gtest/gtest.h>
#include <utility>
#include <cctype>

struct A1 {
    char ch = 'A';
};

struct A2 {
    char ch = 'a';
};

struct B1 {
    char ch = 'B';
};

struct B2 {
    char ch = 'b';
};


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

using test_types = ::testing::Types<std::pair<A1,A2>, std::pair<B1,B2>>;
TYPED_TEST_CASE(pair_test, test_types);

TYPED_TEST(pair_test, compare_no_case)
{
    typename TypeParam::first_type param1;
    typename TypeParam::second_type param2;
    ASSERT_TRUE(param1.ch == std::toupper(param2.ch));
}

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

编译,链接,运行:

$ g++ -Wall -o gtester gtester.cpp -lgtest -pthread && ./gtester
[==========] Running 2 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 1 test from pair_test/0, where TypeParam = std::pair<A1, A2>
[ RUN      ] pair_test/0.compare_no_case
[       OK ] pair_test/0.compare_no_case (0 ms)
[----------] 1 test from pair_test/0 (0 ms total)

[----------] 1 test from pair_test/1, where TypeParam = std::pair<B1, B2>
[ RUN      ] pair_test/1.compare_no_case
[       OK ] pair_test/1.compare_no_case (0 ms)
[----------] 1 test from pair_test/1 (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 2 test cases ran. (0 ms total)
[  PASSED  ] 2 tests.
© www.soinside.com 2019 - 2024. All rights reserved.