有没有办法创建包含非字母数字字符的 Google Test 参数化测试用例?

Is there a way to create GoogleTest paramaterized test cases that contain non-alphanumeric characters?

我正在对几个 XML 文件执行一些验证测试,其中一些文件的名称中包含连字符。我创建了一个包含文件名(不包括扩展名)的参数化测试用例,但 GoogleTest 失败,因为

Note: test names must be non-empty, unique, and may only contain ASCII alphanumeric characters or underscore. Because PrintToString adds quotes to std::string and C strings, it won't work for these types.

class ValidateTemplates :public testing::TestWithParam<string>
{
public:
  struct PrintToStringParamName
  {
    template <class ParamType>
    string operator() (const testing::TestParamInfo<ParamType>& info) const
    {
      auto file_name = static_cast<string>(info.param);
      // Remove the file extension because googletest's PrintToString may only
      // contain ASCII alphanumeric characters or underscores
      size_t last_index = file_name.find_last_of(".");
      return file_name.substr(0, last_index);
    }
  };
};

INSTANTIATE_TEST_CASE_P(
  ValidateTemplates,
  ValidateTemplates,
  testing::ValuesIn(list_of_files),
  ValidateTemplates::PrintToStringParamName());

我想在 PrintToStringParamName 中打印文件名时将非字母数字字符换成下划线。但如果可能的话,我宁愿让参数化名称与文件名相同。

有什么办法可以绕过这个限制吗?我无法永久更改文件名,也无法使用其他测试框架。

那是不可能的。您已经引用了文档中的相关评论。原因是 Google Test 使用测试名称生成 C++ 标识符(class 名称)。 C++ 标识符仅限于字母数字字符(和下划线,但 you should not use underscores in test names)。

最接近的是更改 PrintToStringParamName::operator()() 的实现并从文件名中删除非字母数字字符。