如何在Googletest框架中的多个测试中使用全局变量进行"configurations"

How to use a global variable for "configurations" in multiple tests in Googletest framework

本文关键字:全局变量 configurations 测试 Googletest 框架      更新时间:2023-10-16

我使用谷歌测试框架的c++。每个文件都包含一个config.hpp,它定义了一个全局配置变量。我想在一个变量中定义我的配置,而不是编译时const或constexpr。如何定义依赖关系,以便在链接在一起的不同文件中具有相同的变量?我必须使用单例吗?我能避免吗?是否有更好的推荐方法来使用xUnit风格的多个测试文件?

我的配置文件:config.hpp:

#pragma once
struct {
    const float tolerance = 0.001;
    // ...
} CONFIG_VAR;

每个test *.cpp源文件如下:

#include "gtest/gtest.h"
#include "core/config.hpp"
TEST(a, b) { ... }

主文件:

#include "gtest/gtest.h"
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

编译和链接使用:

em++  -I $GTEST_ROOT/googletest/include main_all_tests.cpp test_*.cpp

p。我的问题是变量CONFIG_VAR的多个定义。

我的解决方案是基于一个相关的问题

你所需要的一切都在这里在GitHub上的Google Test的官方存储库。

无论如何,要在同一个文件中共享一些东西,你可以这样做:

class YourTestCase : public ::testing::Test
{
protected:
    virtual void SetUp()
    {
        globalObject = new YourObject();
    }
    virtual void TearDown() {
        delete globalObject;
        globalObject = nullptr;
    }
    Object * globalObject = nullptr;
};

所以,在你的测试用例中:

TEST_F(YourTestCase, TestOne) {
    ASSERT_EQ("your value here", globalObject->getValue());
}
TEST_F(YourTestCase, TestTwo) {
    ASSERT_EQ("your value here", globalObject->getValue());
}
TEST_F(YourTestCase, TestThree) {
    ASSERT_EQ("your value here", globalObject->getValue());
}

。:注意函数名。这是 TEST_F 不是测试

另一方面,如果您想在测试程序级别进行操作——在文件之间共享某些内容,则需要设置一个环境对象。像这样:

Environment * AddGlobalTestEnvironment(Environment * env);

我以前从未使用过,所以我不能告诉你这么多,但是在我上面分享的链接中有更多的信息。通常,全局变量使代码更难阅读,并可能导致问题。你最好避开它们。