googletest: тестирование слишком больших структур данных - PullRequest
0 голосов
/ 06 февраля 2020

Я пытался создать тестовый пример, где мои векторы слишком велики, чтобы их могла обработать моя функция, но моя проверка ввода не запускается при сравнении размера входного вектора с std :: vector

Я использую Bazel в качестве платформы для сборки и googletest в качестве моей тестовой среды.

Вот оператор проверки, используемый для определения вектора превышения размера:

std::vector<int> Solution::fit_sum(std::vector<int> v, int sum)
{
  // input validation
  if(v.empty() || 
    v.size() > v.max_size() ||
    v.size() < 0) // handle int overflow
  {
    printf("input invalid\n");
    return {};
  }
  printf("v.size = %d\n", v.size());
  printf("v.max_size() = %d\n", v.max_size());

// functional code below
}

Вот тестовый пример, который я создал :

TEST(FIT_SUM_TEST, TOO_LARGE) {
  Solution solution;
  std::vector<int> input;
  for (int i = 0; i < input.max_size() + 1; i++)
  {
    input.push_back(i);
  }
  int sum = 1;
  std::vector<int> actual = solution.fit_sum(input, sum);
  std::vector<int> expected = {};
  EXPECT_EQ(expected, actual);
}

Вывод выглядит следующим образом:

[ RUN      ] FIT_SUM_TEST.TOO_LARGE
v.size = -2147483648
v.max_size() = -1
[       OK ] FIT_SUM_TEST.TOO_LARGE (46174 ms)

Я немного сбит с толку, потому что я не ввожу свою проверку ввода, если утверждение выполнено даже при соблюдении условий.

Кто-нибудь знает, что происходит?

Редактировать:

Я понимаю, что то, что я проверяю, в корне неверно, потому что любая программа, создающая слишком большой массив, будет ломать sh.

Полагаю, лучше задать вопрос: 1) Как правильно учесть векторы, которые слишком велики? 2) Как определить, насколько велик "слишком большой"? 3) Сама функция имеет время выполнения O (n ^ 2). Есть ли другая линия ограничений, которую я должен наложить на мои данные, учитывая эту сложность?

1 Ответ

0 голосов
/ 12 февраля 2020

Ваш тест успешно завершен, потому что вы видите следующую строку:

[       OK ] FIT_SUM_TEST.TOO_LARGE (46174 ms)

Нет простого ответа на вопрос «когда вектор слишком велик?». В общем, вы хотите предварительно выделить память для вектора, если вы знаете его размер во время компиляции. Если вы этого не сделаете, то вектор будет часто изменяться в размере, требующем много времени. Используйте функцию std :: vector :: resize () или укажите размер вектора в конструкторе.

В вашем случае, однако, предварительное выделение памяти в начале не спасло вашу программу от сбоев. Если бы вы попытались предварительно выделить элементы max_size (), вы бы получили исключение bad_allo c, потому что для этого требуется огромный объем виртуальной памяти. push_back (), с другой стороны, прекратит выделять дополнительную память, когда доступная память будет исчерпана. Это может или не может быть через исключение в зависимости от реализации. https://en.cppreference.com/w/cpp/container/vector/push_back

Причина, по которой вы видите размеры в качестве отрицательных чисел, заключается в том, что вы используете неверную спецификацию типа в printf (). Вместо этого вы должны использовать std :: cout.

...