Google C++ Testing Framework

Поделись знанием:
Перейти к: навигация, поиск

Google C++ Testing Framework (Google Test) — библиотека для модульного тестирования (англ. unit testing) на языке С++. Исходные тексты открыты с середины 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].

Напишите отзыв о статье "Google C++ Testing Framework"

Примечания

  1. [googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html Google Testing Blog: Announcing: New Google C++ Testing Framework]
  2. [code.google.com/p/googletest-translations/ googletest-translations — Project Hosting on Google Code]
  3. [github.com/google/googletest/blob/master/googletest/docs/Primer.md#test-fixtures-using-the-same-data-configuration-for-multiple-tests Test Fixtures: Using the Same Data Configuration for Multiple Tests - Google Test Primer]
  4. [github.com/google/googletest/blob/master/googletest/docs/Primer.md#known-limitations Known Limitations - Google Test Primer]
  5. [github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md#general-syntax General Syntax - Google C++ Mocking Framework for dummies]
  6. [github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md#matchers-what-arguments-do-we-expect Matchers: What Arguments Do We Expect? - Google C++ Mocking Framework for dummies]
  7. [github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md#cardinalities-how-many-times-will-it-be-called Cardinalities: How Many Times Will It Be Called? - Google C++ Mocking Framework for dummies]
  8. [github.com/google/googletest/blob/master/googlemock/docs/ForDummies.md#ordered-vs-unordered-calls Ordered vs Unordered Calls - Google C++ Mocking Framework for dummies]

Ссылки

  • [github.com/google/googletest/ Проект Google C++ Testing Framework на Github]  (англ.)
  • [github.com/google/googletest/tree/master/googletest/docs Документация по Google C++ Testing Framework]  (англ.)
  • [github.com/google/googletest/tree/master/googlemock/docs Документация по Google C++ Mocking Framework]  (англ.)
  • [bitbucket.org/sonnayasomnambula/googletestprimerrussian/src Введение в Google C++ Testing Framework]
  • [bitbucket.org/sonnayasomnambula/googlemockfordummiesrussian/src Google C++ Mocking Framework для начинающих]


Отрывок, характеризующий Google C++ Testing Framework

«Что мне завидовать, мое не уйдет, и я сейчас, может быть, увижу государя!» подумал Ростов и поскакал дальше.
Поровнявшись с гвардейской пехотой, он заметил, что чрез нее и около нее летали ядры, не столько потому, что он слышал звук ядер, сколько потому, что на лицах солдат он увидал беспокойство и на лицах офицеров – неестественную, воинственную торжественность.
Проезжая позади одной из линий пехотных гвардейских полков, он услыхал голос, назвавший его по имени.
– Ростов!
– Что? – откликнулся он, не узнавая Бориса.
– Каково? в первую линию попали! Наш полк в атаку ходил! – сказал Борис, улыбаясь той счастливой улыбкой, которая бывает у молодых людей, в первый раз побывавших в огне.
Ростов остановился.
– Вот как! – сказал он. – Ну что?
– Отбили! – оживленно сказал Борис, сделавшийся болтливым. – Ты можешь себе представить?
И Борис стал рассказывать, каким образом гвардия, ставши на место и увидав перед собой войска, приняла их за австрийцев и вдруг по ядрам, пущенным из этих войск, узнала, что она в первой линии, и неожиданно должна была вступить в дело. Ростов, не дослушав Бориса, тронул свою лошадь.
– Ты куда? – спросил Борис.
– К его величеству с поручением.
– Вот он! – сказал Борис, которому послышалось, что Ростову нужно было его высочество, вместо его величества.
И он указал ему на великого князя, который в ста шагах от них, в каске и в кавалергардском колете, с своими поднятыми плечами и нахмуренными бровями, что то кричал австрийскому белому и бледному офицеру.
– Да ведь это великий князь, а мне к главнокомандующему или к государю, – сказал Ростов и тронул было лошадь.
– Граф, граф! – кричал Берг, такой же оживленный, как и Борис, подбегая с другой стороны, – граф, я в правую руку ранен (говорил он, показывая кисть руки, окровавленную, обвязанную носовым платком) и остался во фронте. Граф, держу шпагу в левой руке: в нашей породе фон Бергов, граф, все были рыцари.
Берг еще что то говорил, но Ростов, не дослушав его, уже поехал дальше.
Проехав гвардию и пустой промежуток, Ростов, для того чтобы не попасть опять в первую линию, как он попал под атаку кавалергардов, поехал по линии резервов, далеко объезжая то место, где слышалась самая жаркая стрельба и канонада. Вдруг впереди себя и позади наших войск, в таком месте, где он никак не мог предполагать неприятеля, он услыхал близкую ружейную стрельбу.
«Что это может быть? – подумал Ростов. – Неприятель в тылу наших войск? Не может быть, – подумал Ростов, и ужас страха за себя и за исход всего сражения вдруг нашел на него. – Что бы это ни было, однако, – подумал он, – теперь уже нечего объезжать. Я должен искать главнокомандующего здесь, и ежели всё погибло, то и мое дело погибнуть со всеми вместе».
Дурное предчувствие, нашедшее вдруг на Ростова, подтверждалось всё более и более, чем дальше он въезжал в занятое толпами разнородных войск пространство, находящееся за деревнею Працом.
– Что такое? Что такое? По ком стреляют? Кто стреляет? – спрашивал Ростов, ровняясь с русскими и австрийскими солдатами, бежавшими перемешанными толпами наперерез его дороги.
– А чорт их знает? Всех побил! Пропадай всё! – отвечали ему по русски, по немецки и по чешски толпы бегущих и непонимавших точно так же, как и он, того, что тут делалось.
– Бей немцев! – кричал один.
– А чорт их дери, – изменников.
– Zum Henker diese Ruesen… [К чорту этих русских…] – что то ворчал немец.
Несколько раненых шли по дороге. Ругательства, крики, стоны сливались в один общий гул. Стрельба затихла и, как потом узнал Ростов, стреляли друг в друга русские и австрийские солдаты.
«Боже мой! что ж это такое? – думал Ростов. – И здесь, где всякую минуту государь может увидать их… Но нет, это, верно, только несколько мерзавцев. Это пройдет, это не то, это не может быть, – думал он. – Только поскорее, поскорее проехать их!»
Мысль о поражении и бегстве не могла притти в голову Ростову. Хотя он и видел французские орудия и войска именно на Праценской горе, на той самой, где ему велено было отыскивать главнокомандующего, он не мог и не хотел верить этому.


Около деревни Праца Ростову велено было искать Кутузова и государя. Но здесь не только не было их, но не было ни одного начальника, а были разнородные толпы расстроенных войск.
Он погонял уставшую уже лошадь, чтобы скорее проехать эти толпы, но чем дальше он подвигался, тем толпы становились расстроеннее. По большой дороге, на которую он выехал, толпились коляски, экипажи всех сортов, русские и австрийские солдаты, всех родов войск, раненые и нераненые. Всё это гудело и смешанно копошилось под мрачный звук летавших ядер с французских батарей, поставленных на Праценских высотах.
– Где государь? где Кутузов? – спрашивал Ростов у всех, кого мог остановить, и ни от кого не мог получить ответа.
Наконец, ухватив за воротник солдата, он заставил его ответить себе.
– Э! брат! Уж давно все там, вперед удрали! – сказал Ростову солдат, смеясь чему то и вырываясь.