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

news2025/2/22 1:05:33

简介

  1.  获取AppPackage和AppActivity
  2.  定位UI控件的工具
  3.  脚本结构
  4.  PageObject分层管理
  5.  HTMLTestRunner生成测试报告
  6.  启动appium server服务
  7.  以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 settings = {
2    'admin': {
3       'number': '13600000000',
4       'password': 'qaz123'
5    },
6    'default_password': 'a123456'
7 }
8 ADMIN_NUMBER = settings['admin']['number']
9 ADMIN_PASSWORD = settings['admin']['password']

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

 1 desired_caps = {}
 2 # Android自动化还是Ios自动化
 3 desired_caps['platformName'] = 'Android'
 4 # Android操作系统版本
 5 desired_caps['platformVersion'] = '5.1'
 6 # 设备名称
 7 desired_caps['deviceName'] = '127.0.0.1:62001'
 8 # 被测App包名
 9 desired_caps['appPackage'] = 'com.nbi.aquatic'
10 # 被测App的入口Activity名
11 desired_caps['appActivity'] = '.ui.login.LoginActivity'
12 desired_caps['automationName'] = 'Uiautomator2'
13 # 把以上配置传到appium服务端并连接手机
14 driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

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

1 def setUp(self):
2    # 初始化测试平台
3    self.driver = driver

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

1 def test_36_end_testing(self):
2     """结束测试"""
3     self.driver.quit()

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

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

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

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

 1 from appium import webdriver
 2 from test_case.page_object.admin.pool import PoolPage
 3 import unittest
 4 import config
 5 import time
 6 class SmokeTest(unittest.TestCase):
 7   def setUp(self):
 8       # 初始化测试平台
 9       self.driver = driver
10   def test_10_admin_login(self):
11       """手机登录"""
12       LoginPage(self.driver).PhoneNumberlogin_action(
13          config.ADMIN_NUMBER,
14          config.ADMIN_PASSWORD,
15      )
16   def test_16_creat_aquatype(self):
17       """添加水产类型"""
18       PoolPage(self.driver).creat_aquatype(new_aquatype_name)
19   def test_17_creat_aquatic(self):
20       """养殖池添加养殖"""
21       PoolPage(self.driver).creat_aquatic()
22   def test_36_end_testing(self):
23       """结束测试"""
24       self.driver.quit()
25 if __name__ == '__main__':
26      # 定义一个单元测试容器
27      suite = unittest.TestSuite()
28      # addTest添加case到suite容器中,构造测试集
29      suite.addTest(SmokeTest('test_10_admin_login'))
30      suite.addTest(SmokeTest('test_16_creat_aquatype'))
31      suite.addTest(SmokeTest('test_17_creat_aquatic'))
32      suite.addTest(SmokeTest('test_36_end_testing'))
33      # 执行case
34      runner.run(suite)

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

 1 from selenium.webdriver.common.by import By
 2 from test_case.page_object.base import BasePage
 3 import time
 4 class PoolPage(BasePage):
 5     """定位元素"""
 6     creataquatic_btn_loc = (By.ID, 'com.nbi.aquatic:id/tv_add_breed')
 7     select_starttime_btn_loc = (By.ID, 'com.nbi.aquatic:id/textView158')
 8     # 添加水产类型(水产名称最长10个字符)
 9     def creat_aquatype(self, aquatype_name):
10         time.sleep(3)
11         self.find_element(*self.creataquatic_btn_loc).click()
12     .......
13     # 养殖池添加养殖
14     def creat_aquatic(self):
15         self.find_element(*self.select_starttime_btn_loc).click()

5.页面基础层BasePage

 1 from selenium.webdriver.support.ui import WebDriverWait
 2 from selenium.webdriver.support import expected_conditions as EC
 3 class BasePage(object):
 4    """页面基础类,用于所有页面的继承"""
 5    def __init__(self, selenium_driver):
 6       self.driver = selenium_driver
 7       self.timeout = 30
 8       self.poll_frequency = 0.1
 9 
10    def find_element(self, *loc):
11       return self.driver.find_element(*loc)
12 
13    def find_elements(self, *loc):
14       return self.driver.find_elements(*loc)
15 
16    def content_appeared(self):
17       self.find_element()
18 
19    def wait(self, loc):
20       WebDriverWait(self.driver, 10, 0.005).until(
21       EC.visibility_of_element_located(loc)
22    )
23 
24    def wait_and_compare(self, loc, text):
25       WebDriverWait(self.driver, 30, 0.5).until(
26       EC.text_to_be_present_in_element(loc, text)
27    )

