2016-09-10 1 views
1

Я использую тестовую среду Google для C++. Каждый файл содержит config.hpp, который определяет глобальную конфигурационную переменную. Я хотел бы определить свою конфигурацию в переменной, а не в compile-time const или constexpr. Как я могу определить зависимости, чтобы иметь одну и ту же переменную в разных файлах, которые связаны друг с другом? Нужно ли использовать синглтон? Можно ли это избежать? Есть ли лучший рекомендуемый способ использования нескольких тестовых файлов xUnit style?Как использовать глобальную переменную для «конфигураций» в нескольких тестах в рамках Googletest

Мой конфигурационный файл: 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.

+0

Я не могу определить переменную _global_ в вашем примере кода? –

+0

Это 'CONFIG_VAR', определенная в' core/config.hpp' –

+1

, в чем проблема? Это несколько определений CONFIG_VAR? Затем он повторяется по этому вопросу: http://stackoverflow.com/questions/5370413/multiple-defined-symbols-c-error – PiotrNycz

ответ

2

Все, что вам нужно, это right here в официальном репозитории Google Test на GitHub.

Во всяком случае, разделяя что-то в том же тесте файла вы делаете это так:

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); 

Я никогда не работал с этим раньше, так что я не могу сказать вам об этом так много, но есть больше информации по этой ссылке я поделился выше. Обычно глобальные переменные затрудняют чтение кода и могут вызвать проблемы. Вам лучше избегать их.

Смежные вопросы