最近为了协助测试人员完成Selenium + Python的自动化UI测试场景落地,在他们原来面向过程的Python代码基础上做了一层封装,做成了一个面向对象的Python小工具(这也是本人第一次接触Python语言,重温从零开始学一门语言,感触良多)。

调整后的代码基本上能够满足:

  1. 可以动态读取yaml配置内容;

  2. 主程序不用反复修改;

  3. 测试用例可以根据“项目 -> 版本 -> py文件”进行定位获取;

  4. 测试用例模组能够动态引入;

  5. 会自动采用最新测试用例进行自动化测试;

  6. 测试人员只需关心测试用例编写,甚至可以使用Katalon Recorder录制用例脚本后放入测试(只需要做小量的调整);

  7. 采用HtmlTestRunnerCN库自动生成html测试报告方便通过集成Nginx直接输出成果;

项目结构

autoui
|-- configs
|   |-- common.yaml
|   |-- config.py
|   `-- paths.yaml
|-- main.py
`-- <<项目名称>>`-- v2_5_0_0`-- quality.py

从目录结构可以看出autoui目录下就一个main.py这个是主程序入口,接着就是configs目录,这个是配置文件存放地方是本项目固定目录。接着就是<<项目名称>>目录,这个就是需要被自动化UI测试的项目名称,而在其下方有一个v2_5_0_0这个是需要被压测的用例版本号,再往下quality.py文件就是测试用例的模组。

这套工具就像“springboot”那样“约定大于配置”,configs文件夹存放路径和名称不能改变,里面存放的东西是可以随意的。被自动化UI测试的项目文件夹一定要放在与main.py文件同级的路径下,且必须按照“项目 -> 版本号”这种方式创建文件夹,在版本号下方再存放模组文件。

另外在代码编写的时候,建议每一个module中只含一个class,所有的测试用例都以函数的方式展现,因为后面会根据这个规则统一处理做到用例全覆盖的。

关键代码

import unittest
...# 系统主类执行方法
if __name__ == '__main__':...# 3. 遍历获取字典内容for params in dict_param.items():# 4. report_date用于记录当前报告输出时间report_date = time.strftime('%Y-%m-%d')# 5. 将dict的key(这里的params[0])作为项目名称project_name = params[0] + '测试报告.html'# 6. 通过get_execute_file获取到当前项目中可以执行的样例代码py文件,而params[1]代表的文件,之后的[1]代表路径字符串所以要获取到路径则使用params[1][1]exec_url_list = get_execute_file(params[1][1])# 7. 如果得到的路径不为空的情况下if len(exec_url_list) > 0:# 8. 初始化unittest实例autoui_instance = unittest.TestSuite()print('>>>>>> project ' + project_name + ' has begin execute ......')# 9. 遍历可执行文件路径集合for exec_url in exec_url_list:# 10. 对路径进行转换,从当前文件路径开始的包路径获取package_url = exec_url.replace(root_url + '\\', '').replace('\\', '.').replace('.py', '')# 11. 根据包路径动态获取该文件的模块对象module = importlib.import_module(package_url)# 12. 根据模块和inspect.isclass方法可以获取到当前模块中的所有类名classes = [clsname for (clsname, fullname) in inspect.getmembers(module, inspect.isclass)]# 13. 遍历所有类名for clsname in classes:# 14. 通过getattr获取当当前模块里该类名对应的类对象clazz = getattr(module, clsname)# 15. 根据模块和类名和inspect.isfunction方法获取到该类中的所有方法methods = [method_name for (method_name, method) ininspect.getmembers(getattr(module, clsname), inspect.isfunction)]# 16. 遍历所有方法for method in methods:# 17. 只需要关注"ui_"关键字开头的方法将其放入unittest实力当中加入到ui自动化测试队列中if method.find('ui_') >= 0:autoui_instance.addTest(clazz(method))# 18. 创建到处文件路径export_path = report_path + "\\" + params[0] + "\\" + report_dateexport_url = export_path + "\\" + project_nameif not os.path.exists(export_url):os.makedirs(export_path)# 19. 创建到处文件对象(若存在相同名字文件则自动覆盖)fp = open(export_url, "wb")# 20. 调用HTMLTestRunnerCN来到处测试报告runner = HTMLTestRunnerCN.HTMLTestReportCN(stream=fp, title="自动化测试报告", description='详细测试用例结果', tester='梁泽良')runner.run(autoui_instance)