生成HTML测试结果报告

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

 1 import HTMLTestRunner
 2 if __name__ == '__main__':
 3     suite = unittest.TestSuite()
 4     suite.addTest(SmokeTest('test_*_*'))
 5     # 写法一
 6     timestr = time.strftime('%Y%m%d', time.localtime(time.time())) # 本地日期作为报告名字
 7     filename = 'F:\\folder_data\\' # 文件名字及保存路径
 8     fp = open(filename + (timestr + '.html'), 'wb')
 9     runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')
10 
11    # 写法二
12    timestr = time.strftime('%Y%m%d', time.localtime(time.time()))
13    filename = '../_reports/' + timestr + '.html'
14    fp = open(filename, 'wb')
15    runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')
16 
17    # 执行case,并生成一份测试报告
18    runner.run(suite)
19    fp.close()

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

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

 1 from packages.HTMLTestRunner import HTMLTestRunner
 2 if __name__ == '__main__':
 3     suite = unittest.TestSuite()
 4     suite.addTest(SmokeTest('test_*_*'))
 5     # 写法三
 6     fp = open('../_reports/result.html', 'wb')
 7     runner = HTMLTestRunner(stream=fp, title='冒烟测试报告', description='用例执行情况: ')
 8     # 执行case,并生成一份测试报告
 9     runner.run(suite)
10     fp.close()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux Shell 半自动方式部署单机Oracle 21C

oracle前言 Oracle开发的关系数据库产品因性能卓越而闻名,Oracle数据库产品为财富排行榜上的前1000家公司所采用,许多大型网站也选用了Oracle系统,是世界最好的数据库产品。此外,Oracle公司还开发其他应用程序和软件。同时&#…

洗地机如何选购?洗地机十大名牌排行榜

洗地机是今年地面清洁领域热门的品类,如果你每天都要打扫家庭卫生的话,家里还有小孩子和有养宠物的话,如果你经常做饭,需要经常清洁厨房地面的话,那么你一定一定要配备一台洗地机在家里,它的高清洁力和便捷…

创新微MinewSemi厘米级定位精度的GNSS 模块—MS32SN4

近日,中国无线连接解决方案提供商MinewSemi推出了其GNSS模块系列-MS32SN4。MinewSemi表示,这些嵌入式模块为产品提供了一种易于使用、具有成本效益的解决方案,支持物联网(IoT)应用。 集成天线模块适用于消费者解决方案…

【TI毫米波雷达笔记】IWR6843AOPEVM-G的UniFlash烧录配置及避坑(官方手册有误)

【TI毫米波雷达笔记】IWR6843AOPEVM-G的UniFlash烧录配置及避坑(官方手册有误) 毫米波雷达有两种烧录方式: 搭配ICBOOST烧录雷达板自己烧录 搭配ICBOOST烧录时 需要配置为 MMWAVEICBOOST 模式 SOP都是下拉 而后通过 MMWAVEICBOOST 上的SO…

数据库基础——9.聚合函数

这篇文章来讲一下数据库中的聚合函数 目录 1. 聚合函数介绍 1.1 AVG和SUM函数 1.2 MIN和MAX函数 1.3 COUNT函数 2. GROUP BY 2.1 基本使用 2.2 使用多个列分组 2.3 GROUP BY中使用WITH ROLLUP 3. HAVING 3.1 基本使用 3.2 WHERE和HAVING的对比 4. SELECT的执…

Bugku CTF 矛盾 网站被黑

矛盾 打开链接,代码审计 使用get方式给num传参; 如果传入的不是数字,则会原样输出,比如我们传入abc 晃眼一看传入num等于1就可以输出flag,发现并不行 如果输入 注意,这里是两个等号 在php中&#xff0…

低代码会导致程序员失业吗?

低代码并不会导致程序员失业。低代码有价值,但请不要妖魔化。 虽然低代码开发,直到现在都没有清晰明确的定义,但低代码平台也不是先有定义再发展起来的事物。 低代码可以解决两个困扰已久的问题: 1、做开发,一定需要…

Cache性能,多核,一致性

cache performance影响因素: 1.cache size 2.block size 3.组相连度,4.替换策略 目标 1.减少miss rate(可以用一个指针指向不常用的数据结构) 2.减少miss penalty 3.减少hit cost 多核系统下的cache设计 分布or集中 集中 优点 缺点 资源竞争,不平等…

LabVIEWCompactRIO 开发指南第六章40 模块分类

模块分类 本节介绍不同类型的C系列I/O模块。需要了解这些模块是如何设计以正确实现计时和同步的。模块分类的基本类型如图6.6所示。 图6.6.C系列模块分类组织树 直接FPGA通信 在CompactRIO机箱中与FPGA直接通信的模块,将来自模块前部I/O连接器的信号通过模块背面…

