gpt4 book ai didi

c++ - Google Test中的测试类的构造方法

转载 作者:行者123 更新时间:2023-11-30 04:50:37 29 4
gpt4 key购买 nike

namespace {

using namespace std;
// Declare the google test case
class InjectorTest : public ::testing::Test {

std::shared_ptr<MyData>> m_reader;
public:
static void SetUpTestCase() {

}
static void TearDownTestCase() {

}

InjectorTest()
{
//Create Reader code here !!!!
m_reader = CreateReader();

}
std::shared_ptr<DDSTopicReader<MyData>> getXMLReader() {

return m_reader;
}
};

TEST_F(InjectorTest, CreateReaderAndGetTopic) {
auto reader = getXMLReader();
std::string topic_name = reader->getTopicName();
EXPECT_EQ(topic_name, "test_topic");
}
}; // anonymous namespace

我的问题是

1)当我运行测试用例 CreateReaderAndGetTopic时,是否在执行测试用例之前调用了InjectorTest的 Constructor?还是应该明确地称呼它?

2)我的类 InjectorTest应该具有构造函数,还是应该将构造函数内部的代码移至 SetUpTestCase

最佳答案

首先让我们提到静态类成员SetUpTestCaseTearDownTestCase已分别重命名为 SetUpTestSuite and TearDownTestSuite
从googletest v1.8开始。参见Beware of the nomenclature

他们这样做是因为名字SetUpTestCaseTearDownTestCase简直就是
误导。他们建议在每种测试情况下都将运行的功能
从定义它们的夹具类派生而来,不是。
实际上,SetUpTestCase是在从固定装置派生的所有测试中的第一个测试之前运行的
(如果您安装的是旧版googletest,则仍然是)和TearDownTestCase在从灯具进行的所有测试中的最后一个测试之后运行。

从googletest 1.8开始,所有源自固定装置的测试-我们将
自然地将其称为测试用例-统称为测试套件;
因此在所有功能之前运行的设置功能现在称为SetUpTestSuite之后运行的拆解函数称为TearDownTestSuite
我将使用新改进的名称,因为我拥有最新的googletest版本。

查看此gtest代码,该代码演示了灯具的调用顺序
构造函数和析构函数SetUpTearDownSetUpTestSuiteTearDownTestSuite:

gtester.cpp

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

