实现android应用程序自动化测试的批处理脚本,简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本...

一、前言

好久没写帖子,去年晋升为 leader 之后工作比较忙,去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试,到今天为止跑了将近半年,前期感觉还行,但随着用例的增加,执行自动化脚本的时间越来越长,而且感觉一台测试环境机器用跑一套用例比较浪费,所以这时候就应该要做并发自动化测试了

RobotFramework 是有一个叫pabot的工具用来并发执行脚本的,但是不知道是不是我才疏学浅不太懂用 pabot,发现它对测试用例执行并发的时候是遍历到测试套件的,但是一般情况下,一些相关性的测试套件是会放在不同的文件夹下,所以如果对文件夹进行并发执行的吧,那 pabot 就满足不了这个需求了,所以后来想到用批处理脚本的方法去实现这一需求

二、搭建过程

在 testerhome 上应该说过很多怎么用 appium 跑并发自动化,只是比较少说怎么结合 robot 来用,其实最关键的就是要设置不同设备的 id,即 udid,以及启动不同端口的 appium server,假设当前的需求是同时跑两台设备(模拟器)

第一步:启动模拟器,查看当前设备

b4f13a971bf850cdf2d4be08784318be.png

还是通过输入adb devices 查看一下当前设备的 devicename,其实就是可以将 devicename 作为 udid 的值,之后在脚本的 desired_caps 当中填入 udid=xxxx 就好了

第二步:设备 appium

首先是设置不同端口的 appium server

bd770693ec1e4fe44e5623d1e91e71e0.png

然后是 Bootstrap Port 也设置一下,注意不要用已经占用的端口号,devicename 也可以设置一下

c9074d22325e9079b55d177fffce0df3.png

设置完成之后启动 appium(这里是 2 个)就好了

a4e6bd02d0a55742cff9be898d710f41.png

第三步:批处理脚本编写

这里主要用到 windows 的批处理脚本作为执行 Robot 的 pybot 命令的基础,简单做起的话,有多少台模拟器就建多少个,当前可以参数化配置,这次就先以比较简单明了的方法先做了吧。

60827fb573bc7a41910d0cd3cb940677.png

还有用到 python 的多线程来作为并发的主要执行脚本,实现也非常简单

具体的实现代码:

robot_mutil.py #coding=utf-8import threading

from time import ctime,sleep

import os

def run(arg):

os.system(arg)

threads = []

cmd1="Start /wait robot_appium_1.bat" #线程1执行的命令1cmd2="Start /wait robot_appium_2.bat" #线程2执行的命令1cmd3="rebot --logtitle Lunkr4Android_TestLog --reporttitle Lunkr4Android_TestReport output1.xml output2.xml" #测试报告合并的命令3t1 = threading.Thread(target=run,args=(cmd1,))

threads.append(t1)

t2 = threading.Thread(target=run,args=(cmd2,))

threads.append(t2)

if __name__ == '__main__':

for t in threads:

t.setDaemon(True)

t.start()

t.join() #父进程等待子进程结束后再执行下去 os.system(cmd3) #执行命令3用rebot合并output1.xml和output2.xml,输出合并后的测试报告和日志 print "test finished"

首先说明一下命令中的start /wait,start /wait它的含义是:启动应用程序并等待它终止,用于调用多个应用程序时,指定:待该程序执行完后再执行下一个(排队执行)举个例子,一个文件夹中有很定系统补丁(按时间排序的)想依次安装完所有补丁,用 start /WAIT 就是最合适了,同样的我们分析一下脚本,首先是批处理文件的命令

robot_appium_1.bat pybot -o output1.xml -l log1.html -r report1.html ${TEST_FILE_PATH}&exit

robot_appium_2.bat pybot -o output2.xml -l log2.html -r report2.html ${TEST_FILE_PATH}&exit

脚本 1 和脚本 2 分别对应执行不同文件夹下的测试套件的命令,后面加个&exit,就是为了让脚本启动的测试用例执行完成后把子线程关掉,要所有的子进程都关掉之后,才会去执行合并测试报告的操作,如果不用 start /wait,python 脚本生成的子进程调用批处理脚本之后未等用例执行完成就会结束掉,这样就拿不到 output 生成报告了,同样的,如果一直在 wait,执行完测试用例之后没有 exit 的话,子进程一直未结束,合并测试报告的命令也不会执行,所以通过上面脚本之间的命令组合来使用有点巧妙的利用多线程的原理来实现并发自动化测试的操作,所以执行完成以后对看到生成对应的这些文件

