gtest github链接:
https://github.com/google/googletest
如何执行sample:
进入gooletest/make执行make命令,会生成一些sample执行文件
选一个执行,./sample1_unittest,如果看到典型的gtest输出log就说明成功了
使用示例:
1、安装与验证完毕之后还不能直接使用
将${GTEST_DIR}/include/gtest这个目录拷贝到/usr/local/include
将${GTEST_DIR}/libgtest.a拷贝到/usr/local/lib
这样就可以直接使用头文件<gtest/gtest.h>和静态库libgtest.a
2、创建~/test目录,然后将${GTEST_DIR}/samples里面的sample1.cc sample1.h sample1_unittest.cc,拷贝过来。
3、写一个Test.cc,代码如下
#include "smaple1.h"
#include <gtest/gtest.h>
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc,argv);
RUN_ALL_TESTS():
return 0;
}
4、编译过程如下
$g++ -o sample1.o -c sample1.cc
$g++ -o sample1_unittest.o -c sample1_unittest.cc
$g++ -o Test.o -c Test.cc
$g++ -o main sample1.o sample1_unittest.o Test.o -lgtest -lpthread
由于/usr/local/include被拷贝了gtest目录 /usr/local/lib被拷贝了libgtest.a所以可以
直接使用<gtest/gtest.h>与-lgtest,另外也需要libpthread.a所以要加-lpthread
5、最后生成可执行文件main,$./main的输出结果与上面的./sample1_unittest一样的结果。
结合cmake使用gtest
参考:http://stackoverflow.com/questions/33638433/setup-google-test-in-clion
样例:https://github.com/kaizouman/gtest-cmake-example
具体步骤:
1、在已有的工程下创建一个单元测试目录${unit_test}
2、创建${unit_test}/gtest.cpp
#include "gtest/gtest.h"
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
3、创建${unit_test}/test1.cpp
#include <gtest/gtest.h>
TEST(FooTest, Test1) {
EXPECT_EQ(1, 1);
EXPECT_TRUE(3 > 0);
}
4、创建${unit_test}/CMakeLists.txt
set(EXECUTABLE_OUTPUT_PATH ../build/bin)
include_directories(../include)
add_executable(runUnitTests
gtest.cpp
test1.cpp)
target_link_libraries(runUnitTests
gtest
pthread)
编译运行
参考:
执行脚本:
#!/usr/bin/env bash
# install gtests script on mac
# https://gist.github.com/butuzov/e7df782c31171f9563057871d0ae444a
#usage
# chmod +x ./gtest_installer.sh
# sudo ./gtest_installer.sh
# Current directory
__THIS_DIR=$(pwd)
# Downloads the 1.8.0 to disc
function dl {
printf "\n Downloading Google Test Archive\n\n"
curl -LO https://github.com/google/googletest/archive/release-1.8.0.tar.gz
tar xf release-1.8.0.tar.gz
}
# Unpack and Build
function build {
printf "\n Building GTest and Gmock\n\n"
cd googletest-release-1.8.0
mkdir build
cd $_
cmake -Dgtest_build_samples=OFF -Dgtest_build_tests=OFF ../
make
}
# Install header files and library
function install {
printf "\n Installing GTest and Gmock\n\n"
USR_LOCAL_INC="/usr/local/include"
GTEST_DIR="/usr/local/Cellar/gtest/"
GMOCK_DIR="/usr/local/Cellar/gmock/"
mkdir $GTEST_DIR
cp googlemock/gtest/*.a $GTEST_DIR
cp -r ../googletest/include/gtest/ $GTEST_DIR
ln -snf $GTEST_DIR $USR_LOCAL_INC/gtest
ln -snf $USR_LOCAL_INC/gtest/libgtest.a /usr/local/lib/libgtest.a
ln -snf $USR_LOCAL_INC/gtest/libgtest_main.a /usr/local/lib/libgtest_main.a
mkdir $GMOCK_DIR
cp googlemock/*.a $GMOCK_DIR
cp -r ../googlemock/include/gmock/ $GMOCK_DIR
ln -snf $GMOCK_DIR $USR_LOCAL_INC/gmock
ln -snf $USR_LOCAL_INC/gmock/libgmock.a /usr/local/lib/libgmock.a
ln -snf $USR_LOCAL_INC/gmock/libgmock_main.a /usr/local/lib/libgmock_main.a
}
# Final Clean up.
function cleanup {
printf "\n Running Cleanup\n\n"
cd $__THIS_DIR
rm -rf $(pwd)/googletest-release-1.8.0
unlink $(pwd)/release-1.8.0.tar.gz
}
dl && build && install && cleanup
目录结构:
utils/
cStringUtils.cpp
cStringUtils.h
CMakeLists.txt
utils/tests/
gtestsMain.cpp
cStringUtilsTest.cpp
CMakeLists.txt
最外层CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(${GTEST_PROJECT} C CXX)
set(CMAKE_C_STANDARD 98)
set(CMAKE_CXX_STANDARD 98)
#include .h and .cpp files in util folder
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
##########
# GTests
#########
add_subdirectory(tests)
tests下的 CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
set(GTEST_PROJECT gtestProject)
enable_testing()
message("Gtest Cmake")
find_package(GTest REQUIRED)
# The utils, test, and gtests directories
include_directories("${CMAKE_CURRENT_SOURCE_DIR}")
include_directories("/usr/local/Cellar/gtest/include")
include_directories("/usr/local/Cellar/gtest/lib")
set(SOURCES
gtestsMain.cpp
../cStringUtils.cpp
cStringUtilsTest.cpp
)
set(HEADERS
../cStringUtils.h
)
add_executable(${GTEST_PROJECT} ${SOURCES})
target_link_libraries(${GTEST_PROJECT} PUBLIC
gtest
gtest_main
)
add_test(${GTEST_PROJECT} ${GTEST_PROJECT})
sample gtest
#include "gtest/gtest.h"
#include "cStringUtils.h"
namespace utils
{
class cStringUtilsTest : public ::testing::Test {
public:
cStringUtilsTest() : m_function_param(10) {}
~cStringUtilsTest(){}
protected:
virtual void SetUp()
{
// declare pointer
pFooObject = new StringUtilsC();
}
virtual void TearDown()
{
// Code here will be called immediately after each test
// (right before the destructor).
if (pFooObject != NULL)
{
delete pFooObject;
pFooObject = NULL;
}
}
StringUtilsC fooObject; // declare object
StringUtilsC *pFooObject;
int m_function_param; // this value is used to test constructor
};
TEST_F(cStringUtilsTest, testConstructors){
EXPECT_TRUE(1);
StringUtilsC fooObject2 = fooObject; // use copy constructor
fooObject.fooFunction(m_function_param);
pFooObject->fooFunction(m_function_param);
fooObject2.fooFunction(m_function_param);
}
} // utils end
sample gtest main
#include "gtest/gtest.h"
#include "cStringUtils.h"
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
在 utils进行编译
cmake .
make
./tests/gtestProject
https://stackoverflow.com/questions/8507723/how-to-start-working-with-gtest-and-cmake