Есть ли способ создать параматериализованные тестовые примеры GoogleTest, которые содержат не буквенно-цифровые символы?

#googletest #parameterization #non-alphanumeric

#googletest #параметризация #не буквенно-цифровые

Вопрос:

Я выполняю некоторые проверочные тесты для нескольких 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>amp; 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 . Но я бы предпочел, чтобы параметризованные имена совпадали с именами файлов, если это возможно.

Есть ли способ как-то обойти это ограничение? Я не могу постоянно изменять имена файлов и не могу использовать другую среду тестирования.

Комментарии:

1. Можете ли вы показать какой-нибудь код? Google Test не устанавливает принудительную связь между именами файлов и именами тестов.

2. Добавил немного кода. Я хотел бы, чтобы имена тестов совпадали с именами файлов для большей ясности, если это возможно.

Ответ №1:

Это невозможно. Вы уже процитировали соответствующий комментарий из документации. Причина в том, что Google Test использует имя теста для генерации идентификаторов C (имен классов). Идентификаторы C ограничены буквенно-цифровыми символами (и символами подчеркивания, но вы не должны использовать символы подчеркивания в именах тестов).

Самое близкое, что вы можете сделать, это изменить реализацию PrintToStringParamName::operator()() и удалить не буквенно-цифровые символы из имени файла.