测试开发 | AppCrawler 自动遍历测试实践(二):定制化配置

LeetCode刷题
• 阅读 631

定制化配置

自动遍历测试技术以及工具该如何选择和快速入门?经过对比和需求,最终选择测试架构师思寒大佬的 AppCrawler 作为自动遍历测试的工具。以下就分享 AppCrawler 自动遍历测试的一些最佳实践经验。

模板文件生成

运行命令java -jar appcrawler-2.4.0-jar-with-dependencies.jar --demo, 会在当前目录下生成一个 demo.yml 文件,这个文件就是我们进行定制化的配置文件模板:

执行命令生成demo.yaml模板配置文件

$ java -jar appcrawler-2.4.0-jar-with-dependencies.jar --demo

2019-12-01 21:33:35 INFO [AppCrawler$.86.main]

AppCrawler 2.4.0 [霍格沃兹测试开发学社特别纪念版]
Appium 1.8.1 Java8 tested
app爬虫, 用于自动遍历测试. 支持Android和iOS, 支持真机和模拟器

项目地址: https://github.com/seveniruby...

2019-12-01 21:33:35 INFO [AppCrawler$.223.parseParams] use default appium address 4723
2019-12-01 21:33:35 INFO [AppCrawler$.230.parseParams] appium address = Some(http://127.0.0.1:4723/wd/hub)
2019-12-01 21:33:35 INFO [AppCrawler$.242.parseParams] result directory = 20191201213335
2019-12-01 21:33:36 INFO [AppCrawler$.286.parseParams] you can read /Users/qinzhen/Documents/TestDev/AppCrawler/demo.yml for demo

查看配置文件已生成

$ ls
appcrawler-2.4.0-jar-with-dependencies.jar
demo.yml

​​​

打开配置文件demo.yaml如下:


pluginList: []
saveScreen: true
reportTitle: ""
resultDir: "20191201213335"
waitLoading: 500
waitLaunch: 6000
showCancel: true
maxTime: 10800
maxDepth: 10
capability:
noReset: "true"
fullReset: "false"
appium: "http://127.0.0.1:4723/wd/hub"
testcase:
name: "Ceshiren AppCrawler"
steps:

  • given: []
    when: null
    then: []
    xpath: "/*"
    action: "Thread.sleep(5000)"
    actions: []
    times: 0

selectedList:

  • given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Button')]"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Text') and @clickable='true' and string-length(@text)<10]"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//[@clickable='true']/[contains(name(), 'Text') and string-length(@text)<10]"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Image') and @clickable='true']"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//[@clickable='true']/[contains(name(), 'Image')]"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Image') and @name!='']"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//*[contains(name(), 'Text') and @name!='' and string-length(@label)<10]"
    action: null
    actions: []
    times: 0
    firstList: []
    lastList:
  • given: []
    when: null
    then: []
    xpath: "//[@selected='true']/..//"
    action: null
    actions: []
    times: 0
  • given: []
    when: null
    then: []
    xpath: "//[@selected='true']/../..//"
    action: null
    actions: []
    times: 0
    backButton:
  • given: []
    when: null
    then: []
    xpath: "Navigate up"
    action: null
    actions: []
    times: 0
    triggerActions:
  • given: []
    when: null
    then: []
    xpath: "share_comment_guide_btn"
    action: null
    actions: []
    times: 0
    xpathAttributes:
  • "name"
  • "label"
  • "value"
  • "resource-id"
  • "content-desc"
  • "instance"
  • "text"
    sortByAttribute:
  • "depth"
  • "list"
  • "selected"
    findBy: "default"
    defineUrl: []
    baseUrl: []
    appWhiteList: []
    urlBlackList: []
    urlWhiteList: []
    blackList:
  • given: []
    when: null
    then: []
    xpath: ".[0-9]{2}."
    action: null
    actions: []
    times: 0
    beforeRestart: []
    beforeElement:
  • given: []
    when: null
    then: []
    xpath: "/*"
    action: "Thread.sleep(500)"
    actions: []
    times: 0
    afterElement: []
    afterPage: []
    afterPageMax: 2
    tagLimitMax: 2
    tagLimit:
  • given: []
    when: null
    then: []
    xpath: "确定"
    action: null
    actions: []
    times: 1000
  • given: []
    when: null
    then: []
    xpath: "取消"
    action: null
    actions: []
    times: 1000
  • given: []
    when: null
    then: []
    xpath: "share_comment_guide_btn_name"
    action: null
    actions: []
    times: 1000
    assertGlobal: []

