建议在C语言开发之CMakeLists(其三)中看一下代码结构,下面的内容仅仅涉及gtest测试C语言项目的方法。
具体思路
gtest可以用于C++的测试,无法直接应用到C语言项目中。我们不妨将C语言项目打包成静态库,在C语言项目外单独建立gtest测试文件。
extern
为了使C++调用C语言项目,需要在头文件部分添加extern “c”,告诉c++这是C语言程序。
项目目录结构如下:
|--test
| |--gtest.cpp
| |--alg
| | |--CMakeLists.txt
| | |--ut_alg.cpp
| | |--st_alg.cpp
| |--CMakeLists.txt
|--algprj
| |--alg
| | |--add
| | | |--add.c
| | | |--CMakeLists.txt
| | |--sub
| | | |--sub.c
| | | |--CMakeLists.txt
| | |--CMakeLists.txt
| | |--utils
| | | |--alg_template.h
| |--examples
| | |--add_example.c
| | |--sub_example.c
| | |--CMakeLists.txt
| |--include
| | |--alg.h
| |--CMakeLists.txt
| |--lib
| | |--libalg.a
| |--output //注意:output为make install之后产生的文件。
| | |--include
| | | |--alg.h
| | |--lib
| | | |--libalg.a
其中test为gtest模块,algprj为C语言项目模块,其它未涉及的具体代码见C语言开发之CMakeLists(其三)
为alg.h与alg/utils/alg_template.h分别添加extern,如下
alg.h
#ifndef __ALG_H
#define __ALG_H
#ifdef __cplusplus
extern "C" {
#endif
float my_sub32(float a, float b);
float my_add32(float a, float b);
double my_sub64(double a, double b);
double my_add64(double a, double b);
#ifdef __cplusplus
}
#endif
#endif
alg/utils/alg_template.h
#ifndef __ALG_TEMPLATE_H
#define __ALG_TEMPLATE_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef ALG32
#define FLOAT float
#define DT(func) func##32
#endif
#ifdef ALG64
#define FLOAT double
#define DT(func) func##64
#endif
#ifdef __cplusplus
}
#endif
#endif
test/gtest.cpp
#include "gtest/gtest.h"
int main(int argc, char *argv[]) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
test/alg/ut_alg.cpp,my_add32为C语言项目中的函数
#include<iostream>
#include "alg.h"
#include "gtest/gtest.h"
using namespace std;
TEST(add, utadd32) {
float a = 1, b = 2;
float c = my_add32(a, b);
ASSERT_EQ(c, 3.0);
}
TEST(add, utadd64) {
double a = 1, b = 2;
double c = my_add64(a, b);
ASSERT_EQ(c, 3.0);
}
test/alg/st_alg.cpp
#include<iostream>
#include "alg.h"
#include "gtest/gtest.h"
using namespace std;
TEST(sub, stsub32) {
float a = 2, b = 1;
float c = my_sub32(a, b);
ASSERT_EQ(c, 1.0);
}
TEST(sub, stsub64) {
double a = 1, b = 2;
double c = my_sub64(a, b);
ASSERT_EQ(c, -1.0);
}
test/CMakeLists.txt
#老三段
cmake_minimum_required(VERSION 2.8)
project(alg_gtest CXX)
#为了使用gtest,指定c++语言,为c++11版本
set(CMAKE_CXX_STANDARD 11)
#include与link目录为我们cmake ,make ,make install之后产生的头文件与静态库,具体见[C语言开发之CMakeLists(其三)]
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../algprj/output/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../algprj/output/lib)
#这里是新的用法,寻找OpenMP包
FIND_PACKAGE(OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
set(MODULES
alg
)
foreach(module ${MODULES})
add_subdirectory(${module})
endforeach()
add_executable(alg_gtest ${TEST_SRCS} gtest.cpp)
#gtest为gtest相关的库,alg为自己C语言项目的库
target_link_libraries(alg_gtest alg gtest)
test/alg/CMakeLists.txt
set(TEST_SOURCES
alg/ut_alg.cpp
alg/st_alg.cpp
)
set(TEST_SRCS ${TEST_SRCS} ${TEST_SOURCES} PARENT_SCOPE)
编译运行,查看gtest测试结果:
[==========] Running 4 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 2 tests from add
[ RUN ] add.utadd32
[ OK ] add.utadd32 (0 ms)
[ RUN ] add.utadd64
[ OK ] add.utadd64 (0 ms)
[----------] 2 tests from add (0 ms total)
[----------] 2 tests from sub
[ RUN ] sub.stsub32
[ OK ] sub.stsub32 (0 ms)
[ RUN ] sub.stsub64
[ OK ] sub.stsub64 (0 ms)
[----------] 2 tests from sub (0 ms total)
[----------] Global test environment tear-down
[==========] 4 tests from 2 test suites ran. (0 ms total)
[ PASSED ] 4 tests.
传送门
FIND_PACKAGE详解
C语言开发之CMakeLists以及gtest测试在C语言中的使用方法(其四)
C语言开发之CMakeList(其三)
C/C++开发之CMakeList(其二)
C/C++开发之CMakeLists(其一)