您的位置:首页 > 编程语言 > C语言/C++

VS2005配置CPPUnit进行单元测试

2017-05-04 16:25 330 查看
说明:非常感谢原作者,我亲自操作测试编译成功。 注意是编译部分,其他部分还没有详细测到。关于使用vs2005编译,会生成的错误比较多,其中包含这篇文章提到的修改版本7为8就解决了其他错误。
另外编译的时候有一一项错误是 #error This add-in is for VC++ 6.0 only.  
这个告知我们这个DSPlugin项目是在vc6.0环境使用的,vs2003及以后的都不用该项目了。我觉得为了不碍眼直接从解决方案管理器移除该项目。
另外sourceforge的下载链接总是下载不成功,我只有从csdn的资源下载了。感谢这些大神有神机妙算到现在不能下载,在这里为我们做好了资源备份。

这篇文章有个需要更正的是关于两种版本的动态库名都是用release的。我这里把他们都用绝对路径的方法加进去了。

#ifndef _DEBUG
#pragma comment(lib, "C://cppunit-1.12.1//lib//cppunit_dll.lib")
#pragma comment(lib, "C://cppunit-1.12.1//lib//TestRunner.lib")
#else
#pragma comment(lib, "C://cppunit-1.12.1//lib//cppunitd_dll.lib")
#pragma comment(lib, "C://cppunit-1.12.1//lib//TestRunnerd.lib")
#endif
使用的动态库 需要放在输出的程序*.exe如果只是调试方便也可以把动态库所在路径设置到系统环境变量PATH里面。

前言:本文配置环境Windows XP + VS2005。CPPUnit版本为1.12.1。
      下载地址:http://sourceforge.net/projects/cppunit/files/
一、         编译CPPUnit工程
1、  解压文件cppunit-1.12.1.tar.gz。
2、  编译$BASE/src/cppunit/CppUnitLibraries.dsw中的cppunit_dll项目。这是CPPUnit基本类库。Release和debug版本需要同时编译。
3、  编译$BASE/src/cppunit/CppUnitLibraries.dsw中的TestRunner项目。这是使用MFC的图形化界面的类库。Release和debug版本需要同时编译。
注意:若使用VS2005编译,可能出现:
error C1104: fatal error importing libid: '80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2'
错误提示。只需要将其中7.0改为对应版本,比如8.0,重新编译即可。
4、  将编译生成的*.lib 和 *.dll 拷贝到目标程序执行目录下,在stdafx.h中增加如下代码:
#ifndef _DEBUG
#pragma comment(lib, "..//Debug//cppunit_dll.lib")
#pragma comment(lib, "..//Debug//TestRunner.lib")
#else
#pragma comment(lib, "..//Release//cppunit_dll.lib")
#pragma comment(lib, "..//Release//TestRunner.lib")
#endif
5、  通过菜单[Tools]à[Options],弹出对话框,Projects and Solutions中增加Include Files为$BASE/include。
二、        不使用辅助宏的CPPUnit使用方法
1、  新建一个基于对话框的MFC程序。工程名为CPPUnit。
2、  按照第一步的4、5步骤(也可以直接在工程中设置),使程序包含CPPUnit的头文件和编译时需要的*.lib文件。以及运行时需要的*.dll文件。
3、  增加C++类,CPlusTest,代码如下:
.h 文件

[cpp] view plain copy

#pragma once  
  
  
#include <cppunit/TestFixture.h>  
#include <cppunit/TestAssert.h>  
  
class CPlusTest : public CppUnit::TestFixture  
{  
public:  
    CPlusTest(void);  
    virtual ~CPlusTest(void);  
  
    void setUp();  
    void tearDown();  
    void TestEqual1();  
    void TestEqual2();  
  
private:  
    int x;  
    int y;  
};  

  
.cpp 文件

[cpp] view plain copy

#include "StdAfx.h"  
#include "PlusTest.h"  
  
CPlusTest::CPlusTest(void)  
{  
}  
  