执行参数

同样,还是以雪球 App 为例,以实际操作运行来解释配置文件中各个参数的含义和用法

capability 设置: 与 appium 完全一致,但要注意这里默认有 noReset: "true" 和 appium: "http://127.0.0.1:4723/wd/hub" 属性,配置完成如下

capability:
noReset: "false"
fullReset: "false"
appium: "http://127.0.0.1:4723/wd/hub"
appPackage: com.xueqiu.androi
appActivity: .view.WelcomeActivityAlias
automationName: uiautomator2
autoGrantPermissions: true
这里再介绍两个很有趣也很有用的参数:

dontStopAppOnReset: true ;这个参数允许我们在某个页面继续执行遍历,比如我们希望App先进入到某个页面后再进行遍历,或者当一个session结束后继续下一个session的时候我们希望不要杀死App重新执行,而是继续上一次结束的页面开始执行

ignoreUnimportantViews: 这个参数设置为true的时候可以忽略不重要的view,加速pageSource的加载,加快测试速度

testcase: 用于启动APP后的基础测试用例

执行参数

完整形态

允许我们以 given、when、then 的形式指定操作,如果学习过 Java 的接口自动化框架 rest-assured 话可以很容易理解这三个参数表达的含义:

given : 所有的先决条件,给定一个条件,只有条件成立的时候才完成后面的操作(实际用的较少)

when : 先决条件成立后的行为,对什么事件做什么事情

then : 断言集合,事件结束后对结果断言

具体写法如下:

estcase:
name: "Ceshiren AppCrawler"
steps:

  • when:

    xpath: //*
    action: driver.swipe(0.5, 0.8, 0.5, 0.2)
  • when:

    xpath: //*
    action: driver.swipe(0.5, 0.2, 0.5, 0.8)

    then:

    • //*[contains(@text, '美股')]

执行参数

简写形态

另外实际使用中我们会经常使用简写形态

直接使用 xpath 对应 when 里面的 xpath

直接使用 action 对应 when 里面的 action 具体写法如下:

xpath: 自选
action: click
then:

  • //*[contains(@text, '美股')]

注:定位模式除了可以使用 xpath 之外还可以使用正则和包含关系,只不过经常使用的是 xpath,也更为严谨;

正则:使用^开头的就认定为正则,^确定$,^.*输入密码

包含:可以使用元素其中包含的内容进行定位; 密码,输入,请

这里以雪球首页搜索框输入 alibaba 的简单场景举例,在搜索前还需要处理掉升级弹框,修改完成如下:

testcase:
name: "XueQiuTestDemo AppCrawler"
steps:

  • { xpath: "//*[contains(@resource-id,'image_cancel')]", action: click }
  • xpath: home_search
    action: click
  • xpath: search_input_text
    action: alibaba

如上的 testcase 写法还要多说几句:

也可以使用 {} 将需要执行的事件包裹起来,元素定位符和操作 action 时间用逗号隔开

{} 内若使用 xpath 表达式的话需要加双引号

xpath 中直接写 id 或 text 文本信息,就会默认使用包含去查找

需要点击的事件要明确指明 click,某则会报错;虽然思寒说过默认的 action 就是 click ,但是经过实测发现在 2.4.0 版本上必须指明 action:click ; 很可能是思寒本地使用的内部版本经过了优化更新还未来得及开源到 GitHub上。

运行效果:

selectedList: 遍历范围设定
这里如果想设置让其点击所有可点击的TextView和ImageView控件,修改完成如下:

selectedList:

  • xpath: //android.widget.ImageView[@clickable='true']
  • xpath: //*[@clickable='true' and contains(@class,"Text")]
    firstList: 优先被点击

lastList:最后执行 设置其最后才执行"确定"按钮,修改完成如下:

lastList:

  • { xpath: text_yes, action: click }
    backButton: 当所有元素都被点击后默认后退控件定位

blackList:黑名单

triggerAction: 特定条件出发执行动作的设置;设置遇到重置密码输入框时输入123456abc两次,修改完成如下:

