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

测试小书童 · 2016年11月25日 · 最后由 测试小书童 回复于 2017年06月08日 · 3194 次阅读
本帖已被设为精华帖!

本帖子基于上篇帖子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)  # runnerCaseApp是case
    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 条回复 时间 点赞
测试小书童 关闭了讨论 06月08日 20:53
jimmy_70258 回复

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

hi @lose

该框架支持 ios?

测试小书童 PageObject+Python+Appium 中提及了此贴 06月07日 21:04
coder_chan 回复

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

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

@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 的模式,支持多机并行

有问题可以加我微信

测试小书童 重新开启了讨论 06月05日 20:52
测试小书童 关闭了讨论 05月31日 13:56
爽锅锅 回复

你的问题解决了吗?

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

匿名 #13 · 2017年01月12日

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

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

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

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

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 群,大家有什么问题可以讨论下。

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

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

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

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

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

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

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

有 github 吗

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

思寒_seveniruby 将本帖设为了精华贴 11月26日 03:14
1楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册