在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

结束语

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

目录
相关文章
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
178 1
Qt(C++)开发一款图片防盗用水印制作小工具
WK
|
8天前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
28 5
|
3月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
140 2
|
3月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
|
3月前
|
测试技术 C++
【C++】解决googleTest报错error: SEH exception with code 0xc0000005 thrown in the test body.
【C++】解决googleTest报错error: SEH exception with code 0xc0000005 thrown in the test body.
|
3月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
66 0
|
3月前
|
安全 C++
C++ QT 单例模式
C++ QT 单例模式
49 0
|
3月前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
3月前
|
Java 测试技术
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
60 0