在Parasoft C++ test中进行Qt单元测试-阿里云开发者社区

开发者社区> 开发与运维> 正文

在Parasoft C++ test中进行Qt单元测试

简介:

为什么写这篇帖子

上周关键科技(Parasoft的代理)组织了一次C++test的公开课,就报名了(值得一提的是报名参加培训的学员都给了15天的C++test的正版许可)。在这次培训中确实学到了很多新的东西,所以趁着C++test的许可还没过期,把培训中学到的东西分享给需要的同仁。

这篇帖子都写了什么

在这篇帖子中我将详细讲述我是用的开发环境和测试环境,如何在Parasoft C++test中创建Qt的的测试工程,如何进行静态扫描,如何进行单元测试,如何插桩,以及一些使用C++test的小技巧。

这篇贴子中使用了什么环境

这篇帖子中使用的开发和测试环境分别为mingw4.4、Qt4.8.3和Parasoft C++test 9.6。

具体聊聊该怎么做

搭建开发和测试环境

首先我们在安装完以上三个软件以后需要配置环境变量,我的环境变量配置如下图所示。
1

创建Qt工程

搭建好环境创建一个带有Gui的Qt工程用于后边讲解,然后在工程中添加新类MyClass并在MyClass中添加以下内容。

#ifndef MYCLASS_H
#define MYCLASS_H

class MyClass
{
public:
    MyClass();
    int Add(int i, const int j);
private:
    int getNewNum(const int i);//插桩演示使用
};
#endif // MYCLASS_H



#include "MyClass.h"

MyClass::MyClass()
{
}

int MyClass::Add(int i, const int j)
{
    i = getNewNum(i);
    return i+j;
}

int MyClass::getNewNum(const int i)
{
    return i+5;
}

添加完代码以后编译运行,去工程的Debug目录下寻找Makefile.Debug文件,打开后在cc 和cxx 后边添加cpptestscan(注意cpptestscan一定要在gcc和g++的前边),之后回到qtcreater中重新debug编译。再次回到Debug目录下可以看到多了一个cpptestscan.bdf的文件,这个文件就是我们在c++test中创建工程需要的文件。

2

3

创建测试工程

铺垫了这么多终于到c++test出场了~
首先点击新建工程,创建测试工程。在前面我们生成了一个bdf文件,这个bdf文件就是在这里用到的。选中"创建来自构建数据文件(bdf)的项目"点击下一步,选择前面创建好的bdf文件直接完成。

4

5

静态扫描与单元测试

到目前为止,我们是可以对项目进行静态扫描和生成单元测试用例的,但是执行单元测试会报错。
如下面使用GJB8114规则进行代码规则静态扫描和生成单元测试用例。
静态扫描

6

控制台输出静态扫描结果(事实上,在C++test中做的所有测试都会在控制台中输出过程记录和结果,包括生成单元测试用例和执行单元测试。控制台的输出在出现错误时可以帮助我们进行排查)。
7

在质量任务中可以查看静态扫描的结果。
8

生成测试用例
9

测试用例结果,我们可以在测试用例历览器中查看生成的测试用例结果。
10

现在如果直接进行单元测试,在控制台窗口中可以看到一下错误信息。显然是包含的头文件以及类库没有找到,所以需要把对应的头文件和类库所在文件引入。
11

再次打开Makefile.Debug文件,找到INCPATH和LIBS对应的内容,之后到c++test中右键打开当前工程的属性,找到Parasoft->C++test->构建设置,将INCPATH的内容(注意我这里复制出来的内容都是相对路径,要修改成绝对路径)复制到编译器选项将LIBS的内容复制到连接器选项。

12

13

现在我们就可以正常进行单元测试了,我这里运行了一个MyClass::Add的测试用例,执行过的语句背景色会变成绿色。

14

插桩怎么做

在编写代码的时候难免会出现一个函数内调用另外一个函数的情况,这种情况下做单元测的时候被调用的函数可能由于某些原因会出现一些不可控的情况。这种时候,可以写一个桩函数替代原先的被调用的函数。
那么在c++test中怎么进行插桩呢,这就是本小结中要讲述的问题。
首先在c++test的菜单栏中点击Parasoft->显示视图->桩函数 调出桩函数窗口。

15

然后在桩函数窗口中找到我们打桩的函数。前面代码中,我们在Add函数中调用了getNewNum函数,这里我们对getNewNum进行打桩,右键创建用户桩函数。

16

给桩函数文件起个名字(注意,我们这创建的是c++工程,所以文件名的后缀不要写成.c,亲测会插桩失败)。创建号文件以后,到桩函数文件中,将函数体中内容全部删掉,加入新的内容,这里我直接让桩函数鸳鸯返回输入的数据return i。之后Add函数进行单元测试会自动使用桩函数替代原有的函数。

17

还有一些小技巧

最后在聊一聊在培训中学到的使用Parasoft的小技巧。

  • 将常用测试模板复制到用户自定义中
    点击Parasoft->测试配置,在内建中找到自己常用的几个模板右键点击复制,即可复制到用户自定义中,例如我比较常用的有静态扫描的GJB8114单元测试的Generate Stubs、Generate Unit Tests和Run Unit Tests。
  • 编辑用户自定义中的模板
    在用户自定义中的模板是可以自己编辑的,例如我比较习惯将Generate Unit Tests中生成选项卡下的测试套件中的测试套件输出文件和布局修改为”为每个测试的函数创建一个测试套件“。

18

  • 人工定义测试用例的输入输出
    在测试用例浏览器中选中相应的测试套件,右键新建数据源,编辑好数据源保存后,再次在测试用例浏览器中相应的测试套件中右键创建新的测试用例,这里依旧以Add函数为例,将参数中i和j以及输出中的int_return设置为表中对应的字段。

19

20

21

做完以上工作,就可以运行自定义的测试用例了,我的测试结果就像下面这个样子。

22

结束语

以上就是上周培训中学到的东西,如有不明白的欢迎留言交流,如帖子中有错误的地方同样欢迎留言批评指正,在此谢过路过的各位大神。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章