0

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

注意:测试名称必须是非空的、唯一的,并且只能包含 ASCII 字母数字字符或下划线。因为 PrintToString 为 std::string 和 C 字符串添加了引号,所以它不适用于这些类型。

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 中用非字母数字字符替换下划线来打印文件名。但如果可能的话,我宁愿保持参数化名称与文件名相同。

有没有办法以某种方式绕过这个限制?我无法永久更改文件名,也无法使用其他测试框架。

4

1 回答 1

0

这是不可能的。您已经引用了文档中的相关评论。原因是 Google Test 使用测试名称来生成 C++ 标识符(类名)。C++ 标识符仅限于字母数字字符(和下划线,但您不应在测试名称中使用下划线)。

您可以获得的最接近的是更改PrintToStringParamName::operator()()文件名中的非字母数字字符的实现和删除。

于 2021-03-03T11:45:42.030 回答