ATX 是AutomatorX的简称,是一个 Python 库,可以用在手机应用的 UI 自动化上,兼容 Android 和 iOS,吸收众多开源框架所长,有着很高的稳定性。
脚本编写也全部采用 Python 语言,虽说,稍微有点学习成本,但却有着相当高的灵活性。
下面就拿我平常用的最多的软件 “网易云音乐” 为例,介绍如何测试一个 Android 应用。
文档分为 3 个部分
ATX 的安装这篇文章不做详细介绍,参考其官网的主页一步一步的来就可以了 https://github.com/codeskyblue/AutomatorX
这里说的启动应用并不是要你手动去点应用的图标,而是告诉你如何用 python 代码来启动应用,Android 启动应用需要知道被测应用的 package_name,如果已经有 apk 的安装包的话,获取起来其实很简单。(我是直接去网易云音乐的主页上下载的)
比如 apk 的文件名叫 netease-music.apk
, 打开命令行,输入
$ python -m atx apkparse netease-music.apk
{
"main_activity": "com.netease.cloudmusic.activity.LoadingActivity",
"package_name": "com.netease.cloudmusic"
}
可以看到 package_name 是 com.netease.cloudmusic
, package_name 和 activity 一般都是不变的,记录下来,不用一直去查看。
用一个你最喜欢的编辑器,比如 sublime,新建一个文件叫 test_music.py
, 最开始的内容这样写
# coding: utf-8
import atx
d = atx.connect()
print d.start_app('com.netease.cloudmusic', "com.netease.cloudmusic.activity.LoadingActivity")
其中的 d.start_app(...) 就是启动应用的意思,返回值还包含了,启动所话费的时间,这里知道就好了,我们先忽略掉返回值,运行下脚本测试下,看一切是否顺利
这里需要用到 uiautomatorviewer 这个工具,它是 android-sdk 自带的一个查看 UI 图层的工具,其下载地址在https://developer.android.com/studio/index.html
下载解压完后,在 tools 目录下可以找到该软件。
打开软件,App 中所有组件的名字,属性,位置都清晰可见。
以个性推荐这个按钮为例,可以看到它的所有属性
把该元素,表示为一个 python 对象为 (这里是重点,我加粗表示)
d(text=u'个性推荐', className='android.widget.TextView')
下面我们开始设计第一个用例,完成的功能就是
利用 uiautomatorviewer 获取到所有需要点击的元素
d(text=u'个性推荐', className='android.widget.TextView')
d(text=u'每日歌曲推荐')
d(text=u'暂时没有内容')
d(description=u'转到上一层级')
然后组合成一段 python 代码
# coding: utf-8
import atx
d = atx.connect()
def main():
d(text=u'歌单').click()
d(text=u'个性推荐').click()
d(text=u'每日歌曲推荐').click.wait() # 点击并等待页面刷新
assert d(text=u'暂时没有内容').exists
print 'Back'
d(description=u'转到上一层级').click()
print 'Finish'
if __name__ == '__main__':
main()
脚本写好了,直接用命令行就可以调试了, python test_music.py
,一切顺利的话,就可以看到手机按照我们预先定义的操作一步步的在运行了。
现在只要,在继续前进一小步,就可以生成一个不错的测试报告了。我们需要用到 atx 所提供的一个测试报告扩展插件 atx.ext.report.Report
稍微修改代码的前几行,改成
# coding: utf-8
import atx
from atx.ext import report
d = atx.connect()
rp = report.Report(d, save_dir='report')
rp.patch_uiautomator()
rp.info("Start test")
def main():
d(text=u'歌单').click()
d(text=u'个性推荐').click()
d(text=u'每日歌曲推荐').click.wait(timeout=10)
assert d(text=u'暂时没有内容').exists
print 'Back'
d(description=u'转到上一层级').click()
print 'Finish'
if __name__ == '__main__':
main()
运行后,在运行脚本的当前目录下就会发现多了一个 report 的目录。用浏览器打开其中的 index.html 就可以看到每一步的操作记录了。
为了方便起见,我传了一张图到外部的云存储上
https://o8oookdsx.qnssl.com/html_reports/atx-cloudmusic-report/index.html
另外也截一张图,方便没有网络不好的同学
到此,文章就算结束了,可以集成到 Jenkins 或者自己建设的平台上。
自动化测试的道路漫长艰辛,但却又前途光明,可能还有一些不足,还有些不完善,但在不断的努力下,所有的问题,都将会逐一攻破。
作者:codeskyblue 2016-07-14 杭州