51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3072|回复: 1
打印 上一主题 下一主题

cppunit在linux下的安装使用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-8-11 17:04:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,cppunit怎么在linux下使用呢?我现在用网上常见的例程“helloworld“来调试,但是这里面头文件都找不到,报的错误是:no such file or directory.这是怎么回事儿啊?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2009-9-3 15:59:22 | 只看该作者
一、        CppUnit linux 安装
CppUnit测试框架的源代码可以到 http://sourceforge.net/projects/cppunit/ 上下载,当前最高版本为cppunit-1.12.0.tar.gz。 上传到linux服务器的某一个目录下(比如事先建立的/home/cppunit目录下)。接下来的步骤就是在linux安装cppunit(我这里的版本RedHat是内核版本是2.4.20-8)
[root@testhost testexample]# uname -a
Linux testhost 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux)。
第一步:解压文件
gzip –d  cppunit-1.12.0.tar.gz
tar –xvf  cppunit-1.12.0.tar
第二步:编译cppunit的源代码(在windows下我们也要编译它)
跳转到源文件的目录:cd  ./ cppunit-1.12.0
生成make file文件,使用命令(需要查看configure详细命令可以输入info configure): ./configure (说明:$(CPPUNITSETUPDIR)表示安装目录(root用户安装缺省为/usr/local,没有超级用户权限的可以安装在自己建立的目录下))
然后安装: make
然后检查安装可以跳过: make check
然后: make install (说明,make install并没有把头文件安装到/usr/include目录中,此时我们可以先把/home/cppunit/cppunit-1.12.0/include目录下的cppunit目录归档,使用命令tar -cvf cppunit.tar ./cppunit ,然后使用mv 命令把它移动到/usr/include目录下,然后在/usr/include目录下使用tar -xvf cppunit.tar 解规档即可。这样的做法有点类似于在VC环境下配置include的目录一样)在make check时可能会出现错误信息,可以不用管它。make install主要是将生成的静态链接库libcppunit.a和动态链接库libcppunit.so拷贝到$(CPPUNITSETUPDIR)/lib目录下,将头文件拷贝到$(CPPUNITSETUPDIR)/include目录下。
第三步:配置链接库路径,如果不配置路径可能会出现以下类似错误:error while loading shared libraries: libcppunit-1.10.so.2: cannot open shared object file: No such file or directory 实际上是找不到链接库,所以接下来我们使用vi 命令修改一下链接库配置文件/etc/ld.so.conf文件(呵呵,顺便说下,一般的配置文件都在/etc目录下)。在其中加入一行如下:/usr/local/lib  (说明:make install时就把链接库文件复制到/usr/local/lib目录下了,在windows下我们同样需要配置库的搜索路径。),忘了告诉你,为了使配置文件生效,您还需要使用ldconfig命令重新装载一下就可以了。可以使用:[root@testhost lib]# ldconfig -v | grep cppunit检查是否配置成功,到此为止,cppunit在linux下就算完全安装完成了。为了验证是否能正常工作,下面例子可以帮助你:
二、        CppUnit linux 使用
下面的测试代码来源于www.cppunit.sourceforge.net

#include <iostream>
#include <cppunit/TestRunner.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/extensions/TestFactoryRegistry.h>


class Test : public CPPUNIT_NS::TestCase
{
    CPPUNIT_TEST_SUITE(Test);
    CPPUNIT_TEST(testHelloWorld);
    CPPUNIT_TEST_SUITE_END();

    public:
    void setUp(void) {}
    void tearDown(void) {}

    protected:
    void testHelloWorld(void) { std::cout << "Hello, world!" << std::endl; }
};

CPPUNIT_TEST_SUITE_REGISTRATION(Test);

