【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介
 获取AppPackage和AppActivity
 定位UI控件的工具
 脚本结构
 PageObject分层管理
 HTMLTestRunner生成测试报告
 启动appium server服务
 以python文件模式执行脚本生成测试报告
下载与安装

下载需要自动化测试的App并安装到手机

获取AppPackage和AppActivity

方法一

有源码的情况直接打开AndroidManifest.xml文件,文件会有package信息

android.intent.action.MAIN决定应用程序最先启动的Activity

android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里

方法二

反编译apk,反编译后打开AndroidManifest.xml文件,文件会有package信息

方法三

aapt dump badging F:\****.apk
aapt工具是sdk自带的一个工具,在sdk\builds-tools\目录下,将appt.exe所在路径添加至path环境变量里,cmd输入aapt查看是否可使用,有如下响应内容即成功

将需要查看的apk复制到电脑任意路径下,例如F:\1.apk

使用命令 aapt dump badging F:\1.apk

运行后的结果前两行分别是包名appPackage和Activity

aapt dump xmltree F:\****.apk AndroidManifest.xml

方法四

将需要查看的apk复制到电脑任意路径下,例如F:\1.apk

使用命令 aapt dump xmltree F:\1.apk AndroidManifest.xml

运行后的结果就有包名appPackage和Activity

 方法五

adb logcat -c //清除logcat内容 adb logcat ActivityManager:I *:s //仅输出标记为“ActivityManager”并且优先级大于等于“Info”的日志,*:S用于设置所有标记的日志优先级为S(无记载,最高优先级,没有什么会被记载)

手机启动要查看的app,就会加载日志信息

结果如下图:

 方法六

adb logcat > D:/logs.txt 或 adb logcat|find "Displayed" >d:/logs.txt

启动app,cmd输入adb logcat > D:/logs.txt(开启日志),输入Ctrl+C(关闭日志),在日志查找appPackage和AppActivity,文件内搜索Displayed找到Package和Activity信息

 或使用该命令直接过滤再保存到txt文件内 adb logcat|find "Displayed" >d:/logs.txt

最终,得到App的信息如下:

1 appPackage:com.nbi.aquatic
2 appActivity:.ui.login.LoginActivity

定位UI控件的工具

使用Android SDK的uiautomatorviewer.bat(在..\sdk\tools\ 目录下),电脑开启开发者模式,可以使用adb命令的状态下使用该sdk自带的工具,可视化安卓手机的界面信息

★ 脚本结构

somke_test.py 存放测试集

config.py 存放自动化测试所用到的数据,如账号密码,默认密码等

pool.py等 测试集中的一个测试用例的page层

base.py 页面基础层,供page层继承

HTMLTestRunner.py 生成测试报告的模块,可集成到代码里不需在环境中安装该模块,也可在电脑python环境里安装配置
(自行百度:Pycharm使用python3无法通过HTMLTestRunner生成测试报告)
config.py 存放自动化测试所用到的数据,如账号密码,默认密码等

  1. 1 settings = {

  2. 2 'admin': {

  3. 3 'number': '13600000000',

  4. 4 'password': 'qaz123'

  5. 5 },

  6. 6 'default_password': 'a123456'

  7. 7 }

  8. 8 ADMIN_NUMBER = settings['admin']['number']

  9. 9 ADMIN_PASSWORD = settings['admin']['password']

启动app的相关配置传到appium服务端和连接手机的代码写在测试集TestCase外面,如果写在初始化测试平台的测试用例里则只能启动执行一次用例

  1. 1 desired_caps = {}

  2. 2 # Android自动化还是Ios自动化

  3. 3 desired_caps['platformName'] = 'Android'

  4. 4 # Android操作系统版本

  5. 5 desired_caps['platformVersion'] = '5.1'

  6. 6 # 设备名称

  7. 7 desired_caps['deviceName'] = '127.0.0.1:62001'

  8. 8 # 被测App包名

  9. 9 desired_caps['appPackage'] = 'com.nbi.aquatic'

  10. 10 # 被测App的入口Activity名

  11. 11 desired_caps['appActivity'] = '.ui.login.LoginActivity'

  12. 12 desired_caps['automationName'] = 'Uiautomator2'

  13. 13 # 把以上配置传到appium服务端并连接手机

  14. 14 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

