#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:
Да, это можно сделать очевидным образом. Любой класс, производный от ::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. Спасибо за помощь