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

VS2010下配置CppUTest

2016-10-03 17:48 120 查看
笔者最近在学习测试驱动开发,该书用到了CppUTest这个测试框架。然而网上只有一篇介绍vs2010下配置CppUTest的教程,而且不够详细,根据文中所述内容无法实现测试(大神肯定可以)。笔者在仔细研读CppUTest的例程后了解了配置方法,现与大家分享。

一、相关资源链接

CppUTest框架链接: http://download.csdn.net/detail/u012441819/9645092
正如资源中描述的那样,该框架在网上很容易搜到,只不过有时候官网上下不下来。大家如果用这个链接下的话,就算对笔者这篇文章的鼓励了(第一篇博文(*^-^*))。

测试驱动的嵌入式C语言开发: http://download.csdn.net/detail/u012441819/9645129
该书便为笔者目前正在学习的书籍,中英文的网上也很容易找到。笔者只是搬运工,收1分的劳务费意思意思<( ̄︶ ̄)>。

二、配置前扫盲(大神可直接跳过)

什么是动态链接库,什么是静态链接库?

简单说:在代码编译时被引用的库称为静态链接库,后缀为.lib;在代码运行时动态加载的库称为动态链接库,后缀为.dll。

为啥说这个呢,因为在做单元测试的时候,我们不希望测试的代码污染我们业务代码,写在一起的话看起来会很头疼,而且我们编程时讲究业务分块,所以很多代码封装成库,便于别人调用,也便于自己测试。

那CppUTest是什么鬼呢?其本质上就是一个静态链接库,只不过是开源的。因为我们在编程时需要用到CppUTest中的一些测试宏,测试在运行时需要对宏中实现的函数进行调用,所以工程属性中既要包含框架头文件所在目录,还要包含静态库的路径。

VS2010的属性页中包含目录、库目录、附加依赖项都是什么鬼?

项目属性——VC++目录——包含目录:当你的项目需要调用别人的库时,一般你都会知道该库的.h文件所在路径。把该路径包含进来,这样你的编译器就能看到别人的函数了。

项目属性——VC++目录——库目录:虽然编译器知道了别人库的函数名,但不知道这些函数要怎么实现。是动态加载还是静态加载?不管怎么加载,你都得告诉编译器要加载的库的目录。一般来说,当依赖的库比较多且都位于统一目录下时,通过此处设置统一目录比较方便;反之在附加依赖项中设置较为便利。

项目属性——C/C++——常规——附加包含目录:同VC++目录下的包含目录。

项目属性——链接器——输入——附加依赖项:和上述库目录类似,如果库目录指定了依赖库的目录,此处只需要添加依赖库的名称;反之则要添加依赖库的明确路径。注意我这里用的是明确而不是绝对,因为该路径可以用预定义宏拼接成相对路径或直接指定绝对路径。

三、项目配置

1. 在vs2010下新建win32控制台应用程序,配置如图1所示(以DataChange项目为例)。


2. 为DataChange的解决方案添加新的win32控制台应用程序,勾选空项目,建议命名为DataChangeTest,并将其设置为启动项目。

至此,项目新建完成:DataChange用于业务代码的实现,DataChangeTest用于业务代码的测试。也许看过其他配置教程的网友可能疑惑,CppUTest的框架哪去了?别急,下面的属性页配置就来解除大家的疑惑。

3. 打开DataChangeTest的属性页,配置包含目录、库目录,如图2所示。说明一下,我把下载的CppUTest框架放在了C盘根目录,而该框架的头文件则放于了框架include文件夹下的子文件夹下;又由于我创建的是静态库,所以业务代码在DataChange文件夹下,该文件夹和DataChangeTest文件夹平级,所以..\可以进入DataChangeTest的上一级目录。注意我在库目录中指定的目录。对框架的调用本质上就是对框架头文件和框架库的调用,所以无需像其他文章所述那样非要添加CppUTest的项目,指定了两个目录即可。



4. 配置附加依赖项。图3则是对链接器的附加依赖项进行配置,注意到我添加了CppUTest.lib项并利用宏添加了$(TargetDir)DataChange.lib项。CppUTest.lib位于图2中的库目录下,所以我直接写库的名称是绝对可以找到的。需要说明的是另一个库的路径。

$(TargetDir)含义是获取生成的.exe文件的路径,该值可以通过图3中的宏按钮点开后查询到。所以$(TargetDir)DataChange.lib在本项目中的路径就是C:\VisualStudio\DataChange\Debug\DataChange.lib。至此,配置全部完成,开始写代码。



四、代码编写

1. 在DataChange项目中新建exchange.h和exchange.c文件,分别添加代码。.h文件:

#ifndef _EXCHANGE_H
#define _EXCHANGE_H

#ifdef __cplusplus
extern "C" {
#endif

void DataExchange(int* first, int* second);

#ifdef __cplusplus
}
#endif

#endif

.c文件(请无视其中的错误,我们希望单元测试帮我们找到错误):
#include "exchange.h"

void DataExchange(int* first, int* second)
{
int* p = first;
first = second;
second = p;
}

对DataChange项目进行编译,会在C:\VisualStudio\DataChange\Debug目录下生成DataChange.lib文件。

2. 在DataChangeTest项目下添加main.cpp和ExchangeTest.cpp文件。ExchangeTest.cpp:

#include "CppUTest/TestHarness.h"
#include "exchange.h"

TEST_GROUP(Exchange)
{
};

TEST(Exchange, ExchangeTest)
{
int a, b;
a = 10;
b = 5;
DataExchange(&a, &b);
LONGS_EQUAL(5, a);
LONGS_EQUAL(10, b);
};

main.cpp:
#include "CppUTest/CommandLineTestRunner.h"

IMPORT_TEST_GROUP(Exchange);

int main(int ac, char** argv)
{
RUN_ALL_TESTS(ac, argv);

system("pause");
return 0;
}
3. 编译并运行,得到如下结果(不用关心编译时的警告,那是因为找不到框架的pdb文件,我们并不需要调试框架):



4. 修正exchange.c文件中的函数错误,代码如下:

#include "exchange.h"

void DataExchange(int* first, int* second)
{
int p = *first;
*first = *second;
*second = p;
}

5. 重新编译解决方案并运行,得到正确的结果。

后记:

由于笔者在配置CppUTest时走了一些弯路,究其原因还是很多概念不清,所以很多东西写得比较详细,可能在大神看来比较啰嗦。第一篇博客写完,自己对于链接库的导入已非常熟悉,感觉还是有价值的。最后想说明一下,该框架的例程是可以在编译时发现错误的,但我不清楚哪里配置有问题,编译时无法检查,只能通过运行控制台应用程序来发现问题。如果大家找到了正确的方法,还望不吝赐教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息