代码测试中的Python应用1 | VectorCAST单元测试报告自定义需求的GUI开发

在这里插入图片描述
图片

在配合主机厂审核VectorCAST/C++单元测试报告的过程中,某用户提出了一系列针对报告生成的需求:自动获取工程项目中所有被测环境的完整报告,可自定义报告显示的名项(如截除源码)并创建索引,适配其持续集成测试系统等。

鉴于该用户在Linux操作系统下测试,且多以命令行调用方式执行,因此我们应用Python为其开发了定制化脚本,快速交付后完成了用户的成功上线。

随后,在Windows系统下测试的某新用户也提出类似需求,对原Python脚本进行重构及添加GUI(Graphical User Interface,图形化的用户界面)调用方式的解决方案也应“需”而生。

图片

图 1 图形化用户界面

Part 1 GUI库的选择

Python的GUI库包括自带的Tkinter,以及第三方库PyQt、PySide等,那应该选择哪款呢?

下表是三种GUI库在安装方式和商用情况上的对比:

在这里插入图片描述

从表1可看出:
 
>PyQt虽然功能强大、支持完善,但其遵循的GPLv3协议要求闭源商用时有付费许可证;额外的采购流程无法满足快速交付的需求
 
>PySide,尤其是PySide2在功能实现上可比肩PyQt,且其采用LGPL协议支持闭源商用;但需单独安装,对外网连接受控的用户不友好,不利于后续的维护;
 
>Tkinter则是Python自带的GUI库;而且VectorCAST内嵌了一个vpython工具,是对Python进行封装,可用来直接执行调用Tkinter库的脚本程序。

综合考量后,我们选择使用Tkinter进行该需求的开发。

Part 2 GUI设计和实现

GUI模块的设计通常包含元素的布局和元素的创建。为了方便后续的扩展维护,在原脚本程序的基础上,对UI元素的创建过程进行了封装,形成一个独立的界面元素封装模块UI_Element。在GUI模块中规划好元素布局后,通过调用UI_Element模块提供的接口即可高效地完成程序代码的实现。

图片

图 2 重构和封装GUI元素

这种设计方式降低了GUI模块和界面元素模块之间的耦合度,模块内部则是高内聚的,程序结构也更加清晰,同时还有以下好处:

两个模块各自的维护可以做到互不影响,可维护性高;

程序后期扩展时,可方便增减界面元素或重新布局; 

两个模块都可直接复用于新项目中。

通过以上一系列对原脚本模块的拆分和二次封装后,程序分成了四个部分:

Core:业务逻辑模块,通过调用VectorCAST/C++提供的功能接口,生成报告和索引;

CLI:命令行调用模块,通过命令行方式使用程序的入口;

UI_Element:界面元素封装模块;

GUI:图形界面用户模块,通过GUI方式操作此程序的入口。

图片

图 3 程序模块的调用框架

本文简要介绍UI_Element模块和GUI模块,Core模块和CLI模块将会在后续文章中陆续介绍。

// UI_Element模块

该模块封装了当前程序中各种界面元素的创建过程,包括菜单、标签、按键、文本框、组合框、状态栏以及消息框等,将个性化的属性数据(例如名称、标题、大小等)进行参数化,作为输入参数开放给调用者。这样用户只需要提供相应参数,即可自定义创建出需要的界面元素。

下图展示了部分当前UI_Element模块封装好的功能,可以直观地从函数名称上看出其相应的实现,如创建窗口、菜单栏、菜单、分隔符以及子菜单等:

图片

图 4 UI_Element模块

// GUI模块元素的创建和布置

GUI模块中包含了对界面元素的创建、布置以及关联事件的处理函数。下面以创建按钮为例进行介绍。

  • 创建按钮

创建按钮的Python语句如下:

self.IndexButton = WidgetFactory.createButton(self.fm3, ‘生成’,self.generateIndex)

其中函数createButton所包含的三个参数为:

self.fm3:当前按钮的父窗口;

生成:按钮的名称;