5afb0f50953dbd594bed1c2211c71601.png

三、执行过程演示

具体的执行过程就是执行 python 脚本就好了,所以可以看看执行的效果

cc0f97fd06342fdb88d69428b71d6b62.gif

就这样,并发的自动化测试就实现了,当然一般还是 jenkins 来做自动构建,所以这里有一个注意的地方,在执行后操作生成测试报告的时候,是需要获取全部的 output.xml,所以在高级那里,用个模糊匹配配一下就好了

4157b391f09e104f129a77606fcfd75a.png

之后执行完成以后就能看到测试报告了

4349e5b409db1bb0ee23519d31f08a61.png

2c29e4f5ecf89c0ee85b921602bd8f67.png

大致的过程就是这样子啦

四、最后说几句

上面描述的都是一些很简单但又是很核心的操作步骤,当然有些大牛有更好的方法,或者更多优化的地方,比如说用脚本自动配置端口启动 appium,还是上面提到的脚本参数配置化等等,都可以,怎么高效怎么用就好,还有除了对一套用例分布执行之外,很多时候有需求说需要在不同的测试环境中去执行,如分别在 Android6.0 和 Android7.0 跑同套用例来覆盖系统版本,也是可以参照上面的方法去做的,再考虑一下如何安排测试数据和测试执行过程就可以了

其实上面也是描述的 android 端,这里提一下 ios 端,用模拟器是不可行的,一套 xcode 只能运行一台模拟器,所以 ios 端做并发的时候更多的要用到真机,但目前的话 appium 对接 xcode8 还很不稳定,包括在 build webdriveragent 到 ios 真机设备里面也一堆坑,现在我们测试团队在 ios 端的框架上也慢慢转到使用 macaca,相对 appium,macaca 给我们的感觉是更高效,而且我们将 macaca 大致按照 Robot 的 AppiumLibrary 的方式集成了一个 MacacaLibrary,可以结合 Robot 来之后,但目前还有 bug,之后完成了可能会分享出来,到时再说吧,这次的分享就这样啦,谢谢大家,欢迎尽情地吐槽

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

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

相关文章

祝大家新年快乐

祝大家新年快乐!万事如意!衷心祝愿大家在新的一年里:所有的期待都能出现! 所有的梦想都能实现!所有的希望都能如愿!所有的努力都能成功! 感谢大家一直以来对博客园的支持与帮助!转载于:https://www.cnblogs.com/dudu/archive/2007/02/17/652131.html

android 重新启动应用程序,在AsyncTask完成后重新启动完整的Android应用程序

我编码的应用程序检查/ sdcard下的目录中是否有特殊的ZIP文件,如果没有,则开始下载并解压缩.即使是子目录,下载和解压缩也可以工作.但是我需要在完成后重新启动应用程序 – 这不起作用.起初我有一个特殊的活动“PreMainActivity.java”只是为了重新启动目的:import …

Castle学习之一:安装与环境设置

第一步,当然是下载了。我本来下载的是Castle RC2的MSI安装文件,并通过SVN下载了Generator,但是安装后发现了一些问题(主要是.net版本的问题),所以删除了之后,从SVN下载了全部最新的代码&#xf…

android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

前言想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面。接下来就是试验可能相关的 Window Type属性,验证该方案是否可行。在尝试各个 Window Type 属性之前需要…

C# 调用 *.sql 文件

源&#xff1a;http://zhidao.baidu.com/question/5367984.html?si2using System; using System.Xml; using System.Data; using System.IO; using System.Collections; using System.Data.SqlClient; namespace ExecuteSqlFile { /// <summary> /// DBAccess 的摘要说明…

next按钮源码android,Android Edittext 软键盘输入法回车键改成下一步Next

软件盘中回车键默认功能是换行&#xff0c;但是有时候我们在Edittext中输完内容后点回车想要把焦点切到下一个Edittext继续输入&#xff0c;比如常见的登录页面&#xff0c;在输完用户名后&#xff0c;点回车调到输入密码输入框继续输入。示例代码代码很简单&#xff0c;如下所…

获取周的日期范围