triggerActions:

  • { xpath: android.widget.EditText, action: 123456abc, times: 2 }
    tagLimitMax: 全局设置,同类型的最多点击的次数;这里设置为2次

tagLimitMax: 2
tagLimit: 自定义控件类型的点击次数,这里设置对于ListView类型的只点击一次; 修改完成如下 :

  • { xpath: "//[contains(@class, 'List')]//", times: 1 }
    maxDepth: 遍历的最大深度

assertGlobal:设置一个全局断言,例如可设置断言在当前App,如果包名不符合,就可能发生了崩溃,便会报错

注:执行参数比配置文件优先级高

到这里,appcrawler的基本语法和参数含义大致介绍了一遍,后面就是如何结合实际进行使用了。下一篇将进行详细的介绍。
————————————————
版权声明:本文为CSDN博主「霍格沃兹测试开发学社」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Hogwart...

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Selenium自动化的JUnit参数化实践
作为自动化测试人员,经常会遇到这样Selenium测试自动化场景:_需要一次又一次地执行相同的测试用例,只是使用不同的输入和环境配置,从而使工作变得冗长且多余。_为了处理这种用例冗余,大多数人都会选择可以选择参数化测试。使用参数化测试,测试人员可以再次运行相同的自动化测试脚本,但使用不同的数据。参数化测试通过利用测试方法收集结
Stella981 Stella981
3年前
Katalon 学习笔记(一)
工具介绍:KatalonStudio是一个能提供一整套功能来实现Web,API和Mobile的全自动测试解决方案的自动化测试平台。KatalonStudio构建于开源Selenium和Appium框架之上,通过减少学习和集成这些框架以满足自动化测试需求所需的工作量和专业知识,使团队能够快速开始测试自动化。与其他流行工具
Stella981 Stella981
3年前
Jenkins+RF持续集成测试(一) 环境搭建
通常在自动化测试中,我们需要对自动化测试用例定时构建,并生成报告并通过邮件发给指定的人。最佳工具选择莫过于Jenkins了。通过Jenkins集成robotframework插件,我们能非常方便的定时从git/svn上拉取最新的自动化测试用例,然后执行用例并把最终结果以测试报告的形式发给指定的人群。下面我就来详细为大家介绍一下Jenkins集成RF插件
Stella981 Stella981
3年前
Robot Framework 使用【1】
前言RobotFramework作为公司能快速落地实现UI自动化测试的一款框架,同时也非常适合刚入门自动化测试的朋友们去快速学习自动化,笔者计划通过从搭建逐步到完成自动化测试的过程来整体描述它的使用。RobotFramework环境搭建步骤RobotFramework
陈哥聊测试 陈哥聊测试
1年前
如何选择合适的自动化测试工具?
自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中,几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试,以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务,但困难的部分就是选择
陈哥聊测试 陈哥聊测试
6个月前
测试自动化中遵循的最佳实践
本文着眼于团队在测试自动化中应该遵循的最佳实践,从选择正确的工具到代码的可重用性。
数据驱动测试-从方法探研到最佳实践
在自动化测试实践中,测试数据是制造测试场景的必要条件,本文主要讲述了在沟通自动化框架如何分层,数据如何存储,以及基于单元测试pytest下如何执行。并通过实践案例分享,提供数据驱动测试的具体落地方案。
API 小达人 API 小达人
1年前
如何进行自动化测试,提高测试效率?
作为测试人员,在进行比较大的项目时,使用自动化测试能帮助我们事半功倍地完成测试工作,提高测试效率,缩短开发周期。EolinkApikit为测试工程师提供API文档管理、快速接口调试、测试用例管理、及自动化测试等功能。协作测试工程师快速查看API文档及变更,以及更快的进行接口测试和自动化测试工作,降低测试用例编辑成本,提升自动化测试效率。
浅析RobotFramework工具的使用 | 京东物流技术团队
1简介最近几年越来越多的公司都开始进行自动化测试的设计和布局了,自动化,顾名思义就是把以人为驱动的测试行为转化为机器执行的一种过程,并经常用于回归测试中,市面上也存在很多开源的自动化测试的工具和理论知识,今天我要说的是RobotFramework这个工具;