启动app,用到的是unittest自带的setUp方法

  1. 1 def setUp(self):

  2. 2 # 初始化测试平台

  3. 3 self.driver = driver

关闭app,用到的不是unittest自带的tearDown方法,而是自定义了一个test_*_end_testing函数,这个函数负责关闭app,是在测试集里的最后一个测试用例

  1. 1 def test_36_end_testing(self):

  2. 2 """结束测试"""

  3. 3 self.driver.quit()

整体测试用例结构,采用PageObject分层管理

1.一个测试用例就是一个函数,后期增加用例时在后面增加新函数即可

2.为了使用unittest框架执行测试集,命名都以test开头,例如test_16_creat_aquatype

3.每个用例又分独立的page层,例如测试集里的用例test_16_creat_aquatype,其page层就是PoolPage,在编写测试集时引入该文件即可,也就是testcase层调用page层

  1. 1 from appium import webdriver

  2. 2 from test_case.page_object.admin.pool import PoolPage

  3. 3 import unittest

  4. 4 import config

  5. 5 import time

  6. 6 class SmokeTest(unittest.TestCase):

  7. 7 def setUp(self):

  8. 8 # 初始化测试平台

  9. 9 self.driver = driver

  10. 10 def test_10_admin_login(self):

  11. 11 """手机登录"""

  12. 12 LoginPage(self.driver).PhoneNumberlogin_action(

  13. 13 config.ADMIN_NUMBER,

  14. 14 config.ADMIN_PASSWORD,

  15. 15 )

  16. 16 def test_16_creat_aquatype(self):

  17. 17 """添加水产类型"""

  18. 18 PoolPage(self.driver).creat_aquatype(new_aquatype_name)

  19. 19 def test_17_creat_aquatic(self):

  20. 20 """养殖池添加养殖"""

  21. 21 PoolPage(self.driver).creat_aquatic()

  22. 22 def test_36_end_testing(self):

  23. 23 """结束测试"""

  24. 24 self.driver.quit()

  25. 25 if __name__ == '__main__':

  26. 26 # 定义一个单元测试容器

  27. 27 suite = unittest.TestSuite()

  28. 28 # addTest添加case到suite容器中,构造测试集

  29. 29 suite.addTest(SmokeTest('test_10_admin_login'))

  30. 30 suite.addTest(SmokeTest('test_16_creat_aquatype'))

  31. 31 suite.addTest(SmokeTest('test_17_creat_aquatic'))

  32. 32 suite.addTest(SmokeTest('test_36_end_testing'))

  33. 33 # 执行case

  34. 34 runner.run(suite)

4.测试用例test_16_creat_aquatype的page层就是PoolPage,每个page层又都继承页面基础层BasePage

  1. 1 from selenium.webdriver.common.by import By

  2. 2 from test_case.page_object.base import BasePage

  3. 3 import time

  4. 4 class PoolPage(BasePage):

  5. 5 """定位元素"""

  6. 6 creataquatic_btn_loc = (By.ID, 'com.nbi.aquatic:id/tv_add_breed')

  7. 7 select_starttime_btn_loc = (By.ID, 'com.nbi.aquatic:id/textView158')

  8. 8 # 添加水产类型(水产名称最长10个字符)

  9. 9 def creat_aquatype(self, aquatype_name):

  10. 10 time.sleep(3)

  11. 11 self.find_element(*self.creataquatic_btn_loc).click()

  12. 12 .......

  13. 13 # 养殖池添加养殖

  14. 14 def creat_aquatic(self):

  15. 15 self.find_element(*self.select_starttime_btn_loc).click()

