前言
最近接到一个测试项目,简单描述一下,需求就是:一端发送指令,另一端接受指令并处理指令。大概看了看有上百条指令,点点点岂不是废了,而且后期迭代,每次都需要点点点,想想就头大。冷静分析一下,其实这个需求的测试工作重复性很高,操作一端发送指令,查看另一端日志,验证指令接收处理是否正确,果断考虑自动化测试方案。
框架选择
基于本人情况,选择python+pytest+appium,具体该如何搭建,我们先从理论知识开始回顾熟悉一下。
Android自动化
想要开始Android自动化,必须要获取APP的相关信息。因为appium的capabilities配置中需要使用。当然Android sdk环境变量相关是更基本的,可以自行查找文档进行配置,这里就不介绍了。
获取APP信息
- 获取当前界面元素:adb shell dumpsys activity top
- 获取任务列表:adb shell dumpsys activity activities
App入口
- adb logcat |grep -i displayed
- aapt dump badging mobike.apk | grep launchable-activity
启动应用
adb shell am start -W -n com.qw.amobile/.splash.SplashActivity -S
回顾adb基本命令
- adb devices:查看设备
- adb kill-server:关闭 adb 的后台进程
- adb tcpip:让 Android 脱离 USB 线的 TCP 连接方式
- adb connect:连接开启了 TCP 连接方式的手机
- adb logcat:Android 日志查看
- adb bugreport:收集日志数据,用于后续的分析,比如耗电量
adb shell
adb shell 本身就是一个 Linux 的 shell,可以调用 Android 内置命令
- adb shell dumpsys
- adb shell pm
- adb shell am
- adb shell ps
- adb shell monkey
性能统计
- 获取所有的 dumpsys 子命令 dumpsys | grep -i DUMP
- 获取当前 activity adb shell dumpsys activity top
- 获取 activities 的记录,可以获取到 appium 依赖的原始 activity dumpsys activity activities
- 获取特定包基本信息 adb shell dumpsys package com.xueqiu.android
- 获取系统通知 adb shell dumpsys notifification
- 获得内存信息 adb shell dumpsys meminfo com.android.settings
- 获取 cpu 信息 adb shell dumpsys cpuinfo
- 获取 gpu 绘制分析 adb shell dumpsys gfxinfo com.android.settings
- 获取短信 adb shell dumpsys activity broadcasts | grep senderName=uiautomator
Appium
我们先来看看appium的生态工具
- Appium Desktop:内嵌了 Appium Server 和 Inspector 的综合工具
- Appium Server:Appium 的核心工具,命令行工具
- Appium Clients:各种语言的客户端封装库,用于连接 appium server Java、Python、Ruby、robotframework-appium
Appium Desktop
桌面版,这个更容易上手,可以让你更快体会到简易自动化的乐趣。它有哪些功能呢?元素查找、录制用例两大基本功能,爽的飞起。 要想启动app,需要先进行一些配置,如下图
配置完成之后,点击start session,就可以启动手机上的该app,成功启动后,就可以操作app了,启动后如下图所示
这个页面就可以查找元素定位以及录制用例。使用比较简单,不详细说了。
注意:如果报错找不到sdk,需要在配置中指定路径,如图所示
找到自己的路径复制进去,然后保存并重新打开就可以了。
Appium Server
官方推荐安装方式:npm install -g appium
,这种方法可能会失败或者很慢,那可以使用下面的方法
淘宝cpm:
ini
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install -g appium
还需要安装Node,可以从Appium源码中找推荐的版本。
验证是否安装配置成功,可以执行命令
appium-doctor
哪里失败,再针对问题具体搜索解决吧。开始环境配置可能遇到很多问题,不要被吓到,一个个解决,基本都可以找到解决方案。笔者配置时也遇到很多问题,最终还是成功了。建议:安装之前先找好适配版本,可以减少很多问题。
Python中使用
需要安装Appium-Python-Client
arduino
pip install Appium-Python-Client
定位元素
想要自动化,定位元素是必要的一步,有哪些方式可以定位元素呢
ini
class By:
"""Set of supported locator strategies."""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
可以看到可以通过这么多方法来定位元素。
举个例子:定位钉钉登录页面,最终实现自动登录
python
class LoginPage(BasePage):
_mobile_input_locator = (By.XPATH, '//XCUIElementTypeApplication[@name="钉钉"]/XCUIElementTypeWindow/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]/XCUIElementTypeOther[2]/XCUIElementTypeTextField')
_password_input_locator = (By.XPATH, '//XCUIElementTypeApplication[@name="钉钉"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]/XCUIElementTypeOther[3]/XCUIElementTypeSecureTextField')
_clear_input_locator = (By.XPATH, '//XCUIElementTypeButton[@name="清除文本"]')
_agree_locator = (By.XPATH, '//XCUIElementTypeApplication[@name="钉钉"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]/XCUIElementTypeOther[5]/XCUIElementTypeButton')
_login_locator = (By.XPATH, '//XCUIElementTypeStaticText[@name="登录"]')
def login(self, mobile, pwd):
self.find_element_and_click(self._mobile_input_locator)
self.find_element_and_click(self._clear_input_locator)
self.find_element(self._mobile_input_locator).send_keys(mobile)
self.find_element(self._password_input_locator).send_keys(pwd)
self.find_element_and_click(self._agree_locator)
self.find_element_and_click(self._login_locator)
return "登录成功"
和真实场景是一样的,点击手机号输入框->清除已有输入内容->输入登录手机号->输入密码->点击同意协议->点击登录,就登录成功了。这是基于page object设计模式设计的,这就是核心逻辑,用例层调用该方法即可,后续再详细写。
最后
这篇内容只写了一些基础以及钉钉自动登录的简单案例,后续异常处理、用例如何运行更加稳健,我们之后再做分享,笔者目前也是在实践中。