如何将全局变量用于"配置"在Googletest框架中进行多项测试

时间:2016-09-10 18:43:16

标签: c++ googletest emscripten

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

我的配置文件:config.hpp

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

每个测试* .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

PS。我的问题是变量CONFIG_VAR的多重定义。

我的解决方案基于related question

1 个答案:

答案 0 :(得分:3)

您需要的所有内容都是right here,位于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 而非 TEST

另一方面,如果你想要做的是在测试程序级别 - 在文件之间共享某些东西,则需要设置一个环境对象。像这样:

Environment * AddGlobalTestEnvironment(Environment * env);

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