struct fixture : ::testing::Test
{
fixture() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

~fixture() override {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

void SetUp() override {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

void TearDown() override {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

static void SetUpTestSuite() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}

static void TearDownTestSuite() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};

TEST_F(fixture, One) {
ASSERT_EQ(1,1);
}

TEST_F(fixture, Two) {
ASSERT_NE(1,0);
}

TEST_F(fixture, Three) {
ASSERT_LT(1,2);
}

如果您对此进行预处理,则可以在幕后获得一些有用的信息。
文件(最好是通过 pretty-print 进行传输),然后查看结果:
$   g++ -E -P gtester.cpp | clang-format > gtester.ii

gtester.ii中,您可以找到:
...
class fixture_One_Test : public fixture {
public:
fixture_One_Test() {}
private:
virtual void TestBody();
static ::testing::TestInfo *const test_info_ __attribute__((unused));
fixture_One_Test(fixture_One_Test const &) = delete;
void operator=(fixture_One_Test const &) = delete;
};
::testing::TestInfo *const fixture_One_Test::test_info_ =
::testing::internal::MakeAndRegisterTestInfo(
"fixture", "One", nullptr, nullptr,
::testing::internal::CodeLocation("gtester.cpp", 31),
(::testing::internal::GetTypeId<fixture>()),
::testing::internal::SuiteApiResolver<fixture>::GetSetUpCaseOrSuite(),
::testing::internal::SuiteApiResolver<
fixture>::GetTearDownCaseOrSuite(),
new ::testing::internal::TestFactoryImpl<fixture_One_Test>);
void fixture_One_Test::TestBody() {
switch (0)
case 0:
default:
if (const ::testing::AssertionResult gtest_ar =
(::testing::internal::EqHelper<
decltype(::testing::internal::IsNullLiteralHelper(
1, ::testing::internal::TypeIsValidNullptrConstant<decltype(
1)>()))::value>::Compare("1", "1", 1, 1)))
;
else
return ::testing::internal::AssertHelper(
::testing::TestPartResult::kFatalFailure, "gtester.cpp", 32,
gtest_ar.failure_message()) = ::testing::Message();
}
...

那就是测试用例:
TEST_F(fixture, One) {
ASSERT_EQ(1,1);
}

扩展到预处理后。当googletest运行测试用例 fixture.One时:
  • 构造一个fixture_One_Test的新实例-通过继承,它是fixture的新实例。
  • 调用基本fixture构造函数。
  • 调用派生的fixture_One_Test构造函数。 (但它是空的。)
  • Googletest通过fixture::Setup()实例调用fixture_One_Test
  • 它通过fixture_One_Test::TestBody()实例调用fixture_One_Test
    它执行测试用例的有效负载。
  • 它通过fixture::TearDown()实例调用调用fixture_One_Test
  • 它破坏了fixture_One_Test实例,该实例-
  • 调用fixture_One_Test析构函数,该析构函数很简单-
  • 调用fixture析构函数。

  • 类似于 fixture_Two_Testfixture_Three_Test

    在此之前,googletest调用 fixture::SetupTestSuite,如果它是
    被定义为。

    然后,googletest调用 fixture::TearDownTestSuite,如果它是
    被定义为。

    现在,让我们看看实际情况:
    $ g++ -Wall -Wextra -o gtester gtester.cpp -lgtest_main -lgtest -pthread
    $ ./gtester
    Running main() from /home/imk/Downloads/googletest-master/googletest/src/gtest_main.cc
    [==========] Running 3 tests from 1 test case.
    [----------] Global test environment set-up.
    [----------] 3 tests from fixture
    static void fixture::SetUpTestSuite()
    [ RUN ] fixture.One
    fixture::fixture()
    virtual void fixture::SetUp()
    virtual void fixture::TearDown()
    virtual fixture::~fixture()
    [ OK ] fixture.One (0 ms)
    [ RUN ] fixture.Two
    fixture::fixture()
    virtual void fixture::SetUp()
    virtual void fixture::TearDown()
    virtual fixture::~fixture()
    [ OK ] fixture.Two (0 ms)
    [ RUN ] fixture.Three
    fixture::fixture()
    virtual void fixture::SetUp()
    virtual void fixture::TearDown()
    virtual fixture::~fixture()
    [ OK ] fixture.Three (0 ms)
    static void fixture::TearDownTestSuite()
    [----------] 3 tests from fixture (0 ms total)

    [----------] Global test environment tear-down
    [==========] 3 tests from 1 test case ran. (0 ms total)
    [ PASSED ] 3 tests.
    SetUpTestSuite()TearDownTestSuite()各自仅运行一次。构造函数
    析构函数, SetUp()TearDown()各自运行3次=测试用例的数量
    在测试套件中。

    因此,对于您的两个问题:

    When I run the test case CreateReaderAndGetTopic does the Constructor of InjectorTest gets called before executing the test case? Or should it be called explictly ?



    必须调用 InjectorTest构造函数来构造 CreateReaderAndGetTopic_InjectorTest_Test类的实例,
    Googletest为您做什么。在 SetUp()之前调用它,在 TestBody()之前调用它,它是测试用例的有效负载。

    Should my class InjectorTest have a constructor...


    InjectorTest将有一个默认或您定义的构造函数;所以你
    想知道是否应该定义一个。

    如果您需要做的事情需要重新准备,则应该定义一个
    对于每个测试用例,最好在每个测试用例的 SetUp()之前完成。

    ... or should the code inside the constructor be moved to SetUpTestCase?



    构造函数中包含的代码:
    m_reader = CreateReader();

    应该移到 SetUpTestCase-也就是 SetUpTestSuite-如果有的话
    在准备每个测试用例时不需要重新进行操作,而是需要
    InjectorTest的所有测试案例之前完成一次。

    就目前而言,您无法将该构造函数代码移至 SetUpTestSuite中,因为它会初始化非静态代码 InjectorTest的类成员 m_reader。但是实际上您是否需要或想要一个新的 XMLReaderCreateReader()为每个测试用例创建?只有您可以决定。

    如果您确实想为每个测试用例创建一个新的阅读器,那么您将面临选择
    在构造函数或 SetUp()中创建它的过程。在这里,您可以通过
    Googletest常见问题解答 Should I use the constructor/destructor of the test fixture or SetUp()/TearDown()?

    关于c++ - Google Test中的测试类的构造方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54940586/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com