Получение элемента из производного элемента в googletest

#c #unit-testing #googletest

#c #модульное тестирование #googletest

Вопрос:

Я новичок в googletest и пытаюсь написать примеры модульного тестирования на C с использованием платформы googletest, код выглядит следующим образом:

 class TestInterface : public ::testing::Test
{
    protected:
        static void SetUpTestCase()     
        static void TearDownTestCase()
} ;

class Algo1Interface : public TestInterface
{
  public:
      virtual loadConfig(Inputs, Outputs);
  protected:
      virtual void SetUp()     {  /* Small per test set up */  }
      virtual void TearDown()  {  /* Small per test cleanup */  }
 };
  

Теперь мне нужно вывести другой Algo... тестовый интерфейс из Algo1Interface , чтобы я мог использовать общедоступные функции Algo1Interface в отдельных тестовых приспособлениях.

Например:

 class Algo2Interface : public Algo1Interface
{
public:
  virtual void SetUp()     {  /* Small per test set up */  }
  virtual void TearDown()  {  /* Small per test cleanup */  }
};
  

Чтобы написать тесты приспособления, такие как:

 TEST_F( Algo1Interface, test1_1 )
{
  // Do tests
}

TEST_F( Algo1Interface, test1_2 )
{
  // Do tests
}

TEST_F( Algo2Interface, test2_1 )
{
  // Use the public functions of Algo1Interface class(loadConfig)
  // Do tests
}
  

Вопрос:

  1. Можно ли это сделать?
  2. Если да, то кто-нибудь может объяснить, как это сделать?

Я пытался исследовать эту проблему, но не смог найти подходящего решения.

Ответ №1:

Да, это можно сделать очевидным образом. Любой класс, производный от ::testing::Test , является приспособлением googletest; таким образом, любой класс, производный от приспособления, также является приспособлением.

main.cpp

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


class TestInterface : public ::testing::Test
{
protected:
    static void SetUpTestCase() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    static void TearDownTestCase() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

class Algo1Interface : public TestInterface
{
public:
    virtual void loadConfig(std::string const amp; Inputs, std::string amp; Outputs) {
        Outputs = Inputs;
    }
protected:
    void SetUp() override {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    void TearDown() override {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

class Algo2Interface : public Algo1Interface
{
public:
    void SetUp() override {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    void TearDown() override {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

TEST_F( Algo1Interface, test1_1 )
{
    ASSERT_EQ(1,1);
}

TEST_F( Algo2Interface, test2_1 )
{
    std::string outputs;
    loadConfig("Config",outputs);
    ASSERT_EQ("Config",outputs);
}


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

Скомпилируйте, свяжите и запустите:

 $ g   -Wall -Wextra -o gtester main.cpp -lgtest -pthread
$ ./gtester 
[==========] Running 2 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 1 test from Algo1Interface
static void TestInterface::SetUpTestCase()
[ RUN      ] Algo1Interface.test1_1
virtual void Algo1Interface::SetUp()
virtual void Algo1Interface::TearDown()
[       OK ] Algo1Interface.test1_1 (0 ms)
static void TestInterface::TearDownTestCase()
[----------] 1 test from Algo1Interface (0 ms total)

[----------] 1 test from Algo2Interface
static void TestInterface::SetUpTestCase()
[ RUN      ] Algo2Interface.test2_1
virtual void Algo2Interface::SetUp()
virtual void Algo2Interface::TearDown()
[       OK ] Algo2Interface.test2_1 (0 ms)
static void TestInterface::TearDownTestCase()
[----------] 1 test from Algo2Interface (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 2 tests.
  

Комментарии:

1. Спасибо за помощь