Я хочу параметризовать каталог, означает, что каждый файл из каталога 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.
Большое спасибо. Да, он хорошо компилируется со строкой. К сожалению, когда я запустил это, тестовый случай не будет выполнен: «Запуск 0 тестов из 0 тестовых случаев» – jejej
@jejej Тестирование создается во время компиляции. Это означает, что вы не можете загружать пути файла во время выполнения программы, но вам нужно создать список фиктивных путей, которые будут использоваться. Попробуйте что-то вроде этого: 'std :: vector jsonCfgFiles {" path1 "," path2 "};'. В любом случае вы не должны писать модульные тесты, зависящие от текущего состояния среды. Единичные тесты должны быть полностью изолированы от окружающей среды. –
В тестах необходимо прочитать содержимое json-файла. Только здесь json-файлы - пустые фиктивные файлы. К сожалению, другого пути нет. – jejej