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

软件测试君 2021-11-25 19:25:13
代码 Python 测试 应用 vectorcast

在这里插入图片描述
图片

在配合主机厂审核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就知足了…

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

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

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

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

版权声明
本文为[软件测试君]所创,转载请带上原文链接,感谢
https://blog.csdn.net/ai_green/article/details/121541129

  1. 关于#python_while循环的写法#的问题,如何解决?
  2. Python异常处理中异常的种类有哪些?你知道几个?
  3. Python异常處理中异常的種類有哪些?你知道幾個?
  4. Quels sont les types d'exceptions dans la gestion des exceptions python? Combien en savez - vous?
  5. À propos de # Python Comment résoudre le problème de l'écriture de la Boucle while?
  6. Python如何操作system.data.sqlite数据库
  7. python数字游戏,让你欲罢不能
  8. Python中的可迭代对象、迭代器、For循环工作机制、生成器
  9. 一个从没接触过编程的人,如何自学进入Python行业?
  10. 一份超级实用的 Python ”技巧“清单
  11. Python 程序员给上路初学者的3点忠告
  12. 3 conseils pour les débutants sur la route par les programmeurs Python
  13. Une liste de conseils Python super pratiques
  14. Comment quelqu'un qui n'a jamais été en contact avec la programmation peut - il apprendre à entrer dans l'industrie python?
  15. Objets itérables, itérateurs, pour le mécanisme de travail circulaire, générateurs en python
  16. Les Jeux de chiffres Python vous font vous arrêter
  17. Comment Python fonctionne avec la base de données system.data.sqlite
  18. Python之html与markdown互相转换
  19. Python之html與markdown互相轉換
  20. Conversion HTML et markdown de Python
  21. Python生成的随机数,要怎么设定成随机数a小于随机数b啊
  22. Python生成的隨機數,要怎麼設定成隨機數a小於隨機數b啊
  23. Le nombre aléatoire généré par Python, comment définir le nombre aléatoire a est inférieur au nombre aléatoire B
  24. Python爬虫能做什么
  25. Python老技师给上路初学者的3点忠告
  26. 3 conseils aux débutants sur la route de l'ancien technicien Python
  27. Que peuvent faire les reptiles Python
  28. The code NPM cloned from git will report a python error after it is installed!
  29. 数据分析从零开始实战,Pandas读写CSV数据
  30. Python基础(十二):类与对象
  31. Python Foundation (12): classes et objets
  32. Python基礎(十二):類與對象
  33. L'analyse des données commence à zéro et pandas lit et écrit les données CSV
  34. Python Qt GUI设计:QSlider滑动条类(基础篇—16)
  35. #yyds干货盘点#数据分析从零开始实战,Pandas读写CSV数据
  36. This paper designs an examination system for automatically setting questions and judging papers by using Python standard library language to investigate the ability of users to calculate four integers within 100.
  37. Yyds Dry Inventory # Data Analysis started from zero, pandas read and write CSV Data
  38. python数据结构:数组、列表、栈、队列及实现
  39. Python编程真的是未来人工智能的主流吗?
  40. Python编写通讯录,支持模糊查询,利用数据库存储
  41. Python編寫通訊錄,支持模糊查詢,利用數據庫存儲
  42. Python編程真的是未來人工智能的主流嗎?
  43. Python écrit le carnet d'adresses, prend en charge les requêtes floues et utilise le stockage de base de données
  44. La programmation Python est - elle vraiment le courant dominant de l'IA future?
  45. Structure des données Python: tableaux, listes, piles, files d'attente et implémentations
  46. Python networkx Practical Social Network Visualization
  47. [译] 通过 for 循环,比较 Python 与 Ruby 编程思想的差别
  48. Comparez les différences de programmation entre Python et Ruby à travers la boucle for
  49. Python basic and introductory tutorials
  50. What you don't know
  51. 人生苦短,能让你更早下班的Python垃圾回收机制
  52. Boring playing Tetris, using Python to do their own without advertising
  53. Seemingly boring Python games, but I fished for work all afternoon!!
  54. A collection of grammar knowledge points for getting started with Python
  55. Benefits of learning Python
  56. Play childhood memories with Python, greedy snake
  57. Python is suitable for beginners
  58. Simple Python game making
  59. Welfare is coming!! Python basic syntax dry goods
  60. Simply understand the learning direction of Python and make yourself a better choice