Как избежать неопределенного поведения C ++, дурачащего GoogleTest - PullRequest
0 голосов
/ 11 июля 2019

Я пишу тесты для своего класса контейнера, и многие из этих тестов проверяют методы запросов, которые возвращают true или false. Пример:

myContainer.add(obj);
EXPECT_TRUE(myContainer.contains(obj));

Проблема в том, что многие из этих тестов проходят даже без MyContainer реализации.

Я думаю , что я уже нашел причину этого, и это показано ниже (проблема в том, что RealityTest.Sneaky проходит):

TEST(RealityTest, True) {
  bool b = true;
  EXPECT_TRUE(b);
  EXPECT_FALSE(b);
}
TEST(RealityTest, False) {
  bool b = false;
  EXPECT_TRUE(b);
  EXPECT_FALSE(b);
}
TEST(RealityTest, RandomBool) {
  bool b = random_bool();
  EXPECT_TRUE(b);
  EXPECT_FALSE(b);
}
TEST(RealityTest, Sneaky) {
  bool b = sneaky();
  EXPECT_TRUE(b);
  EXPECT_FALSE(b);
}
TEST(RealityTest, NoBool) {
  bool b = no_bool();
  EXPECT_TRUE(b);
  EXPECT_FALSE(b);
}

С функциями, используемыми в тестах, определенных следующим образом:

bool random_bool() {
  static std::random_device dev;
  static std::uniform_int_distribution dist(0, 1);
  return dist(dev);
};

bool sneaky() { cout << "brought to you by GCC (C++17)" << endl; }

bool no_bool() {}

Как мне писать тесты, чтобы этот «подлый» механизм не мог их обмануть, потому что на данный момент, если бы я реализовывал только такие вещи, как MyContainer::add, MyContainer::get и MyContainer::remove, тогда все мои тесты пройти, несмотря на то, что все эти методы запроса не работают.

Примечание: я строю все (тесты и MyContainer) без какой-либо оптимизации компилятора (режим отладки в Qt Creator).

Примечание 2: Я использую Qt Creator, но не какой-либо из модулей / библиотек Qt. Просто C ++ 17 с googletest и pthread (я на Linux).

1 Ответ

1 голос
/ 15 июля 2019

Ваш компилятор должен предупредить , что в вашей функции есть пути, которые не возвращают значение.Если это не так, увеличьте свой уровень предупреждения (например, -Wall и / или -Wextra) и убедитесь, что эти предупреждения не подавлены.

В случае, если вы (или ваши коллеги)склонны игнорировать эти предупреждения, используйте -Werror, чтобы превратить их (ну, все предупреждения) в ошибки компиляции - таким образом ваш проект не будет компилировать если есть вещи, которые опровергают эти предупреждения, например, наличие пути, который не возвращает значение.

При этом GoogleTest не может помочь вам найти эти ошибки - он работает только сскомпилированные объекты, поэтому он не может сказать, что ваша bool sneaky() функция не имеет правильного возвращаемого значения ... Помните: Неопределенное поведение может привести к перемещению во времени .. или разрешить bИСТИНА и ЛОЖЬ одновременно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...