测试基础 使用 MonkeyRunner 做批量过渠道包的小工具

大东 · 2014年05月24日 · 最后由 Overfly_zzl 回复于 2016年05月07日 · 2265 次阅读
本帖已被设为精华帖!

上周公司有同事抱怨说过渠道包太累,一下 60 多个包。由于某些安全机制,要检测每个包里面的一个视频播放功能是否可用,所有得一个个过下来,很累。
刚好看到@zouaiyong 同学用 MonkeyRunner 写的代码,就借鉴改造了一下,随便折腾了一份批量测渠道包的代码。
这里我就放出 循环安装、打开应用、截图对比、卸载的代码。打开应用之后播放视频的操作就去掉了,毕竟都是一堆坐标。仅供大家参考参考。
扔多少个 APK 进去,就自动跑多少个,跑完出 log,对比失败时自动停止。
不说了,看代码呗。

#!/usr/bin/env monkeyrunner
# -*- coding: utf-8 -*-

import time
import sys
import os
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

#设置应用包名和入口Activity名
pakageName = 'com.Your.www'
componentName = 'com.Your.www/.MainActivity'

#APP启动时等待时间(秒)
startTime = 5

#获取年月日时分秒
now = time.strftime("%Y-%m-%d-%H-%M-%S")

#python中获取当前运行的文件的名字
name=sys.argv[0].split("\\")
filename=name[len(name)-1]

#MonkeyRunner下获取运行的文件所在的路径
rootpath  = os.path.split(os.path.realpath(sys.argv[0]))[0]

#指定位置
dir = rootpath + "/apk/"
screenPath = rootpath + "/screenShot/"
logpath = rootpath + "/log/"

#获取待测APK个数
countPak = len(os.listdir(dir))

#新建一个Log文件
if not os.path.isdir(logpath):
    os.mkdir(logpath)
log = open( logpath + filename[0:-3] + "-log" +now + ".txt" , 'w')

#开始连接设备
print("Connecting...")
device = MonkeyRunner.waitForConnection()
log.write("连接设备...\n")

#卸载应用
print('Removing...')
device.removePackage(pakageName)
print ('Remove Successful!')
MonkeyRunner.sleep(2)
log.write("初始化应用环境...\n")
countOK = 0

#从dir路径下循环取出apk文件进行操作
for i in os.listdir(dir):
    print('Installing...<%s>'%i)
    log.write("==========安装应用==========\n")
    path = dir + '//' + i
    #安装应用
    device.installPackage(path)
    print('Install Successful!')

    #打开应用
    device.startActivity(component=componentName)
    MonkeyRunner.sleep(startTime)
    log.write("启动App...\n")

    #截图
    result=device.takeSnapshot()
    print("Take ScreenShot...")

    #保存截图
    result.writeToFile(screenPath + i + '.png','png')

    #进行图片比较
    resultTrue=MonkeyRunner.loadImageFromFile(screenPath + r'basePic.png')
    print "Pic Comparing..."
    log.write("对比图片中...\n")
    if(result.sameAs(resultTrue,0.9)):
        print("%s is OK!"%i)
        log.write("比较通过!--%s--包可用!\n"%i)
        #卸载应用
        print('Removing...')
        log.write("初始化应用环境,移除中...\n")
        device.removePackage(pakageName)
        print ('Remove Successful!')
        log.write("==========移除完毕==========\n")
        countOK += 1
        MonkeyRunner.sleep(2)
    else:
        print("False!Please check %s!"%i)
        log.write("比较失败!请检查安装包--%s--是否可用!\n"%i)
        break

log.write("共测试 %s 个包,%d 个通过。"%(countPak,countOK))

github 地址:https://github.com/AnikiKun/MonkeyRunner_ApkTest
github 上是我发给同事的文件夹,里面直接运行 bat 文件就可以开始自动跑了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 25 条回复 时间 点赞

最近在看 monkeyrunner,刚好学习一下,感谢。

:thumbsup:

#4 楼 @notalent 我说了,是一堆点击坐标的代码,我去掉了。 就是使用 touch、drag 等模拟操作进去到打开视频,然后也是截取视频的第一页,与基线图对比是否一致。

非常感谢@anikikun 同学的分享👍

@anikikun 要检测每个包里面的一个视频播放功能是否可用,这个脚本只是启动图吧。。。我很想知道怎么检测播放功能是否 OK 的。。

写的不错。

我是想要测试渠道包的渠道号,要是手工的话把 apk 转成 zip 查看 ttid 就行了,monkeyrunner 也可以实现吗?

大东 #20 · 2014年07月10日 Author

#7 楼 @blue_momo2009 这个也没必要用 monkeyrunner 了。。

非常感谢,根据楼主的思路,我也把我们公司的渠道包自动化起来了。

大东 #10 · 2014年08月25日 Author

#9 楼 @qiqi744 嗯,能有帮助就好。

#10 楼 @anikikun
谢谢,有启发!我在想如果要检测每个包的音频能否正常播放,应该怎么办呢?

大东 #16 · 2014年10月14日 Author

#11 楼 @lookatcn 这种没有 UI 上的明显变化的,monkeyrunner 的截图对比准确率会比较低。不过这种资源上的问题应该不会在渠道包上出现差异吧?
但思路还是有的,就是如果播放不成功,会不会有什么提示,可以以此为 checkpoint。

#12 楼 @anikikun
我不是用在测渠道包。
我们系统的每个版本出来后,需要做一套简单验证测试,针对每个重要应用,比如看看录音程序是否正常录放音,mp3 播放器是否正常播放,能否打电话,发短信,浏览网页。。。之类,我想能不能做个自动化的东西。

大东 #14 · 2014年10月14日 Author

#13 楼 @lookatcn 可以啊。robotium

学习了,

gradle 就可以实现打渠道包了吧,不过这种方法值得借鉴

感谢@anikikun的分享,学习了

楼主的脚本运行后启动不了 APK,但是在 monkeyrunner 命令行里同样的命令可以启动 APK

大东 #19 · 2015年08月05日 Author

#18 楼 @x746560359 如何启动不了,其实就是跟命令行是一样的吧

感谢分享!但是我这儿模拟器中可以启动 apk,连接真机竟然不行,不知道什么个原因@anikikun

对于中文名称的 apk 验证时会乱码

#8 楼 @anikikun 你造怎么解决 apk 名称中文乱码的问题咩?我试了网上很多种方法,都木解决。。。

进行图片比较那一步,怎么没有获取到图片,报空指针

我的问题已经解决
resultTrue=MonkeyRunner.loadImageFromFile(screenPath + r'basePic.png') 改成
resultTrue=MonkeyRunner.loadImageFromFile(screenPath +i+ '.png','png)
这样是否正确

陈子昂 求助:移动游戏 SDK 测试自动化 中提及了此贴 03月07日 04:11
20楼 已删除
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册