Google C++ Testing Framework
Google C++ Testing Framework — система модульного тестирования.
На сегодняшний день существует много средств модульного тестирования (англ. unit testing) для языка программирования С++. В середине 2008 года разработчики компании Google выложили[1] в публичный доступ свою собственную разработку в области тестирования — Google C++ Testing Framework (простоты далее по тексту будет использоваться имя Google Test). Библиотека распространяется в исходных текстах под лицензией BSD. Некоторые части документации переведены на русский язык.[2]
Google Test построена на известной методологии тестирования xUnit, то есть когда отдельные части программы (классы, функции, модули) проверяются отдельно друг от друга, в изоляции. Библиотека сама по себе разработана с активным применением тестирования, и если вы захотите что-то добавить в официальную версию, то кроме кода самих изменений вам придется написать набор тестов, подтверждающих их корректность.
Основные особенности
- Минимальной единицей тестирования является одиночный тест. Тесты не требуется отдельно регистрировать для запуска. Каждый объявленный в программе тест автоматически будет запущен.
- Тесты объединяются в группы (наборы). Полное имя теста формируется из имени группы и собственного имени теста.
- Тесты могут использовать общие данные (англ. test fixture), что позволяет логически объединять тесты и создавать универсальную среду для тестирования всего модуля или класса.
- Библиотека является безопасной для многопотокового использования, хотя сами разработчики дают конкретные рекомендации, как правильно ее использовать в программах, работающих в нескольних потоках.
Поддерживаемые платформы
Официально Google Test поддерживает Linux, Windows и Mac. Для этих платформ библиотека предоставляет все необходимые скрипты для сборки. Однако, Google Test также работает на AIX, HP-UX, Solaris, Tru64, zSeries и множестве других систем. Для официально неподдерживаемых платформ разработчик должен самостоятельно скомпилировать Google Test. Кроме этого, авторы включили в состав библиотеки специальный скрипт, который упаковывает всю библиотеку всего в два файла: gtest-all.cc и gtest.h. Эти файлы могут быть включены в состав проекта без каких-либо дополнительных усилий по предварительной сборке библиотеки.
Пример тестирования свободной функции
Например, имеется функция, возвращающая целое:
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);
}
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. Библиотека Google Mock позволяет не просто делать тестовые проверки, а задавать ожидаемое поведение программы в виде специальных команд, что значительно упрощает и ускоряет написание тестов.