zoukankan      html  css  js  c++  java
  • 用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中添加声明,是否有可以考虑用脚本文件将其自动化,学海无涯,有待学习,稍后再奉上解决方案。

  • 相关阅读:
    14.6.1 Creating InnoDB Tables 创建InnoDB 表:
    mysql iot 主键自增列问题
    mysql iot 主键自增列问题
    perl 定义post接口
    perl 定义post接口
    [置顶] 一步步构建大型网站架构
    [置顶] 一步步构建大型网站架构
    技术人员如何面试
    技术人员如何面试
    技术人员如何面试
  • 原文地址:https://www.cnblogs.com/westfly/p/1897786.html
Copyright © 2011-2022 走看看