5.页面基础层BasePage

  1. 1 from selenium.webdriver.support.ui import WebDriverWait

  2. 2 from selenium.webdriver.support import expected_conditions as EC

  3. 3 class BasePage(object):

  4. 4 """页面基础类,用于所有页面的继承"""

  5. 5 def __init__(self, selenium_driver):

  6. 6 self.driver = selenium_driver

  7. 7 self.timeout = 30

  8. 8 self.poll_frequency = 0.1

  9. 9

  10. 10 def find_element(self, *loc):

  11. 11 return self.driver.find_element(*loc)

  12. 12

  13. 13 def find_elements(self, *loc):

  14. 14 return self.driver.find_elements(*loc)

  15. 15

  16. 16 def content_appeared(self):

  17. 17 self.find_element()

  18. 18

  19. 19 def wait(self, loc):

  20. 20 WebDriverWait(self.driver, 10, 0.005).until(

  21. 21 EC.visibility_of_element_located(loc)

  22. 22 )

  23. 23

  24. 24 def wait_and_compare(self, loc, text):

  25. 25 WebDriverWait(self.driver, 30, 0.5).until(

  26. 26 EC.text_to_be_present_in_element(loc, text)

  27. 27 )

生成HTML测试结果报告

引入方式一,直接电脑python环境安装HTMLTestRunner模块

  1. 1 import HTMLTestRunner

  2. 2 if __name__ == '__main__':

  3. 3 suite = unittest.TestSuite()

  4. 4 suite.addTest(SmokeTest('test_*_*'))

  5. 5 # 写法一

  6. 6 timestr = time.strftime('%Y%m%d', time.localtime(time.time())) # 本地日期作为报告名字

  7. 7 filename = 'F:\\folder_data\\' # 文件名字及保存路径

  8. 8 fp = open(filename + (timestr + '.html'), 'wb')

  9. 9 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')

  10. 10

  11. 11 # 写法二

  12. 12 timestr = time.strftime('%Y%m%d', time.localtime(time.time()))

  13. 13 filename = '../_reports/' + timestr + '.html'

  14. 14 fp = open(filename, 'wb')

  15. 15 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')

  16. 16

  17. 17 # 执行case,并生成一份测试报告

  18. 18 runner.run(suite)

  19. 19 fp.close()

引入方式二,将HTMLTestRunner下载集成在代码内

模块下载地址:HTMLTestRunner - tungwaiyip's software

  1. 1 from packages.HTMLTestRunner import HTMLTestRunner

  2. 2 if __name__ == '__main__':

  3. 3 suite = unittest.TestSuite()

  4. 4 suite.addTest(SmokeTest('test_*_*'))

  5. 5 # 写法三

  6. 6 fp = open('../_reports/result.html', 'wb')

  7. 7 runner = HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')

  8. 8 # 执行case,并生成一份测试报告

  9. 9 runner.run(suite)

  10. 10 fp.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18373.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apollo 9.0 参考线生成器 -- ReferenceLineProvider

文章目录 1. Planning 与 Routing交互1.1 路由请求RoutingRequest1.2 路由响应RoutingResponse1.3 换道过程 2. 创建参考线线程2.1 创建参考线生成器2.2 启动参考线线程 3. 参考线周期生成3.1 创建参考线3.2 更新参考线 4. 参考线平滑4.1 设置中间点anchor points4.2 平滑算法平…

游戏引擎学习第103天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾bug 接下来回顾一下这个bug的具体情况。当前是一个调试视图,我们并不是直接在调试视图下工作,而是在进行相关的调试。展示了地图,这里是环境贴图,上面是正在使用的环境贴图&am…

论文学习记录之《CLR-VMB》

目录 一、基本介绍 二、介绍 三、方法 3.1 FWI中的数据驱动方法 3.2 CLR-VMB理论 3.3 注意力块 四、网络结构 4.1 网络架构 4.2 损失函数 五、实验 5.1 数据准备 5.2 实验设置 5.3 训练和测试 5.4 定量分析 5.5 CLR方案的有效性 5.6 鲁棒性 5.7 泛化性 六、讨…

