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

转载于:https://www.cnblogs.com/westfly/archive/2010/12/06/1897786.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用gtest进行多进程测试的一般步骤如下: 1. 创建一个测试用例类,该类继承自 `testing::Test`。 2. 在测试用例类中定义测试用例,确保每个测试用例都可以在独立的进程中运行。可以通过在 `SetUp()` 函数中启动一个独立的进程来实现这一点。 3. 使用 `EXPECT_XXX()` 或 `ASSERT_XXX()` 宏来测试预期结果。确保使用正确的宏来进行测试,以便出现错误时能够清楚地了解问题所在。 4. 在 `TearDown()` 函数中清理测试用例。 下面是一个示例: ```c++ #include <gtest/gtest.h> #include <cstdlib> #include <iostream> class MultiProcessTest : public testing::Test { public: MultiProcessTest() {} protected: virtual void SetUp() { // 启动一个独立的进程 pid_ = fork(); if (pid_ == -1) { std::cerr << "Failed to fork process\n"; exit(1); } else if (pid_ == 0) { // 子进程 exit(runChildProcess()); } else { // 父进程 std::cout << "Started child process with PID " << pid_ << "\n"; } } virtual void TearDown() { // 等待子进程退出 int status; wait(&status); if (WIFEXITED(status)) { std::cout << "Child process exited with status " << WEXITSTATUS(status) << "\n"; } else { std::cout << "Child process terminated abnormally\n"; } } private: pid_t pid_; int runChildProcess() { // 在子进程中运行测试代码 testing::InitGoogleTest(); return RUN_ALL_TESTS(); } }; TEST_F(MultiProcessTest, Test1) { // 在此处编写测试代码 EXPECT_EQ(1, 1); } TEST_F(MultiProcessTest, Test2) { // 在此处编写测试代码 EXPECT_EQ(2, 2); } ``` 在上面的示例中,`MultiProcessTest` 继承自 `testing::Test`,并在 `SetUp()` 函数中启动一个独立的进程。每个测试用例都可以在这个进程中运行,从而保证了测试用例之间的独立性。在 `TearDown()` 函数中,等待子进程退出并打印退出状态。 注意,在测试用例中启动新的进程时,需要使用 `fork()` 系统调用。此外,使用 `wait()` 函数等待子进程退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值