Google C++ Testing Framework
Это заготовка статьи об информационных технологиях и вычислительной технике. Помогите Википедии, дополнив её. |
Google C++ Testing Framework
На сегодняшний день существует много средств модульного тестирования (англ. unit testing) для языка программирования С++. В середине 2008 года разработчики компании Google выложили в публичный доступ свою собственную разработку в области тестирования — Google C++ Testing Framework (простоты далее по тексту будет использоваться имя Google Test). Библиотека распространяется в исходных текстах под лицензией BSD. Некоторые части документации переведены на русский язык.
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);
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. Библиотека Google Mock позволяет не просто делать тестовые проверки, а задавать ожидаемое поведение программы в виде специальных комманд, что значительно упрощает и ускоряет написание тестов.