Appium 开源框架 appium+python (二) 支持多设备并行 + 性能监控 +webserver 监控 crash日志

测试小书童 · November 25, 2016 · Last by 测试小书童 replied at June 08, 2017 · 5255 hits
本帖已被设为精华帖!

本帖子基于上篇帖子python+appium 开源框架分享

最新更新

  • 去掉了对全局变量的依赖,现在用的是txt,后面优化成其他持久化数据的方式
  • 新增对多机android运行
  • 对多机日志监控

代码部分

  • 用yaml设置多设备
appium:
- devices: JTJ4C16331013562
port: 4723
config: node D:\app\Appium\node_modules\appium\bin\appium.js -p 4723 -bp 4733
platformName: android
- devices: MSM8926
port: 4724
config: node D:\app\Appium\node_modules\appium\bin\appium.js -p 4724 -bp 4734
platformName: android
  • 启动
class AppiumServer:
def __init__(self, l_devices):
self.l_devices = l_devices
def start_server(self):
"""start the appium server
:return:
"""

for i in range(0, len(self.l_devices["appium"])):
t1 = RunServer(self.l_devices["appium"][i]["config"])
p = Process(target=t1.start())
p.start()
def stop_server(self):
"""stop the appium server
selenium_appium: appium selenium
:return:
"""

os.system('taskkill /f /im node.exe')
def re_start_server(self):
"""reStart the appium server
"""

self.stop_server()
self.start_server()
def is_runnnig(self):
"""Determine whether server is running
:return:True or False
"""

response = None
for i in range(0, len(self.l_devices["appium"])):
url = " http://127.0.0.1:"+str(self.l_devices["appium"][i]["port"])+"/wd/hub"+"/status"
try:
response = urllib.request.urlopen(url, timeout=5)

if str(response.getcode()).startswith("2"):
return True
else:
return False
except URLError:
return False
finally:
if response:
response.close()
class RunServer(threading.Thread):
def __init__(self, cmd):
threading.Thread.__init__(self)
self.cmd = cmd
def run(self):
os.system(self.cmd)

  • 看看入口
def runnerPool():
devices_Pool = []
for i in range(0, len(ga["appium"])):
l_pool = []
t = {}
t["deviceName"] = ga["appium"][i]["devices"]
t["platformVersion"] = phoneBase.get_phone_info(devices=ga["appium"][i]["devices"])["release"]
t["platformName"] = ga["appium"][i]["platformName"]
t["port"] = ga["appium"][i]["port"]
l_pool.append(t)
devices_Pool.append(l_pool)
pool = Pool(len(devices_Pool)) #根据多个设备名新建多个不同的进程
# for i in range(2):
# pool.apply_async(sample_request, args=(t[i],)) # 异步
pool.map(runnerCaseApp, devices_Pool) # runnerCaseAppcase
pool.close()
pool.join()

看看运行效果

测试报告


主要问题点

  • 关于监控crash,我自己写了个jar包,闪退后会记录关键日志到本地,然后推送(用的socket client)到我的框架(socket server,一个设备一个socket server),框架中的socket server监控到闪退信息后,就会读取手机中的错误日志存到测试报告中
  • 现在是打的jar包引用到其他app中,一打开就闪退,很费解,一直无法找到原因,希望帮忙指导下
  • 打包的jar文件:

  • app在appliticon注册
<application android:allowBackup="true" 
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="com.XX.crashhandler.CrashApplication">

其他

更新

  • 已经解决把自定义获取app的crash日志,并以http get发送给我的框架中的web server,要注意
    • 引用jar包时,要放到libs目录(我放在其他目录直接不行)
    • 电脑和手机要在同一个网络
  • 如果感兴趣,可以看看上面的那个重写crash处理类的链接,我已经更新到最新代码
  • 后续会继续在此帖子中更新
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 16 条回复 时间 点赞
1Floor has been deleted
思寒_seveniruby 将本帖设为了精华贴 26 Nov 03:14

