2016-04-20 1 views
1

Я хочу параметризовать каталог, означает, что каждый файл из каталога the directory structure with two empty json and two empty cfg files должен обрабатываться параметризованным TEST_P. Это возможно?Могу ли я использовать вектор <string> со значением-параметризованным googletest

К сожалению, я получил сообщение об ошибке:

g++ -std=c++11 -g -L/opt/gtest/lib -lgtest -lgtest_main -lpthread -I./ -I../../src -I/opt/gtest/include -o test2 parametrized2.cpp 
parametrized2.cpp: In function 'testing::internal::ParamGenerator<std::vector<std::basic_string<char> > > gtest_ParametrizedGTestInstanceParametrizedGTest_EvalGenerator_()': 
parametrized2.cpp:57:5: error: could not convert 'testing::ValuesIn(const Container&) [with Container = std::vector<std::basic_string<char> >; typename Container::value_type = std::basic_string<char>]()' from 'testing::internal::ParamGenerator<std::basic_string<char> >' to 'testing::internal::ParamGenerator<std::vector<std::basic_string<char> > >' 
make: *** 

Что моя ошибка?

#include <iostream> 
#include <string> 
#include <vector> 
#include <gtest/gtest.h> 
#include <dirent.h> 

using namespace std; 

std::vector<std::string> jsonCfgFiles; 

//opening any folder and saving all file-names in a vector<string> 
std::vector<string> openDir(string path) 
{ 
    DIR* dir; 
    dirent* pdir; 
    vector<string> files; 
    dir = opendir(path.c_str()); 
    while (pdir = readdir(dir)) { 
    files.push_back(pdir->d_name); 
    } 
    return files; 
} 

vector<string> GetJsonCofigFiles(void) 
{ 
    vector<string> f; 
    std::vector<std::string> jsonCfgFilesLocal; 
    string buffer = ""; 
    f = openDir("oem"); // pass which dir to open 

    // collect only json files 
    for (auto i = f.begin(); i != f.end(); ++i) { 
    if ((*i).find(".json") != std::string::npos) { 
     buffer = "" + (*i); 
     jsonCfgFiles.push_back(buffer); 
    } 
    } 
    return jsonCfgFilesLocal; 
} 
// Using just string compiles well. Why is vector<string> not possible? 
class ParametrizedGTest : public testing::TestWithParam<vector<string> > { 
public: 
    ParametrizedGTest(); 
    virtual ~ParametrizedGTest(); 
}; 

ParametrizedGTest::ParametrizedGTest() 
{ 
} 

ParametrizedGTest::~ParametrizedGTest() 
{ 
} 

TEST_P(ParametrizedGTest, testParameter) 
{ 
    cout << (*(GetParam().begin())) << "," << endl; 
} 

INSTANTIATE_TEST_CASE_P(ParametrizedGTestInstance, 
         ParametrizedGTest, 
         ::testing::ValuesIn(jsonCfgFiles)); 

int main(int argc, char* argv[]) 
{ 
    jsonCfgFiles = GetJsonCofigFiles(); 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

Благодаря Марко Поповича теперь я решил это:

#include <iostream> 
#include <string> 
#include <vector> 
#include <gtest/gtest.h> 
#include <dirent.h> 

using namespace std; 

std::vector<std::string> jsonCfgFiles; 

std::vector<string> open1(string path) //opening any folder and saving all file-names in a vector<string> 
{ 
    DIR* dir; 
    dirent* pdir; 
    vector<string> files; 
    dir = opendir(path.c_str()); 
    while (pdir = readdir(dir)) { 
     files.push_back(pdir->d_name); 
    } 
    return files; 
} 

std::vector<string> GetJsonCofigFiles(void) 
{ 
    vector<string> f; 
    string buffer = ""; 
    std::vector<std::string> jsonCfgFiles; 
    f = open1("oem"); // pass which dir to open 
    for (auto i = f.begin(); i != f.end(); ++i) { 
     if ((*i).find(".json") != std::string::npos) { 
     buffer = "oem/" + (*i); 
     jsonCfgFiles.push_back(buffer); 
     } 
    } 
    return jsonCfgFiles; 
} 

class ParametrizedGTest : public testing::TestWithParam<string> { 
public: 
    ParametrizedGTest(); 
    virtual ~ParametrizedGTest(); 
}; 

ParametrizedGTest::ParametrizedGTest() 
{ 
} 

ParametrizedGTest::~ParametrizedGTest() 
{ 
} 

TEST_P(ParametrizedGTest, testParameter) 
{ 
    cout << GetParam() << endl; 
} 

INSTANTIATE_TEST_CASE_P(ParametrizedGTestInstance, 
         ParametrizedGTest, 
         ::testing::ValuesIn(jsonCfgFiles)); 

int main(int argc, char* argv[]) 
{ 
    jsonCfgFiles = GetJsonCofigFiles(); 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

После компиляции и запуска

[==========] Running 2 tests from 1 test case. 
[----------] Global test environment set-up. 
[----------] 2 tests from ParametrizedGTestInstance/ParametrizedGTest 
[ RUN  ] ParametrizedGTestInstance/ParametrizedGTest.testParameter/0 
oem/_PVO111k_.json 
[  OK ] ParametrizedGTestInstance/ParametrizedGTest.testParameter/0 (0 ms) 
[ RUN  ] ParametrizedGTestInstance/ParametrizedGTest.testParameter/1 
oem/_PVO112k.json 
[  OK ] ParametrizedGTestInstance/ParametrizedGTest.testParameter/1 (0 ms) 
[----------] 2 tests from ParametrizedGTestInstance/ParametrizedGTest (0 ms total) 

[----------] Global test environment tear-down 
[==========] 2 tests from 1 test case ran. (1 ms total) 
[ PASSED ] 2 tests. 

ответ

1

Проблема заключается в аргумент шаблона, который вы даете класса testing::TestWithParam. В документации указано, что параметр шаблона «T - это тип ваших значений параметров». Поскольку вы пытаетесь создать тесты, параметризованные по путям, до json файлов, тип, который вы хотите для своего дела: std::string, а не std::vector<std::string>. Изменение линии

class ParametrizedGTest : public testing::TestWithParam<vector<string> > { 

в

class ParametrizedGTest : public testing::TestWithParam<string> { 

и код будет компилироваться.

+0

Большое спасибо. Да, он хорошо компилируется со строкой. К сожалению, когда я запустил это, тестовый случай не будет выполнен: «Запуск 0 тестов из 0 тестовых случаев» – jejej

+0

@jejej Тестирование создается во время компиляции. Это означает, что вы не можете загружать пути файла во время выполнения программы, но вам нужно создать список фиктивных путей, которые будут использоваться. Попробуйте что-то вроде этого: 'std :: vector jsonCfgFiles {" path1 "," path2 "};'. В любом случае вы не должны писать модульные тесты, зависящие от текущего состояния среды. Единичные тесты должны быть полностью изолированы от окружающей среды. –

+0

В тестах необходимо прочитать содержимое json-файла. Только здесь json-файлы - пустые фиктивные файлы. К сожалению, другого пути нет. – jejej