Каковы возможные способы тестирования приватных методов с помощью параметризованного модульного теста с помощью Google test API для C ++? - PullRequest
1 голос
/ 10 мая 2019

Я использую API Google Test для модульного тестирования кода C ++.

с примером API тестирования Google, я вижу, что есть опция для тестирования приватных методов с помощью макроса FRIEND_TEST.Также я вижу макросы TEST_P, INSTANTIATE_TEST_CASE_P для параметризованных тестов.

Поэтому я попробовал ниже логику реализовать параметризованный модульный тест для частного метода.Но я получил ошибку с 'Foo :: Bar': не могу получить доступ к приватному члену, объявленному в классе 'Foo' .когда я пытаюсь использовать класс FRIEND_TEST_Test3 для тестирования с параметризованным тестовым макросом TEST_P.

Поэтому, пожалуйста, дайте мне знать возможные способы тестирования приватного метода с параметризованным модульным тестом с помощью макроса Google test.

class Foo {
public:
  Foo() {}

private:
  int Bar() const { return 1; }

FRIEND_TEST(FRIEND_TEST_Test, TEST);
FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
FRIEND_TEST(FRIEND_TEST_Test3, TEST_P);
};

TEST(FRIEND_TEST_Test, TEST) {
  ASSERT_EQ(1, Foo().Bar());
}

class FRIEND_TEST_Test2 : public ::testing::Test {
public:
  Foo foo;
};

TEST_F(FRIEND_TEST_Test2, TEST_F) {
  ASSERT_EQ(1, foo.Bar());
}

class CodeLocationForTESTP : public ::testing::TestWithParam<int> {
};

INSTANTIATE_TEST_CASE_P(, CodeLocationForTESTP, ::testing::Values(0,1,2,1,0));

TEST_P(CodeLocationForTESTP, Verify) {
    ASSERT_TRUE(0==GetParam());
}


class FRIEND_TEST_Test3 : public ::testing::Test,public ::testing::TestWithParam<int> {
public:
  Foo foo;
};

INSTANTIATE_TEST_CASE_P(, FRIEND_TEST_Test3, ::testing::Values(0,1,2,1,0));

TEST_P(FRIEND_TEST_Test3, Verify) {
    ASSERT_EQ(1, foo.Bar());
}

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

Как указано в документе googletest , вторым аргументом FRIEND_TEST должно быть имя теста , которое мы хотим выполнить. Поскольку ваш 3-й модульный тест - TEST_P(FRIEND_TEST_Test3, Verify) и его имя теста - Verify, а не TEST_P, вы должны определить FRIEND_TEST(FRIEND_TEST_Test3, Verify) в частной области Foo.

Кроме того, поскольку ::testing::Test является базовым классом ::testing::TestWithParam, нам не нужно явно наследовать ::testing::Test до FRIEND_TEST_Test3.

Таким образом, следующий код будет хорошо работать для вас:

#include <gtest/gtest.h>
#include <gtest/gtest_prod.h>

class Foo
{
public:
    Foo() {}

private:
    int Bar() const { return 1; }

    FRIEND_TEST(FRIEND_TEST_Test3, Verify);
                                // ^^^^^^ not TEST_P
};

class FRIEND_TEST_Test3 : public ::testing::TestWithParam<int>
{
public:
    Foo foo;
};

INSTANTIATE_TEST_CASE_P(, FRIEND_TEST_Test3, ::testing::Values(0,1,2,1,0));

TEST_P(FRIEND_TEST_Test3, Verify)
{
    ASSERT_EQ(1, foo.Bar());
}
0 голосов
/ 10 мая 2019

Переместите тест в собственный файл (например, test.cpp). Этот файл может содержать только тестовый и не продуктивный код. Теперь добавьте #define private public at к - теперь вы можете получить доступ к приватным участникам, не вводя в тест странных получателей, друзей и т. Д.

Стандарт C ++ говорит, что это приводит к неопределенному поведению ( Определение частного к общему в C ++ ), но это никогда не создавало мне никаких проблем.

Я думаю, что не рекомендуется изменять наш код, чтобы сделать его тестируемым

...