上面的代码采用了类似Java中反射的方式获取对象。

首先在第10点中获取模块的路径并将其转换为包路径。接着将其通过importlib.import_module获取到指定的module对象。接着又通过遍历获取到module中的所有class,遍历所有class又获取到所有函数。

由于与测试人员约定俗成了测试用例按照函数来编写,因此在遍历函数的时候获取到“ui_”命名的函数就可以将其放入test实例里面。

至此,能够遍历统一目录下所有module中所有的类里面的所有函数,做到全覆盖(由于是Python新手,这样的写法未免过于累赘后面慢慢改进)。

import time
......# 创建一个名为质量管理用例(quality代表质检管理,case代表用例)
class quality_case(unittest.TestCase):@classmethoddef setUpClass(cls):# 初始化webdriver(方便后面对浏览器进行替换)cls.driver = webdriver.Chrome()def setUp(self):self.driver.maximize_window()self.driver.implicitly_wait(10)# 注意这里要用“ui_”开头来定义函数def ui_case1(self):self.driver.get(user_login)...self.driver.find_element_by_css_selector("[placeholder='请输入账号名']").send_keys(user_account)...def ui_case2(self):self.driver.get(admin_login)...@classmethoddef tearDownClass(cls):cls.driver.quit()

另外,关于用例module的写法将严格按照unittest.TestCase标准写法编写,先重写setUpClass获取到class对象,在这个函数下先对webdriver的Chrome浏览器对象进行初始化,上面的@classmethod可以理解成setUpClass函数作为quality_case类的简单工厂用于构造对象,这个同样适用于下面的tearDownClass函数。

我简单的理解为setUpClass是TestCase第一个执行函数,因此webdriver的初始化就放在这里就好了,但要想要只构造一次就可以了不用每次都构建webdriver,这样就只需要加上@classmethod就好了。

同理,tearDownClass是最后执行的函数(不管用例是否执行成功都会执行),因此将webdriver的quit函数放在这里执行就能够避免因为异常导致浏览器线程不关闭的现象了。但要获取webdriver对象也就只能通过@classmethod来获取了。

至于setUp函数就是真正执行用例前的函数,用于对测试内容的“预设”,这里就通过self获取driver对象就能够进行webdriver的设定了。

再后面就是ui_开头的自定义用例了。

至此,该讲的已经讲完。后面测试人员只需要按照TestCase的标准写法编写就可以了,才疏学浅献丑了。

【测试】自动化UI测试小工具相关推荐

  1. POCO软件测试自学,自动化UI测试工具airtest 之V2.2 airtest文档学习POCO

    图片发自简书App 一个编程大白,我在学自动化UI测试工具airtest. 一.硬件软件的准备与连接 二.学习AirtestIDE官方文档 三.用Airtest对多台手机操控 四.纯python代码操 ...

  2. 网易自动化UI测试解决方案Airtest Project亮相GDC

    GDC开幕第一天,Google在GDC发布了一款由网易研发的游戏UI自动化测试方案:Airtest Project.21日,这项研发成果也展开了专门的讲座活动,向全球开发者公开演示. Airtest ...

  3. 从零开始自制实现WebServer(十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章

    文章目录 全流程实现博客链接 前引 (十八)---- 对服务器做最后的压力测试 WebBench压测小工具 项目迎来终章 1.正确处理Vmware-Station 处理器设置(初步调试过程) 2.正确 ...

  4. ios ui自动化测试_Xcuitest的ios自动化ui测试

    ios ui自动化测试 Who knew automated UI Testing could be so easy! Well, I guess Apple did. Automated UI Te ...

  5. 软件测试基础 按照测试对象划分 界面测试(UI测试.响应式页面 可靠性测试 容错性测试 文档测试 平台测试 易用性测试等

    软件测试进阶 1.APP 的测试 2. 按照测试对象划分 2.1界面测试(UI测试) 3.响应式页面 4.可靠性测试 5.容错性测试 6.文档测试 7.平台测试: 7.1 PC: 7.2.手机端: 8 ...

  6. UI测试与iTest自动化UI测试工具

    UI测试 界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象.通过用户界面 (UI) 测试来核实用户与软件的交互. UI 测试的目标在于确保用户界面向用户提供了适当的访问和浏览测试对 ...

  7. 谷歌力挺网易自动化 UI 测试解决方案 Airtest Project[看上去比较靠谱,但没有尝试的]

    http://airtest.netease.com/tutorial/Tutorial.html 上周,美国太平洋时间 3 月 19 日,在 GDC 开幕第一天的 Google 开发者专场,谷歌发布 ...

  8. 不会自动化UI测试?不会编程?没问题,会造句就行!

    上次,我们介绍了用于Web应用程序自动化测试的工具Playwright for .NET. 但是直接使用它来编写测试用例,代码比较凌乱,后期也不好维护. 因此,我们利用SpecFlow让测试用例更好理 ...

  9. 测试自动化平台 | 测试开发工程师的进阶之路

    https://mp.weixin.qq.com/s/WU5h8FW6BT5YZtlsSuCIcw 「摘要」随着近几年国内IT行业高速发展,对测试工程师的要求也越来越高,其作用也越来越重要,但很多测试 ...

最新文章

  1. metasploit 使用实例
  2. 计算MATLAB时间复杂度的例子,学编程数学到底有多重要?线性代数能否视为一门程序语言呢?...
  3. yolov3代码详解_代码资料
  4. Spring在bean配置文件中定义电子邮件模板
  5. 在SAP除了使用Cordova生产移动应用外,还有这种方式
  6. Linux 脚本、 正则表达式 等
  7. 第二阶段团队进展报告(3)
  8. leetcode—19.二叉树遍历相关题目leetcode总结
  9. 微信小程序+.NET(十八) ffmpeg音频转码/拼接/混合
  10. 使用Python实现通过doi下载文献pdf
  11. 双绞线 计算机考试,计算机基础知识:有线传输介质之双绞线
  12. api.php(260x260),Restful Api文档 -V3-教程
  13. Android欢迎页面以及引导页面
  14. 从键盘输入某年某月某日,判断这一天是这一年的第几天啊?
  15. springMVC mybatis 多数据源配置
  16. 怎么把一张暗的照片调亮_PS怎么把一张暗的图调亮,就局部
  17. speedpdf(Excel)表格如何重复打印标题行?
  18. java判断两个数互质_AcWing 458. 比例简化-java(无需判断互质)
  19. Linux下的多线程編程
  20. multisim 高低电平点亮灯证明

热门文章

  1. 搭建自己的斗地主服务器,和朋友一起消磨时间吧~
  2. c语言数据类型及命名规则
  3. UI设计中的排版方法
  4. 微博sdk android,GitHub - mobileresearch/weibo_android_sdk: sina weibo android sdk
  5. 基于matlab的复杂背景下不规则目标边缘提取算法的仿真
  6. ImageIo.read() 读取图片时返回Null异常
  7. Cucumber 1 -- 什么是BDD、Cucumber?它们的关系是什么?
  8. 21 字符流与字节流
  9. 创新能力哪家强?三星Note8 VS. 苹果iPhone X
  10. 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