Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用向量<;字符串>;用数值参数化谷歌测试_C++_Googletest - Fatal编程技术网

C++ 我可以使用向量<;字符串>;用数值参数化谷歌测试

C++ 我可以使用向量<;字符串>;用数值参数化谷歌测试,c++,googletest,C++,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::ParamGener

我想参数化一个目录,这意味着一个目录中的每个文件都应该由一个参数化测试处理。这可能吗

不幸的是,我犯了一个错误:

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: ***

问题是您给class
testing::TestWithParam
的模板参数。文档说明模板参数“T是参数值的类型”。由于您试图创建由json文件路径参数化的测试,因此您希望案例的类型是
std::string
,而不是
std::vector
。换乘线路

class ParametrizedGTest : public testing::TestWithParam<vector<string> > {
class ParameterizedgTest:公共测试::TestWithParam{

class ParameterizedgTest:公共测试::TestWithParam{

代码将被编译。

非常感谢。是的,它很好地使用字符串进行编译。不幸的是,当我运行此测试时,不会执行任何测试用例:“从0个测试用例运行0个测试”@测试在编译期间实例化。这意味着您不能在程序执行期间加载文件路径,但需要创建将使用的虚拟路径列表。请尝试以下操作:
std::vector jsoncfgffiles{“path1”、“path2”};
。无论如何,您都不应该编写依赖于环境当前状态的单元测试。单元测试应该与环境完全隔离。测试需要读取json文件内容。只有在这里,json文件是空的虚拟文件。不幸的是,没有其他方法。@jejej则不能使用值参数化测试这是一个单元测试框架,单元测试不依赖文件系统上的文件的存在。如果您正在编写这样的测试,则应该考虑使用其他的测试工具/框架。您可以编写一个加载JSON文件的脚本,并在<代码> CPP < /C>文件中插入必要的字符串。> JSONCFGfile 被初始化。然后在编译测试程序之前运行这个脚本,但是这是一个丑陋的黑客。正如我所说,如果你想这样做,你应该考虑使用除了GTest之外的东西。我应该在源文件中写入文件内容并编译吗?
#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.
class ParametrizedGTest : public testing::TestWithParam<vector<string> > {
class ParametrizedGTest : public testing::TestWithParam<string> {