CPlusTest::~CPlusTest(void)  
{  
}  
  
void CPlusTest::setUp()  
{  
    x = 1;  
    y = 2;  
}  
  
void CPlusTest::tearDown()  
{  
    x = 0;  
    y = 0;  
}  
  
void CPlusTest::TestEqual1()  
{  
    CPPUNIT_ASSERT(x + y == 4);  
}  
  
void CPlusTest::TestEqual2()  
{  
    CPPUNIT_ASSERT(x + y == 3);  
}  

    说明:
1)  测试类一般继承自TestFixture,它用来表示一个测试对象,用来组织测试用例。
2)  在每个测试用例执行之前,其所属类的setUp都会执行;之后,其所属类的tearDown都会执行。对本例而言,运行TestEqual1之前会执行setUp,之后会执行tearDown;运行TestEqual2之前也会执行setUp,之后也会执行tearDown。
3)  CPPUNIT_ASSERT用来判断括号内的值是true或者false。如果true,则表示测试成功;否则表示测试失败。也有一些别的宏可以使用。
 
4、  在CPPUnit.cpp中加入以下头文件:
#include <cppunit/ui/mfc/TestRunner.h>
#include <cppunit/testCaller.h>
#include <cppunit/TestSuite.h>
#include <cppunit/TestResult.h>
 
在InitInstance()函数中加入以下代码:

[cpp] view plain copy

CppUnit::MfcUi::TestRunner runner;  
  
CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("test");  
  
CppUnit::TestCaller<CPlusTest>*pTest1=new CppUnit::TestCaller<CPlusTest>("TestEqual1", &CPlusTest::TestEqual1);  
  
CppUnit::TestCaller<CPlusTest>*pTest2=new CppUnit::TestCaller<CPlusTest>("TestEqual2", &CPlusTest::TestEqual2);  
  
pSuite->addTest(pTest1);  
  
pSuite->addTest(pTest2);  
runner.addTest(pSuite);  
  
runner.run();  

  
说明:
1)       test suite和test case分别对应着树枝和树叶,runner对应着树根。test suite可以包含别的test suite,runner也可以直接包含test case。
2)       TestRunner、TestSuite 、TestCaller删除子集合的时候都使用delete,子集合都应该使用new 分配,然后添加到子集合中。
 
5、 删除显示对话框的代码!运行后显示界面为:
    


图1.1 CPPUnit运行界面
三、        使用辅助宏的CPPUnit使用方法
上述的方法在主函数中做大量添加test suite和test case的操作,操作比较烦琐,为了简化,CPPUnit提供了一些宏。
1、  改进测试类,添加以下代码:
CPPUNIT_TEST_SUITE(CPlusTest);
CPPUNIT_TEST(TestEqual1);
CPPUNIT_TEST(TestEqual2);
CPPUNIT_TEST_SUITE_END();
说明:
1)       要在类的最开头,即public前面加上这些语句。该类的TestEqual1和TestEqual2分别作为一个test case放在一个test suite中。该test suite的名称是类的名称,即“CPlusTest”。
2)       #include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
2、  测试类对应的CPP文件开始加入:
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(CPlusTest, "plusTest");
说明:表示添加该类对应的suite(“CPlushTest”)到一个名字是plusTest的test suite。同时plusTest这个test suite会被注册。另外,也可以使用
CPPUNIT_TEST_SUITE_REGISTRATION(CPlusTest);
将该类对应的suite加入到默认的test suite中(“All Tests”)。
3、  在Initance()函数中加入如下代码:
CppUnit::MfcUi::TestRunner runner;
CppUnit::Test* pSuite = CppUnit::TestFactoryRegistry::getRegistry("plusTest").makeTest();
runner.addTest(pSuite);
runner.run();
说明:
图形化界面中包含了三层树结构。第一层是plusTest,第二层是CPlusTest,第三层是TestPlus1和TestPlus2。可以给getRegistry不指定参数使用默认注册的test case,即“All Tests”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: