用 Pytest+Appium+Allure 做 UI 自动化测试的那些事儿

本文介绍了使用Pytest、Appium和Allure进行UI自动化测试的方法,包括Appium的adb shell操作、截图、日志获取、文件传输,Pytest的初始化、参数化、用例依赖、自定义标记、错误处理,以及测试框架的进阶技巧。文章适合测试工程师参考学习。
摘要由CSDN通过智能技术生成

本文首发于 TesterHome 社区, 文末有福利 !链接 https://testerhome.com/topics/19327

前言

做 UI 自动化测试有段时间了,在 TesterHome
社区看了大量文章,也在网上搜集了不少资料,加上自己写代码、调试过程中摸索了很多东西,踩了不少坑,才有了这篇文章。希望能给做 UI
自动化测试小伙伴们提供些许帮助。

文本主要介绍用 Pytest+Allure+Appium 实现 UI
自动化测试过程中的一些好用的方法和避坑经验。文章可能有点干,看官们多喝水!O(∩_∩)O~

主要用了啥:

  • Python3
  • Appium
  • Allure-pytest
  • Pytest

Appium 不常见却好用的方法

1. Appium 直接执行 adb shell 方法
          1.  # Appium 启动时增加 --relaxed-security 参数 Appium 即可执行类似adb shell的方法
          2.     
          3.       2. > appium -p 4723 --relaxed-security
          4.     
          5.     
          6.     
          7.     
          8.           1. # 使用方法
          9.     
          10.      2. def adb_shell(self, command, args, includeStderr=False):
          11.     
          12.       3.     """
          13.     
          14.       4.     appium --relaxed-security 方式启动
          15.     
          16.       5.     adb_shell('ps',['|','grep','android'])
          17.     
          18.       6.   
          19.     
          20.     
          21.       7.     :param command:命令
          22.     
          23.       8.     :param args:参数
          24.     
          25.       9.     :param includeStderr: 为 True 则抛异常
          26.     
          27.       10.     :return:
          28.     
          29.       11.     """
          30.     
          31.       12.     result = self.driver.execute_script('mobile: shell', {
          32.     
          33.       13.         'command': command,
          34.     
          35.       14.         'args': args,
          36.     
          37.       15.         'includeStderr': includeStderr,
          38.     
          39.       16.         'timeout': 5000
          40.     
          41.       17.         })
          42.     
          43.       18.     return result['stdout']
          44.     
          45.     
          46.     
2. Appium 直接截取元素图片的方法
          1.  element = self.driver.find_element_by_id('cn.xxxxxx:id/login_sign')
          2.     
          3.       2. pngbyte = element.screenshot_as_png
          4.     
          5.       3. image_data = BytesIO(pngbyte)
          6.     
          7.       4. img = Image.open(image_data)
          8.     
          9.       5. img.save('element.png')
          10.    
          11.       6. # 该方式能直接获取到登录按钮区域的截图
          12.     
          13.     
          14.     
3. Appium 直接获取手机端日志
          1.  # 使用该方法后,手机端 logcat 缓存会清除归零,从新记录
          2.     
          3.       2. # 建议每条用例执行完执行一边清理,遇到错误再保存减少陈余 log 输出
          4.     
          5.       3. # Android
          6.     
          7.       4. logcat = self.driver.get_log('logcat')
          8.     
          9.       5.   
          10.    
          11.     
          12.       6. # iOS 需要安装 brew install libimobiledevice
          13.     
          14.       7. logcat = self.driver.get_log('syslog')
          15.     
          16.       8.   
          17.     
          18.     
          19.       9. # web 获取控制台日志
          20.     
          21.       10. logcat = self.driver.get_log('browser')
          22.     
          23.       11.   
          24.     
          25.     
          26.       12. c = '\n'.join([i['message'] for i in logcat])
          27.     
          28.       13. allure.attach(c, 'APPlog', allure.attachment_type.TEXT)
          29.     
          30.       14. #写入到 allure 测试报告中
          31.     
          32.     
          33.     
4. Appium 直接与设备传输文件
          1.  # 发送文件
          2.     
          3.       2. #Android
          4.     
          5.       3. driver.push_file('/sdcard/element.png', source_path='D:\works\element.png')
          6.     
          7.       4.   
          8.     
          9.     
          10.      5. # 获取手机文件
          11.     
          12.       6. png = driver.pull_file('/sdcard/element.png')
          13.     
          14.       7. with open('element.png', 'wb') as png1:
          15.     
          16.       8.     png1.write(base64.b64decode(png))
          17.     
          18.       9.   
          19.     
          20.     
          21.       10. # 获取手机文件夹,导出的是zip文件
          22.     
          23.       11. folder = driver.pull_folder('/sdcard/test')
          24.     
          25.       12. with open('test.zip', 'wb') as folder1:
          26.     
          27.       13.     folder1.write(base64.b64decode(folder))
          28.     
          29.       14.   
          30.     
          31.     
          32.       15. # iOS
          33.     
          34.       16. # 需要安装 ifuse
          35.     
          36.       17. # > brew install ifuse 或者 > brew cask install osxfuse 或者 自行搜索安装方式
          37.     
          38.       18.   
          39.     
          40.     
          41.       19. driver.push_file('/Documents/xx/element.png', source_path='D:\works\element.png')
          42.     
          43.       20.   
          44.     
          45.     
          46.       21. # 向 App 沙盒中发送文件
          47.     
          48.       22. # iOS 8.3 之后需要应用开启 UIFileSharingEnabled 权限不然会报错
          49.     
          50.       23. bundleId = 'cn.xxx.xxx' # APP名字
          51.     
          52.       24. driver.push_file('@{bundleId}/Documents/xx/element.png'.format(bundleId=bundleId), source_path='D:\works\element.png')
          53.     
          54.     
          55.     

Pytest 与 Unittest 初始化上的区别

很多人都使用过 Unitest,先说一下 Pytest 和 Unitest 在 Hook method上的一些区别:

1. Pytest 与 Unitest 类似,但有些许区别

以下是 Pytest

          1. class TestExample:
          2.     
          3.       2.     def setup(self):
          4.     
          5.       3.         print("setup             class:TestStuff")
          6.     
          7.       4.   
          8.     
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值