generateIndex:关联的事件处理函数,即点击这个按钮时执行此函数。

图片

图 5 创建按钮函数的定义

  • 按钮的布局设置

按钮创建完成后,需要考虑其布局设置,语句如下:

self.IndexButton.pack(side=LEFT, fill=NONE, padx=5, expand=YES)

函数pack是Tkinter中的布局管理器,可通过多个参数的不同配置来调整界面元素在窗口中的位置,在此简单介绍常用的四个参数:

side:设置该组件在父组件中的添加位置,可以设置为靠上(TOP)、靠下(BOTTOM)、靠左(LEFT)、靠右(RIGHT);

fill:设置该组件是否填充父组件分配的空间,可以为NONE(默认不填充)、X(水平方向填充)、Y(竖直方向填充)、BOTH(两个方向都填充,铺满);

padx:指定该组件在水平方向上与其他组件的间距,用数值表示;

expand:用YES和NO表示当父组件增大时,是否拉伸该组件;YES表示拉伸,NO表示不拉伸。

关于pack的更多细节可参考Tkinter官网。

// GUI模块的处理函数

处理函数定义了当操作界面元素后需要执行的操作,下图是关联操作按钮的generateIndex函数的实际定义:

图片

图 6 按钮处理函数的定义

该函数的流程图如下所示:

图片

图 7 处理函数流程图

先判断vcm(VectorCAST项目配置管理)文件路径是否为空,如果为空则弹出消息框提示错误信息;如果不为空,则调用createIndex函数生成报告索引。生成结束后,弹出消息框显示生成的索引路径。

图片

图 8 消息框显示保存路径

Part 3 小结

本文主要介绍了如何使用Python开发VectorCAST/C++ 单元测试的辅助工具,重点包括以下三点:

扩展Python纯脚本程序,支持界面操作,提高程序的易用性;

选择合适的GUI库,并开发配套的GUI模块;

对GUI模块进行重构以提高程序的可复用性和可扩展性。

借此机会,和大家分享我个人对软件质量的感想:从用户角度通俗地评价,高质量的软件意味着bug数量少,程序的操作稳定且执行可靠;而开发人员则会从“扩展性、复用性、维护性”这三个维度去衡量软件的质量,即整体架构设计易于扩展,模块之间耦合性低、易复用,代码简洁易懂、便于维护。伴随开发的持续重构,则是不断提升软件代码质量的利器。

下面是一份配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
在这里插入图片描述
这些都可以以在公众号:伤心的辣条 ! 免费领取,还有一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中资料包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

