ATX 用 ATX 进行简单的功能冒烟

奇葩是多花 · 2017年03月16日 · 最后由 loneyao 回复于 2018年08月06日 · 3259 次阅读
本帖已被设为精华帖!

情人节那天偶尔发现了 TesterHome 社区,进了社区发现了 ATX,当时觉得这个应该挺适合用来冒烟的,于是动手截了些图,做了一些简单功能的冒烟,求轻拍

环境准备

这个系列文章里面已经列了很多了,我就不赘述了大概就是
python2.7
Android 4.1+
ATX 手机助手(搜狗输入法好像不能用,推荐使用这个)
ATX 库

进入游戏

import sys
import atx
import time
from atx.ext.report import Report
from word import *

d = atx.connect() 
print d.start_app('com.uc108.mobile.xxsn',"com.uc108.mobile.runtime.SplashActivity")
time.sleep(10)

rp = Report(d, save_dir=u'report')
rp.patch_uiautomator()
rp.info("Test started", screenshot=d.screenshot())

#一般用新账号进行冒烟
d.click_image("账号登出.1920x1080.png",timeout = 10,safe = False)
d(text=u'注册').click()
d(text=u'一键注册').click()

d.click_image("进入游戏.1920x1080.png")

这样就进入游戏主场景了

聊天模块

下面我们来写聊天模块,聊天模块,冒烟中无非需要测试的是大小写,中文,特殊字符,屏蔽字等,我把屏蔽字库生成一个叫 word 的字典(本来是要直接读表的,但是 python 零基础,那些库不会用,所以字典凑合用吧)

#py字典文件
# -*- encoding: utf-8 -*-
word = {1:u"'测试开始'",
    2:u"'小写字母'zasdajshda12",
    3:u"'大写字母'DSAHDHFAQWD12",
    4:u"'大小写'saldaDSADSA12",
    5:u"'中文'撒大沙发啥叫撒大苏打",
    6:u"'屏蔽字测试'安局办公楼安局豪华安门事",
    7:u"'特殊符号',。、‘; 【】.=-.+;!@#$%^&*()",
    8:u"'屏蔽字测试'测试结束",
    9:u"'屏蔽字测试'安门事",
    10:u"'屏蔽字测试'安眠藥",
    11:u"'屏蔽字测试'案的准确"}

chat_sum = 1                  
while chat_sum < 10:
    if d.exists("发送@auto.png"):
        d.click_image("发送@auto.png",offset=(-4,0))
    else:
        d.click_image("聊天@auto.png")
        d.click_image("发送@auto.png",offset=(-4,0))
    d.type(word[chat_sum], enter=True)   #输入聊天内容,读word屏蔽字典
    d.click_image("发送@auto.png",timeout = 16)
    chat_sum = chat_sum + 1
d.click_image("关闭聊天界面@auto.png")

下面就是执行完聊天模块

商店模块

下面来商店模块,商店中需要冒烟的内容差不多就是道具的购买,不同商店的切换

d.click_image("商店.1920x1080.png")#默认在铜钱店铺
#根据权重,排列了道具出现概率的高低,如果没有,就随机购买
if d.exists("经验丹.1920x1080.png"):
    d.click_image("经验丹.1920x1080.png")
elif d.exists("水晶.1920x1080.png"):
    d.click_image("水晶.1920x1080.png")
else:
    d.click_image("铜币.1920x1080.png")
d.click_image("购买.1920x1080.png")

#勾玉店铺
d.click_image("勾玉店铺.1920x1080.png")
if d.exists("英雄碎片.1920x1080.png"):
    d.click_image("英雄碎片.1920x1080.png")
else:
    d.click_image("勾玉.1920x1080.png")
d.click_image("购买.1920x1080.png")

#竞技场店铺
pass
#公会店铺
pass
#试炼店铺
pass
rp.close()

这边是执行后

其他系统模块也是大同小异,另外我们游戏还没上线,所以其他的就不列了,都是简单的点击操作,就不写了。
最后可以查看 html 文件,查看每一步点击操作前后 的截图

end

