Мой первый пост здесь на русском, но так будет проще.
Столкнувшись недавно с необходимостью покрыть код тестами, я стал искать фреймворк для тестирования кода. Навскидку можно сразу же назвать несколько: xUnit, Boost Test Library, и GoogleTest (далее GT). Посмотрев несколько обзоров на хабре и stackoverflow, остановился на GT.
На первый взгляд, примеры выглядят не так уж и сложно. Однако возникает вопрос, как вообще добавить GT к своему проекту? На мой взгляд, с этим есть небольшие проблемы.
Сначала (на deb-based дистрибутивах):
1. sudo apt-get install libgtest-dev
Этот пакет установит всего лишь сорцы (i.e. header-files). Скомпилировать пакет нужно самому. Код теперь лежит в /usr/src/gtest
Идем в эту директорию, говорим
2. sudo cmake CMakeLists.txt && sudo make && sudo cp *.a /usr/lib
Последний шаг самый важный, мы сделаем копии полученных библиотек в /usr/lib, которые при установке libgtest-dev почему-то не устанавливаются.
Теперь, когда мы разобрались с установкой, мы можем попробовать написать и собрать самый простой пример.
#include <gtest/gtest.h>
#include <math.h>
double squareRoot(const double a)
{
double b = sqrt(a);
if(b != b) //nan check
{
return -1.0;
}
else
{
return sqrt(a);
}
}
TEST(SquareRootTest, PositiveNos)
{
ASSERT_EQ(6, squareRoot(36.0));
ASSERT_EQ(18.0, squareRoot(324.0));
ASSERT_EQ(25.4, squareRoot(645.16));
ASSERT_EQ(0, squareRoot(0.0));
}
TEST(SquareRootTest, NegativeNos)
{
ASSERT_EQ(-1.0, squareRoot(-15.0));
ASSERT_EQ(-1.0, squareRoot(-0.2));
}
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Объяснять здесь вроде особо нечего. У нас есть функция, вычисляющая квадратный корень. Мы покрываем её тестами, одни тесты проверяют корректность if-ветки, вторые – else-ветки. Потом мы запускаем прогон всех тестов.
Собирать будем командой
g++ -I usr/include/ test2.cpp -lgtest -lpthread -o test1
Запускаем test1, и получаем примерно вот что:
./test1
[==========] Running 2 tests from 1 test case.
[———-] Global test environment set-up.
[———-] 2 tests from SquareRootTest
[ RUN ] SquareRootTest.PositiveNos
[ OK ] SquareRootTest.PositiveNos (0 ms)
[ RUN ] SquareRootTest.NegativeNos
[ OK ] SquareRootTest.NegativeNos (19 ms)
[———-] 2 tests from SquareRootTest (19 ms total)
[———-] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (19 ms total)
[ PASSED ] 2 tests.
Что предстоит дальше – добавить сборку в cmake, и как-то сделать всё это дело более кроссплатформенным (попробовать под виндой).
P.S. Идеи, как заставить всё это работать, да и код тоже, были бессовестно взяты с нескольких зарубежных блогов.