int main( int argc, char **argv )
{
    // Create the event manager and test controller
    CPPUNIT_NS::TestResult controller;

    // Add a listener that colllects test result
    CPPUNIT_NS::TestResultCollector result;
    controller.addListener( &result );        

    // Add a listener that print dots as test run.
    CPPUNIT_NS::BriefTestProgressListener progress;
    controller.addListener( &progress );      

    // Add the top suite to the test runner
    CPPUNIT_NS::TestRunner runner;
    runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );
    runner.run( controller );

    return result.wasSuccessful() ? 0 : 1;
}
写好上面的代码后,接下来是编译的过程,有两种方式,一种是链接静态库,一种是链接动态库,下面是链接静态库,编译命令如下:
[root@testhost testexample]g++ -L /usr/local/lib/libcppunit.a hellolinux.cpp -lcppunit -ldl -o hellolinux
编译选项中需要增加 -lcppunit -ldl两个选项,-lcppunit是连接cppunit的库,而cppunit的库中使用了dl库里面的函数。接下来你就可以运行一下,看看结果如何了:
[root@testhost testexample]# ./hellolinux
Test::testHelloWorldHello, world!
: OK

链接动态库,编译命令如下:
[root@testhost testexample]# g++ hellolinux.cpp -lcppunit -ldl -o hellolinux


另一例子,把如下的代码上传到一个目录,如math:
   
编译命令如下:
[root@testhost math]# g++ -L /usr/local/lib/libcppunit.a Main.cpp MathTest.cpp -lcppunit -ldl -o MathTest
然后执行:
[root@testhost math]# ./MathTest
..F


!!!FAILURES!!!
Test Results:
Run:  2   Failures: 1   Errors: 0


1) test: MathTest::testSub (F) line: 30 MathTest.cpp
assertion failed
- Expression: result == 1

整个的源代码如下:
/////////////////////////////////////////////////////////////////////
// Function: A simple Math test
// DATE    : 2008-1-16
// Author  : xulinlin
// Vesion  : V1.0
// FileName: MathTest.h
/////////////////////////////////////////////////////////////////////

//因为需要使用TestFixture这个类,所以引入HelperMacros.h头文件
#include "cppunit/extensions/HelperMacros.h"
//声明一个测试类
class MathTest : public CppUnit::TestFixture {
    // 添加一个TestSuite
    CPPUNIT_TEST_SUITE( MathTest );
    // 添加测试用例到TestSuite, 定义新的测试用例需要在这儿声明一下
    CPPUNIT_TEST( testAdd );
    CPPUNIT_TEST( testSub );
    // TestSuite添加完成
    CPPUNIT_TEST_SUITE_END();
protected:
    int x, y;       
public:
    MathTest() {}
    // 初始化函数
    void setUp ();
    // 清理函数
    void tearDown();
    // 测试加法的测试函数
    void testAdd ();
    // 测试减法的测试函数
    void testSub ();  
};

/////////////////////////////////////////////////////////////////////
// Function: A simple Math test
// DATE    : 2008-1-16
// Author  : xulinlin
// Vesion  : V1.0
// FileName: MathTest.cpp
/////////////////////////////////////////////////////////////////////
#include "MathTest.h"
// 把这个TestSuite注册到名字为"alltest"的TestSuite中, 如果没有定义会自动定义
// 也可以CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );注册到全局的一个未命名的TestSuite中.
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" );
// 下面不变
void MathTest::setUp()
{
    x = 2;
    y = 3;
}
void MathTest::tearDown()
{
}
void MathTest::testAdd()
{
    int result = x + y;
    CPPUNIT_ASSERT( result == 5 );
}

void MathTest::testSub()
{
    int result = x + y;
    CPPUNIT_ASSERT( result == 1 );
}

/////////////////////////////////////////////////////////////////////
// Function: Main file for test
// DATE    : 2008-1-16
// Author  : xulinlin
// Vesion  : V1.0
// FileName: Main.cpp
// Compile : g++ -L /usr/local/lib/libcppunit.a Main.cpp MathTest.cpp -lcppunit -ldl -o MathTest
/////////////////////////////////////////////////////////////////////
#include <cppunit/extensions/TestFactoryRegistry.h>
//使用文本执行器
#include <cppunit/ui/text/TestRunner.h>
// 如果不更改TestSuite, 本文件后期不需要更改.
int main()
{
        CppUnit::TextUi::TestRunner runner;
       
        // 从注册的TestSuite中获取特定的TestSuite, 没有参数获取未命名的TestSuite.
        CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry("alltest");
        // 添加这个TestSuite到TestRunner中
        runner.addTest( registry.makeTest() );
        // 运行测试
        runner.run();
}
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-23 21:40 , Processed in 0.072184 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表