/*** 获取周的日期范围* param string $week* param string $year* return array*/ public static function getWeekDate($week ,$year ) {/*** 2007年 第一周 是 01-01 到 01 - 07 因为第一天就是星期一 6* 2008年 第一周 是 01-01 到 01 - 06 因为第一天就是星期二 5 (闰年…

SQL SERVER 2005 T_SQL新的特性以及解决并发

一.修改语句的增强UPDATE test SET tname.WRITE(one hundred and two, 9, 3) WHERE tid 102在2005中增强了update方法&#xff0c;这是修改test表的列tname WRITE方法是把tname这个列中从字符串9开始 把3个长的字符串改为one hundred and two二、异常的捕获可以捕获过去会导致…

f5+big+client+android,F5负载均衡 MIBs bigip oid

F5 MIBs分组bigip-ltmpool-statoid".1.3.6.1.4.1.3375.2.2.5.2.3.1.1" name"ltmPoolStatName" smi-type"string"oid".1.3.6.1.4.1.3375.2.2.5.2.3.1.2" name"lPSServerPktsIn" smi-type"Counter"oid".1.3.6.…

Firefox: Connection Interrupted | The connection to the server was reset while the page was loading

http://blog.tangcs.com/2008/11/28/firefox-connection-interrupted/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/11/28/1343580.html

用dw(dreamweaver)开发asp.net,连接数据库时出现“http错误500,服务器内部错误”的解决方法...

前几天在用dreamweaver开发asp.net时&#xff0c;需要用到datagrid&#xff0c;但是在用dw的“应用程序/数据库”面板进行数据库连接时&#xff0c;老是弹出对话框&#xff1a;“http错误500&#xff0c;服务器内部错误”&#xff0c;无法连接数据库&#xff0c;搞了几天都没有…

android跑分和ios,手机:苹果VS安卓 跑分不代表手机流畅度

原标题&#xff1a;手机&#xff1a;苹果VS安卓 跑分不代表手机流畅度在当前的国内手机市场中&#xff0c;有两个阵营&#xff1a;安卓和苹果。 安卓系统仍然是使用最多的系统。从最初的128M内存到当前的十多GB内存&#xff0c;安卓手机已得到迅速发展和更新。但总体而言&#…

【转载】给程序员的圣诞大礼★★春夏

计算机寓言之春真爱与新生 1 两名学生 曾经有一名学生&#xff0c;他在课余时间里穿上古时侯的盔甲&#xff0c;随后他如今那些和他有类似想法的人在一起&#xff0c;模仿古代社会里的贵州和太太们。 另一名学生是计算机科学专业的&#xff0c;他问一名学生为什么要穿着奇装异服…

html5 打开网页自动全屏,HTML5实现浏览器播放全屏模式!

先写点css样式&#xff1a;*{margin:0;padding:0}.btn1{position:absolute;right:0;bottom:0;z-index:23;}.div1{position:relative;z-index:1;width:423px;height:230px;}这是全屏的封装函数&#xff1a;function aaa(element){if(element.requestFullscreen){element.reque…

Proxy(Chapter 22 of Pro Objective-C Design Patterns for iOS)

You’d naturally think about using the pattern when? You need a remote proxy that provides a local representative for an object in a different address space or in the network.? You need a virtual proxy to create heavy-weighted objects on demand. We will …

余宏德:Sun所有的核心技术都是开放的

3月30日上午&#xff0c;“Sun 2007年媒体论坛”在香港举办。时值Sun公司成立25周年&#xff0c;因此本次活动备受大家关注。Sun公司大中华区管理层和技术专家与40家左右的媒体记者进行了面对面的讨论。本次活动的主题是“创新共享成长&#xff0d;为社会进步而创新”&#xff…

html打开自动点击,如何把一段JS点击触发改为页面打开后就自动触发?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1、最简单的调用方式直接写到html的body标签里面&#xff0c;如&#xff1a;2、在JS语句调用function func(){……}window.οnlοadfunc;3、同时 调用多个函数直接写到html的body标签里面,如&#xff1a;4、js调用多个函数,以下这种…

图示/白话 execve执行流程

转载于:https://www.cnblogs.com/image-eye/archive/2011/07/13/2105411.html

转pbr随笔

光的基本传递模型]1 在一个要渲染的场景中&#xff0c;我们认为光能由预先指定的光源发出&#xff0c;然后我们以光线来描述光能的传递过程&#xff0c;当整个场景中的光能信息被我们计算出来后&#xff0c;我们收集这些信息转化为顶点的亮度。2 光线经过物体表面可以产生反射和…

易企秀手机html5场景源码,【VIP源码】六月1日最新完美版易企秀微信场景源码

[v_notice]下面演示图为哥亲测截图&#xff0c;仅供参考&#xff0c;在这里下载的源码100%和演示截图一致[/v_notice]修补的首页&#xff1a;前台用户后台界面&#xff1a;场景制作界面&#xff1a;转场特效页面&#xff1a;特效增加&#xff1a;设计模板&#xff1a;制作预览页…