用gtest搭建自己的算法测试环境

近来开始重视算法的学习,所以从现在开始尝试写写算法的方面的文章。做了两道题后,发现了问题,测试是个问题。为了测试,由于每个算法函数有相关的初始化数据,在加上测试数据,所以在main里面有太多注释,对今后的整理非常不利。所以考虑用个测试的框架,在经过不多的思考后,我选择了以前关注的gTest。

gTest是Google的开源C++单元测试框架Google Test的简称,cnblogs上有详细的中文教程。我一直是Google的粉丝,笃信Google出品,必属精品。呵呵!加上有详细的图文教程(虽然教程是基于Win32平台的),上手也很方便,以前也摆弄过。

从gtest的官方网站http://code.google.com/p/googletest/下载源码,解压。

./configure --prefix=/home/cherish/ares/

make &&make install

然后写一个程序gtest.cpp

int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

TEST(AlgoTest,continueMaxTest)
{
char str[]="abcd123ed125ss123456789d";
char *out;
ASSERT_EQ(9,continueMax(&out,str));
ASSERT_EQ('1',*out);
}

continueMax是要测试的函数--请哪怕是helloworld也行(此处随意)。

用g++编译gtest.cpp

要给出搜索路径

g++ -c -I ../include gtest.cpp -L../lib -lgtest -o gtest.o

请自行替换为你所需的路径

此时出错

有条错误为

undefined reference to `pthread_key_create'

必须添加pthread库才能编译,所以,编译命令为

g++ -c -I ../include gtest.cpp -L./ -L../lib -lgtest -lpthread -o gtest.o

运行编译出来的程序,出现

libgtest.so.0: cannot open shared object file 的错误

这是由于我是将lib安装在自定义的文件夹下,所以得指定共享库的搜索目录。

我比较失误的是在 Linux 共享库 LD_LIBRARY_PATH 与ld.so.conf之间耗费了太多的时间。我曾经想直接在.bashrc中添加export LD_LIBRARY_PATH 变量来实现对Libgtest的查找,但是总是失败(下一篇文章将讨论这种分歧)。无赖之下。只得修改ld.so.conf处。但是在Debian下,无须修改这个文件,只需在/etc/ld.so.conf.d目录下新建一个文本文件 home.conf内容为lib的路径/home/cherish/ares/lib即可

但是这时候还不算完,要执行命令sudo ldconfig更新/etc/ld.so.cache(ld.so 加载共享库的时候,会从 ld.so.cache 查找)

可以同过ldconfig -p|grep gtest来查看是否加载成功。在我的机器上输出的为

cherish@Ares:/etc/ld.so.conf.d$ sudo ldconfig -p|grep gtest
[sudo] password for cherish:
libgtest_main.so.0 (libc6) => /home/cherish/ares/lib/libgtest_main.so.0
libgtest_main.so (libc6) => /home/cherish/ares/lib/libgtest_main.so
libgtest.so.0 (libc6) => /home/cherish/ares/lib/libgtest.so.0
libgtest.so (libc6) => /home/cherish/ares/lib/libgtest.so

再运行就好。

此时的工作还没有完,由于每道题有相关的上下文,所以,最优的方案为某一个函数单独成文件,里面有题目的描述等,解法思路等。再在gtest.cpp中编写单独测试用例。

所以新建一个单独的头文件,内容为各个函数的声明,这个声明可能是C语言的,在联编时候可能会出错,所以最好添加#ifdef __cplusplus条件编译。

建立的头文件内容如下

#ifdef __cplusplus
extern "C" {
#endif
extern int continueMax(char **out,char *in);
extern char * firstUnique(char *buf);

#ifdef __cplusplus
}
#endif

在单独编写两个函数的c文件

cherish@Ares:~/ares/algo$ ls
algo continueMax.c firstUnique.c funlist.h gtest.cpp Makefile

再就是makefile的问题了,这个比较好办,在上篇文章中已经有所介绍。

在就是make,运行程序了。激动啊。呵呵!

[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from AlgoTest
[ RUN ] AlgoTest.continueMaxTest
[ OK ] AlgoTest.continueMaxTest (0 ms)
[ RUN ] AlgoTest.firstUniqueTest
[ OK ] AlgoTest.firstUniqueTest (0 ms)
[----------] 2 tests from AlgoTest (5 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (11 ms total)
[ PASSED ] 2 tests.

很可惜只能文字版(无法显示彩色的)。

到这里基本上就完成了,但是每做一个题目还得在funlist.h中添加声明,是否有可以考虑用脚本文件将其自动化,学海无涯,有待学习,稍后再奉上解决方案。

posted @ 2010-12-06 15:24  westfly  阅读(1241)  评论(0编辑  收藏  举报