机器学习常识 7: 决策树

摘要: 决策树是一种与人类思维一致, 可解释的模型. 1. 决策树的结构 人类的很多知识以决策规则的形式存储: 如果今天是阴天 (outlook overcast), 就去打球.如果今天出太阳 (outlook sunny) 而且湿度不高于 70% (humidity ≤ \le ≤ 70), 就去打球.如果今天出太阳 (outloo…

TDengine 基于Linux系统RPM安装

一、前文 TDengine 入门教程——导读 二、下载安装 再rpm安装&#xff0c;sudo rpm -ivh TDengine-server-<version>-Linux-x64.rpm安装的时候&#xff0c;会跳出两个提示 Enter FQDN:port&#xff0c;第一次安装&#xff0c;这个地方一定要直接回车跳过&#xff01;Ente…

基于javaweb jsp+SSM 校园点餐系统的视频演示

目录 一.项目介绍 二.环境需要 三.技术栈 四.使用说明 五. 运行截图 一.项目介绍 总菜单管理 用户前台 个人中心、美食大厅、购物车、福利中心 配送员面板 待配送订单、配送记录 商家管理 菜品管理&#xff08;类别、规格组、spu、sku&#xff09;、配送员管理、优惠券…

重学fetch

概述 Fetch是一种网络通信协议&#xff0c;用于在客户端和服务器之间传输数据。该协议使用HTTP请求和响应进行通信&#xff0c;与传统的AJAX方式相比&#xff0c;Fetch更加简单易用&#xff0c;并提供了许多现代化的功能。 使用Fetch可以方便地向服务器发送请求&#xff0c;并…

深入浅出Vite:如何开发一个Vite插件

说到自定义的能力&#xff0c;大家肯定很容易想到插件机制&#xff0c;利用一个插件来扩展构建工具自身的能力。在学习了 Vite 的插件机制后&#xff0c;我们接下来利用已掌握的Vite插件开发的基本知识来实战Vite插件的开发工作。 一、插件示例 Vite 插件与 Rollup 插件结构类…

利用pycocotools库计算MAP:生成coco格式 json文件数据集和计算map值

文章目录 1.划分val数据集2. xml to json3. coco格式json文件4. 生成coco格式json文件5.使用pycocotools计算map6. 讨论 在目标检测任务中&#xff0c;需要通过Map指标判断模型的精度。为了测试engine文件推理结果的精度&#xff0c;本文介绍了如何使用pycocotools库计算Map&am…

4年测试,裸辞后已失业3个月.....

我做测试4年&#xff0c;一线城市薪水拿到15K&#xff0c;中间还修了一个专升本&#xff0c;这个年限不说资深肯定也是配得上经验丰富的。今年行情不好人尽皆知&#xff0c;但我还是对我的薪水不是很满意&#xff0c;于是打算出去面试&#xff0c;希望可以搏一个高薪。 但真到面…

vscode使用git

文章目录 前言一、配置ssh-key二、GitHub上创建一个空的仓库三、链接GitHub&#xff0c;并提交本地文件 前言 从今天开始学习前端知识&#xff0c;学会先使用工具很重要&#xff0c;今天尝试了下用vscode链接GitHub&#xff0c;实现代码管理。 前提&#xff1a; 1、需要先下载…

科技云报道:2023年安全运营之风将吹向何方?

科技云报道原创。 在实战演练成为常态化的背景下&#xff0c;建立实战化安全运营能力是一个绕不开的话题。作为网络安全发展的时代产物&#xff0c;安全运营被认为是解决现有挑战的有利方法。 但随着有安全形势、政策导向、发展需求的变化&#xff0c;安全运营的理念也在不断演…

深度解析如何通过财务共享建设助推企业数智化转型

国务院国资委印发了《关于中央企业加快建设世界一流财务管理体系的指导意见》&#xff08;以下简称《意见》&#xff09;&#xff0c;文中明确指出了数智化转型的路径&#xff0c;即“积极探索依托财务共享实现财务数智化转型的有效路径&#xff0c;推进共享模式、流程和技术创…

Arnold图像置乱的MATLAB实现

这件事情的起因是这样的&#xff0c;我需要研究一下各种图像置乱的算法。然后在知乎上找到了一篇关于Arnold变化的文章&#xff0c;但是呢&#xff0c;这个人实际上是卖资料&#xff0c;代做大作业的。详细的代码根部不给你&#xff0c;则给我气坏了&#xff0c;必须要手动实现…