Google C++ Testing Framework

Из Википедии, бесплатной энциклопедии

Google C++ Testing Framework (Google Test) — библиотека для модульного тестирования (англ. unit testing) на языке C++. Исходные тексты открыты с середины 2008 года[1] под лицензией BSD. Документация частично переведена на русский язык.[2].

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

Основные особенности[править | править код]

  • Минимальной единицей тестирования является одиночный тест. Тесты не требуется отдельно регистрировать для запуска. Каждый объявленный в программе тест автоматически будет запущен.
  • Тесты объединяются в группы (наборы). Полное имя теста формируется из имени группы и собственного имени теста.
  • Тесты могут использовать тестовые классы (англ. test fixture)[3], что позволяет создавать и повторно использовать одну и ту же конфигурацию объектов для нескольких различных тестов.
  • Разработчики утверждают[4], что библиотека является безопасной для многопоточного использования, замечая при этом, что для использования утверждений в разных потоках одновременно необходимо самостоятельно разработать примитивы синхронизации.
  • В состав библиотеки входит специальный скрипт, который упаковывает её исходные тексты всего в два файла: gtest-all.cc и gtest.h. Эти файлы могут быть включены в состав проекта без каких-либо дополнительных усилий по предварительной сборке библиотеки.

Поддерживаемые платформы[править | править код]

Официально Google Test поддерживает Linux, Windows и Mac. Для этих платформ библиотека предоставляет все необходимые скрипты для сборки. Однако, Google Test также работает на AIX, HP-UX, Solaris, Tru64, zSeries и множестве других систем. Для официально не поддерживаемых платформ разработчик должен самостоятельно скомпилировать Google Test.

Пример тестирования свободной функции[править | править код]

Например, имеется функция, возвращающая целое:

 int Factorial(int n); // Вернуть факториал n 

Тест для этой функции может быть таким:

 // Проверить факториал от 0.  TEST(FactorialTest, HandlesZeroInput) {    EXPECT_EQ(1, Factorial(0));  }    // Проверить факториал некоторых положительных значений.  TEST(FactorialTest, HandlesPositiveInput) {    EXPECT_EQ(1, Factorial(1));    EXPECT_EQ(2, Factorial(2));    EXPECT_EQ(6, Factorial(3));    EXPECT_EQ(40320, Factorial(8));  } 

Пример тестирования класса[править | править код]

Тест для очереди типа FIFO с именем Queue, имеющей следующий интерфейс:

 template <typename E> // E - типа элемента.  class Queue {   public:    Queue();    void Enqueue(const E& element);    E* Dequeue(); // Возвращает NULL, если очередь пуста.    size_t size() const;    ...  }; 

Сначала определяется тестовый класс (англ. test fixture):

 class QueueTest : public ::testing::Test {   protected:    virtual void SetUp() {      q1_.Enqueue(1);      q2_.Enqueue(2);      q2_.Enqueue(3);    }        Queue<int> q0_;    Queue<int> q1_;    Queue<int> q2_;  }; 

Теперь сам тест (макрос TEST_F() используется вместо TEST(), так как тестирующая функция должна иметь доступ к полям и методам класса):

 // Проверка инициализации очереди.  TEST_F(QueueTest, IsEmptyInitially) {    EXPECT_EQ(0, q0_.size());  }    // Проверка извлечения элемента из очереди.  TEST_F(QueueTest, DequeueWorks) {    int* n = q0_.Dequeue();    EXPECT_EQ(NULL, n);          n = q1_.Dequeue();    ASSERT_TRUE(n != NULL);    EXPECT_EQ(1, *n);    EXPECT_EQ(0, q1_.size());    delete n;      n = q2_.Dequeue();    ASSERT_TRUE(n != NULL);    EXPECT_EQ(2, *n);    EXPECT_EQ(1, q2_.size());    delete n;  } 

В Google Test есть два основных типа проверок (утверждений) —- ASSERT_* и EXPECT_*. Если используется EXPECT_*, то в случае сбоя тест продолжит работу, хотя сбой будет зарегистрирован, и тест в любом случае считается неуспешным. Если же продолжение теста бессмысленно, используется ASSERT_*. Данная проверка прерывает работу теста в случае несрабатывания проверки.

Дополнительные возможности[править | править код]

Библиотека Google Test тесно связана с библиотекой Google Mock, позволяющей тестировать взаимодействие вашего класса с другими. С помощью этой библиотеки вы сможете убедиться в том, что ваш класс вызывает методы других объектов[5], а также проверить, что эти методы вызываются с нужными значениями параметров[6], нужное количество раз[7], в нужном порядке[8].

Примечания[править | править код]

  1. Google Testing Blog: Announcing: New Google C++ Testing Framework. Дата обращения: 16 июля 2009. Архивировано 5 апреля 2009 года.
  2. googletest-translations — Project Hosting on Google Code. Дата обращения: 28 апреля 2022. Архивировано 28 апреля 2022 года.
  3. Test Fixtures: Using the Same Data Configuration for Multiple Tests - Google Test Primer. Дата обращения: 25 апреля 2016. Архивировано из оригинала 5 апреля 2016 года.
  4. Known Limitations - Google Test Primer. Дата обращения: 25 апреля 2016. Архивировано из оригинала 5 апреля 2016 года.
  5. General Syntax - Google C++ Mocking Framework for dummies. Дата обращения: 25 апреля 2016. Архивировано 8 февраля 2016 года.
  6. Matchers: What Arguments Do We Expect? - Google C++ Mocking Framework for dummies. Дата обращения: 25 апреля 2016. Архивировано 8 февраля 2016 года.
  7. Cardinalities: How Many Times Will It Be Called? - Google C++ Mocking Framework for dummies. Дата обращения: 25 апреля 2016. Архивировано 8 февраля 2016 года.
  8. Ordered vs Unordered Calls - Google C++ Mocking Framework for dummies. Дата обращения: 25 апреля 2016. Архивировано 8 февраля 2016 года.

Ссылки[править | править код]