崩溃的话, 你得看堆栈分析吧.

有github吗

你的监控crash的程序得和被测APP是同一个进程才可以

#5楼 @lizhenghuan 不会,我用telnet试过,是可以的,可能是打包问题,好好研究下

测试小书童 基于 selenium grid 连接多个 appium 中提及了此贴 05 Dec 12:32

赋值的时候,复制/粘贴是怎么实现的?

Error
Traceback (most recent call last):
File "/Downloads/appiumn_auto-master/testCase/login.py", line 17, in setUp
super(testLogin, self).setUp()
File "/Downloads/appiumn_auto-master/testRunner/runnerBase.py", line 71, in setUp
if self.l_devices["platformName"] == common.ANDROID and common.FLAG:
TypeError: 'NoneType' object is not subscriptable

怎么运行到这里就失败了呀? 大家帮忙看看呀,谢谢了

目前碰到一些坑,大神帮忙看下

1.Common目录名改为common

2.Common/OperateFile.py改为operateFile.py
(以上估计是楼主规范命名的时候遗留下来的问题)

3.依赖库:PyYAML,XlsxWriter,schematics,selenium-requests(欢迎补充)

4.我是单台手机测试,所以devices.yaml中修改了一个,注释了一个,不知道行不行(注意自己电脑NODE.JS路径)

5.common/variable.py里面my server参数HOST改为本机IP

6.testDAL/apkBase.py,adbCommon.py里面,如果是WINDOWS环境,请换掉所有grep,改为findstr,不然获取不到包名

7.testCase/monkey.py,login.py里面的["deviceName"] == "你的设备名"

目前发现了这些问题,也不知道改的对不对。楼主的思路挺好的,希望楼主创建个QQ群,大家有什么问题可以讨论下。

最后我卡在了这个地方,有没有小伙伴能解答下(手机运行了一个闪退的程序,就没有后续了)

#11楼 @296760222
如果想捕获闪退的日志,注意如下:

  • apk应用的jar包是监控闪退日志的,一旦监控到闪退就会发一个请求处理,注意修改jar里面的host,和port需要修改成自己电脑的ip,源码这这里
  • 改好了CrashHandler里面的ip,改成你的电脑的ip,重新打包,引用到需要测试的apk工程里面,在application中实例化就可以鸟
  • 框架要开启web server 服务器

@lose,请教一个问题,你调试过IOS的多机并行连跑么?多设备都是使用WDA的同一个端口8100还是可以指定不同的端口?

#13楼 @Tank007 跨平台的,和安卓一样,唯一不一样就是测试用例的变化,性能信息的监控,ios还没有去实践

爽锅锅 回复

你的问题解决了吗?

测试小书童 关闭了讨论 31 May 13:56
测试小书童 重新开启了讨论 05 Jun 20:52

@jinyang.deng 改好了CrashHandler里面的ip,改成你的电脑的ip,重新打包,引用到需要测试的apk工程里面,在application中实例化就可以:

AndroidManifest设置application的值

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<application android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="com.XX.crashhandler.CrashApplication">

实例化

import android.app.Application;
import com.shikun.crashhandler.*; #引用打包的jar
public class CrashApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
CrashHandler mCrashHandler = CrashHandler.getInstance();
mCrashHandler.setCustomCrashHanler(getApplicationContext());
}
}

这边版本代码比较乱,也比较杂,可以等我下个版本,很快弄好:

  • 去掉了性能监控
  • 去掉了闪退监控
  • 采用pageobject的模式,支持多机并行

有问题可以加我微信

谢谢lose大神的赖心指导,学到不少东西

coder_chan 回复

请问你的问题解决了吗?我也遇到这种问题了,卡了很久了😧

测试小书童 PageObject+Python+Appium 中提及了此贴 07 Jun 21:04

hi @lose

该框架支持ios?

jimmy_70258 回复

有考虑支持ios,所以用的python,但是没有做适配

测试小书童 关闭了讨论 08 Jun 20:53
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up