USART串口协议

USART串口协议 文章目录 USART串口协议1. 通信接口2.串口通信2.1硬件电路2.2电平标准2.3串口参数及时序(软件部分) 3.USART串口外设3.1串口外设3.2USART框图3.3USART基本结构3.4数据帧 4.输入电路4.1起始位侦测4.2数据采样 5.波特率发生器6.相关函数介绍…

【线性代数】1行列式

1. 行列式的概念 行列式的符号表示: 行列式的计算结果:一个数 计算模型1:二阶行列式 二阶行列式: 三阶行列式: n阶行列式: 🍎计算行列式 计算模型2:上三角形行列式 上三角形行列式特征:主对角线下皆为0。 上三角形行列式: 化上三角形通用方法:主对角线下,…

vite让每个scss文件自动导入某段内容

写了如下一个scss函数,希望自动导入到每个scss文件里面 vite.config.ts里面如下配置 import fs from fsconst filePath resolve(__dirname, ./src/assets/css/index.scss);const Minxcss fs.readFileSync(filePath, utf8); css: {preprocessorOptions: {scss: {…

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点&#xff1a…

Java面试第一山!《集合》!

一、引言 在 Java 编程的世界里,数据的存储和处理是非常重要的环节。Java 集合框架就像是一个功能强大的工具箱,为我们提供了各种各样的数据结构来高效地存储和操作数据。今天,跟随小编一起来深入了解 Java 集合框架,这不仅有助于…

APP端弱网模拟与网络测试:如何确保应用在各种网络环境下稳定运行

随着智能手机的普及,APP的网络性能成为用户体验的关键因素之一。尤其是在弱网环境下,应用的表现可能严重影响用户的满意度。因此,APP端的网络测试,尤其是弱网模拟,成为了提升产品质量和用户体验的重要环节。 当前APP网…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理,公式,模式,伸缩因子,旋转方向等,推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现,注意…

【Linux】Socket编程—TCP

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…

分布式技术

一、为什么需要分布式技术? 1. 科学技术的发展推动下 应用和系统架构的变迁:单机单一架构迈向多机分布式架构 2. 数据大爆炸,海量数据处理场景面临问题 二、分布式系统概述 三、分布式、集群 四、负载均衡、故障转移、伸缩性 负载均衡&a…

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程: Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你:deepseek R1基于 AnythingLLM API 调用本地…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言,有很好的特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大…

02、QLExpress从入门到放弃,相关API和文档

QLExpress从入门到放弃,相关API和文档 一、属性开关 public class ExpressRunner {private boolean isTrace;private boolean isShortCircuit;private boolean isPrecise; }/*** 是否需要高精度计算*/ private boolean isPrecise false;高精度计算在会计财务中非常重要&…

达梦:TPCC 压测

目录 造数1. 脚本启动2. 检查数据库信息3. 删除旧用户和表空间4. 创建新的表空间5. 创建用户和表6. 数据加载7. 创建索引8. 创建存储过程和序列9. 检查数据空间使用情况10. 启用表的快速访问池11. 数据加载完成总结 压测1. 脚本启动2. 检查数据表空间3. 设置表的快速池标志4. 检…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

CCF-GESP 等级考试 2024年9月认证C++二级真题解析

2024年9月真题 一、单选题(每题2分,共30分) 正确答案:A 考察知识点:计算机存储 解析:磁心存储元件是早期计算机中用于存储数据的部件,它和现代计算机中的内存功能类似,都是用于临时…

nuxt中引入element-ui组件控制台报错问题

在使用element-ui组件的外层加一层 <client-only placeholder"Loading..."><van-button type"primary">主要按钮</van-button> </client-only> 实际使用&#xff1a; <div class"tab"><client-only placehol…

京东 旋转验证码 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 使用的第三方接码平台识别…