这就是我最近的应用,每天上班吃早饭的时候,用脚本简单跑下冒烟,吃完早饭就可以开始干活了~~~
还有困惑就是,我在游戏测试里,找不到合适的方法去断言,现在只能用来跑下基本的流程。可能我还没入门吧,不知道大家有没有什么建议。

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

挺不错的。 @jiazurongyu

奇葩是多花 ATX 录放编辑器 -- WEditor 中提及了此贴 03月16日 17:01

不错,终于看到了实践类的文章了,激动的我泪流满面

挺不错的,也支持类似 opencv 的图形识别。
直接 click_image 资源
现在很多公司都公开客户端给测试了吧。

好贴,赞一个。

unity3d 游戏可以用吗

洒大目 回复

可以的,这个是根据图形识别的。unity,腾讯好像有一个开源的 GAutomator,据说可以识别控件的,你可以尝试下,那个我还没试过~

你写的这个用例如何判断结果?验证对不对

洒大目 回复

结尾写了~~暂时没想到办法来断言。现在只能用来跑一些简单的冒烟,有没有断言我个人觉得无所谓吧,毕竟冒烟的模块都是已经通过了详细的测试,跑这个只是为了保证日常迭代过程中,原本的功能逻辑没有出现问题。

关键是加入出现了问题 是不是发现不了

洒大目 回复

现在除了正常流程以外的问题都发现不了,比如上面聊天界面头像丢了。但是比如抽卡界面十连抽报错,没有跳出确定按钮;商店改了 item 表,服务端没更新,弹出超时重连,类似这种问题会导致脚本中断。所以现在还不能玩完全依赖这个,我现在是每天用脚本跑,每周出版本会自己再过一遍。这个现在只是一个尝试,以后也许会有一些好的办法去断言吧,这个可能需要大家一起想办法了,我也是才接触~

嗯嗯 向你学习

你自己封装一些断言方法啊。例如,传入图片 xxx.png 和延时 y 秒,断言在 y 秒内是否能找到该图片,找到则 Pass,找不到则 Fail。
还可以和截图配合,如果 Fail 则把当前界面截图保存。
与输出测试报告结合,把测试结果最后输出成 txt 文件,然后邮件发送给自己。
与 jenkins 结合,定制每天定时的检查测试。
等等,这些都是我们目前在采用的方案

rojasall 回复

恩,我有时间试下~

思寒_seveniruby 将本帖设为了精华贴 03月17日 11:11

看上去挺不错的,有空尝试一下

暂时没想到的话 可以用 xml 文本来做简单的验证吧 后面可以用更精确的方式

楼主打印一下 d.click_image() 就知道返回一个对象,依据对象的值做断言

源码中 match 方法中的注释:

"""Check if image position in screen

        Args:
            - pattern: Image file name or opencv image object
            - screen (PIL.Image): optional, if not None, screenshot method will be called
            - threshold (float): it depends on the image match method
            - method (string): choices on <template | sift>

        Returns:
            None or FindPoint, For example:

            FindPoint(pos=(20, 30), method='tmpl', confidence=0.801, matched=True)

            Only when confidence > self.image_match_threshold, matched will be True

        Raises:
            TypeError: when image_match_method is invalid
"""

FindPoint(pos=(20, 30), method='tmpl', confidence=0.801, matched=True)

楼主,请问下,如果是网页的图标,而且没有文案,如何模拟点击到这个文案?怎么获取这个图片的名称?

codeskyblue ATX 资料快速索引 中提及了此贴 06月21日 19:39

这种图像识别是否跟手机分辨率有关系, 如果做多台手机使用同一个脚本,用什么方式获取要操作的图片

chen 回复

和分辨率有关,有不同分辨率的手机的话,你就需要另一套分辨率的图片,用这个操作图片 d.click_image("button@auto.png"),很麻烦。我是在同一个分辨率下测试的

剪烛 回复

要是同一个界面里有很多个同样的图片怎么才能全部都给点击一次呢?比如好友申请里面有很多个同意图片。怎么找到位置呢?

rojasall 回复

请问如何结合 jekins

wolfgao 移动客户端 /UI 开源测试框架梳理和大比拼 中提及了此贴 02月27日 21:03
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册