在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。
具体聊聊该怎么做
搭建开发和测试环境
首先我们在安装完以上三个软件以后需要配置环境变量,我的环境变量配置如下图所示。
创建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中创建工程需要的文件。
创建测试工程
铺垫了这么多终于到c++test出场了~
首先点击新建工程,创建测试工程。在前面我们生成了一个bdf文件,这个bdf文件就是在这里用到的。选中"创建来自构建数据文件(bdf)的项目"点击下一步,选择前面创建好的bdf文件直接完成。
静态扫描与单元测试
到目前为止,我们是可以对项目进行静态扫描和生成单元测试用例的,但是执行单元测试会报错。
如下面使用GJB8114规则进行代码规则静态扫描和生成单元测试用例。
静态扫描
控制台输出静态扫描结果(事实上,在C++test中做的所有测试都会在控制台中输出过程记录和结果,包括生成单元测试用例和执行单元测试。控制台的输出在出现错误时可以帮助我们进行排查)。
在质量任务中可以查看静态扫描的结果。
生成测试用例
测试用例结果,我们可以在测试用例历览器中查看生成的测试用例结果。
现在如果直接进行单元测试,在控制台窗口中可以看到一下错误信息。显然是包含的头文件以及类库没有找到,所以需要把对应的头文件和类库所在文件引入。
再次打开Makefile.Debug文件,找到INCPATH和LIBS对应的内容,之后到c++test中右键打开当前工程的属性,找到Parasoft->C++test->构建设置,将INCPATH的内容(注意我这里复制出来的内容都是相对路径,要修改成绝对路径)复制到编译器选项将LIBS的内容复制到连接器选项。
现在我们就可以正常进行单元测试了,我这里运行了一个MyClass::Add的测试用例,执行过的语句背景色会变成绿色。
插桩怎么做
在编写代码的时候难免会出现一个函数内调用另外一个函数的情况,这种情况下做单元测的时候被调用的函数可能由于某些原因会出现一些不可控的情况。这种时候,可以写一个桩函数替代原先的被调用的函数。
那么在c++test中怎么进行插桩呢,这就是本小结中要讲述的问题。
首先在c++test的菜单栏中点击Parasoft->显示视图->桩函数 调出桩函数窗口。
然后在桩函数窗口中找到我们打桩的函数。前面代码中,我们在Add函数中调用了getNewNum函数,这里我们对getNewNum进行打桩,右键创建用户桩函数。
给桩函数文件起个名字(注意,我们这创建的是c++工程,所以文件名的后缀不要写成.c,亲测会插桩失败)。创建号文件以后,到桩函数文件中,将函数体中内容全部删掉,加入新的内容,这里我直接让桩函数鸳鸯返回输入的数据return i
。之后Add函数进行单元测试会自动使用桩函数替代原有的函数。
还有一些小技巧
最后在聊一聊在培训中学到的使用Parasoft的小技巧。
- 将常用测试模板复制到用户自定义中
点击Parasoft->测试配置,在内建中找到自己常用的几个模板右键点击复制,即可复制到用户自定义中,例如我比较常用的有静态扫描的GJB8114单元测试的Generate Stubs、Generate Unit Tests和Run Unit Tests。 - 编辑用户自定义中的模板
在用户自定义中的模板是可以自己编辑的,例如我比较习惯将Generate Unit Tests中生成选项卡下的测试套件中的测试套件输出文件和布局修改为”为每个测试的函数创建一个测试套件“。
- 人工定义测试用例的输入输出
在测试用例浏览器中选中相应的测试套件,右键新建数据源,编辑好数据源保存后,再次在测试用例浏览器中相应的测试套件中右键创建新的测试用例,这里依旧以Add函数为例,将参数中i和j以及输出中的int_return设置为表中对应的字段。
做完以上工作,就可以运行自定义的测试用例了,我的测试结果就像下面这个样子。
结束语
以上就是上周培训中学到的东西,如有不明白的欢迎留言交流,如帖子中有错误的地方同样欢迎留言批评指正,在此谢过路过的各位大神。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
机器学习基础 --- numpy的基本使用
一、numpy的简介 numpy是Python的一种开源的数值计算扩展库。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。 Numpy中包含了大量的矩阵运算,所以读者最好具有一点儿线性代数的基础。 二、numpy基本使用 1.导入numpy库并使用numpy的array方法配合Python中的list生成矩阵 import numpy as np vetor = np.array([1,2,3,4]) # 一维 matrix = np.array([ [1,1,1], [2,2,2], [3,3,3] ]) # 二维 print(vetor) print(matrix) 输出: [1 2 3 4] [[1 1 1] [2 2 2] [3 3 3]] 2. 获取矩阵的组成 print(vetor.shape) print...
-
下一篇
深度学习精要之CapsuleNets理论与实践(附Python代码)
神经网络于上世纪50年代提出,直到最近十年里才得以发展迅速,正改变着我们世界的方方面面。从图像分类到自然语言处理,研究人员正在对不同领域建立深层神经网络模型并取得相关的突破性成果。但是随着深度学习的进一步发展,又面临着新的瓶颈——只对成熟网络模型进行加深加宽操作。直到最近,Hinton老爷子提出了新的概念——胶囊网络(Capsule Networks),它提高了传统方法的有效性和可理解性。 本文将讲解胶囊网络受欢迎的原因以及通过实际代码来加强和巩固对该概念的理解。 为什么胶囊网络受到这么多的关注? 对于每种网络结构而言,一般用MINST手写体数据集验证其性能。对于识别数字手写体问题,即给定一个简单的灰度图,用户需要预测它所显示的数字。这是一个非结构化的数字图像识别问题,使用深度学习算法能够获得最佳性能。本文将以这个数据集测试三个深度学习
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker使用Oracle官方镜像安装(12C,18C,19C)