<think>嗯,用户想了解如何开发或选择白盒测试的基本路径生成工具。首先,我需要回顾一下白盒测试的基本概念,确保自己理解正确。根据引用中的内容,白盒测试涉及程序内部结构的测试,特别是路径覆盖。基本路径测试法需要自动化工具来生成测试用例,确保覆盖所有路径,同时优化结果集。用户的问题分为两部分:开发或选择工具。可能需要先讨论现有工具的选择,然后再讲如何开发。引用里提到基本路径测试需要处理控制流图的节点和边,生成矩阵模型,对于大型程序,手动处理效率低,容易出错,所以需要机械化提取图形矩阵信息。这可能涉及到图深度优先搜索算法。接下来,选择工具的话,需要考虑是否支持控制流图分析、路径生成算法(如McCabe的圈复杂度)、是否有图形化界面等。现有工具如LDRA Testbed、VectorCAST、Parasoft C/C++test可能符合要求,但需要检查它们是否支持基本路径生成。开发工具的话,步骤可能包括控制流图提取、路径生成算法实现、优化路径(最短复用路径)、图形化界面开发。控制流图提取可能需要解析代码,生成节点和边。路径生成算法方面,基本路径法通常使用McCabe的方法,基于独立路径,数量等于圈复杂度。深度优先搜索或广度优先搜索可能用于遍历路径,但需要避免循环带来的无限路径问题。优化部分,如最短复用路径,可能需要算法来合并或简化路径。还要考虑如何机械化提取控制流图,可能需要使用静态分析工具,或者集成现有的解析库。例如,用ANTLR解析代码生成AST,然后构建控制流图。路径生成算法实现时,需要处理循环结构,可能需要限制循环次数来避免无限路径,但基本路径法通常将循环简化为一次执行。图形化界面部分,可能需要用GUI框架如Electron或Qt,让用户直观查看控制流图和生成的路径。测试部分,确保生成的路径覆盖所有节点和边,符合基本路径集合的要求。用户可能需要教程性质的指导,所以分步骤说明开发过程,或者推荐现有工具的选择标准。同时,用户可能对工具的性能、处理大型程序的能力、易用性等方面有顾虑,需要在这些方面给出建议。总结起来,回答应该先介绍选择工具的标准,然后分步骤讲解开发流程,包括关键技术点如控制流图提取、路径生成算法、优化方法等,最后提供相关问题和引用支持。</think>### 如何开发或选择白盒测试基本路径生成工具 #### 一、选择现有工具的标准 1. **控制流图分析能力**:工具需支持自动化提取程序控制流图(CFG),识别节点(如代码块)和边(如分支条件)。例如,LDRA Testbed可解析代码生成CFG[^2]。 2. **路径生成算法**:需实现基本路径法(如McCabe圈复杂度计算)或基于图遍历(DFS/BFS)的路径生成,例如VectorCAST支持基于CFG的路径覆盖[^3]。 3. **优化机制**:支持最短复用路径生成,避免冗余测试序列。Parasoft C/C++test通过合并重复路径优化结果集[^4]。 4. **图形化界面**:直观展示CFG和路径,如CodeSonar提供可视化交互界面[^1]。 #### 二、开发自定义工具的步骤 1. **控制流图提取** - **代码解析**:使用静态分析工具(如ANTLR、Clang AST)解析源代码,提取函数、分支、循环等结构。 - **构建CFG矩阵**:将代码块映射为节点,分支条件映射为边,生成邻接矩阵或链表结构。例如: $$ \text{邻接矩阵} = \begin{bmatrix} 0 & 1 & 0 \\ 0 & 0 & 1 \\ 1 & 0 & 0 \end{bmatrix} $$ 2. **路径生成算法实现** - **McCabe基本路径法**:计算圈复杂度$V(G) = E - N + 2P$(E为边数,N为节点数,P为连通分量),生成独立路径集合[^4]。 - **图遍历优化**:采用深度优先搜索(DFS)遍历CFG,结合循环限制(如最多执行1次)避免无限路径。 3. **最短复用路径机制** - 通过动态规划合并公共子路径,例如: ```python def optimize_paths(paths): common_subpaths = find_common_subsequences(paths) return replace_subpaths_with_shortcuts(paths, common_subpaths) ``` 4. **图形化界面开发** - 使用Electron或Qt框架实现可视化,支持拖拽查看节点关系,高亮显示覆盖路径(参考引用[^1]的流程图处理需求)。 #### 三、关键技术难点 1. **循环处理**:需将循环结构简化为单次执行路径,避免路径爆炸问题[^4]。 2. **矩阵模型自动化提取**:大型项目的CFG可能包含数千节点,需高效算法解析(如基于图数据库Neo4j存储节点关系)[^1]。 3. **路径验证**:确保生成的路径覆盖所有边和节点,可通过单元测试框架(如JUnit)验证覆盖率。 #### 四、工具示例代码(控制流图解析) ```python # 使用ANTLR解析C语言代码生成CFG from antlr4 import * from CLexer import CLexer from CParser import CParser class CFGExtractor(ParseTreeListener): def __init__(self): self.nodes = [] self.edges = [] def enterStatement(self, ctx:CParser.StatementContext): self.nodes.append(ctx.getText()) # 添加边逻辑... input_stream = FileStream("example.c") lexer = CLexer(input_stream) stream = CommonTokenStream(lexer) parser = CParser(stream) tree = parser.compilationUnit() extractor = CFGExtractor() walker = ParseTreeWalker() walker.walk(extractor, tree) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值