Robotium [已解决] Robotium apk 崩溃后如何再继续执行后续用例

叶子 · 2015年08月19日 · 最后由 木月 回复于 2015年11月26日 · 1569 次阅读

解决方法:https://testerhome.com/topics/1996

问题:Robotium 在运行测试用例的时候,有时候会遇到导致被测试程序 crash 的情况,同时测试程序中会停止,然后测试结果也收集不到了。
Instrumentation tests live in the same process as your application, if you applications process crashes so do your tests 这个我知道,我目前只是想找到解决方法。
希望达到效果:把程序唤醒然后略过这条用例继续执行后续用例,保证能收集到所有测试结果,包括 crash 的部分
目前情况简介:我目前是通过 ant 在 build 文件中写 adb shell 命令配置到 jenkins 中执行用例,所有用例是在 xml 中配置好的,同时在 jenkins 写 groovy 脚本可以获取到所有要执行的测试用例类名
求助:大家有没有什么好的处理方法还请赐教
下图是执行过程中遇到的崩溃问题而终止执行的情况

看图上的共同特点是异常后都有 shortMsg=XXX

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

提问的方式不对吗?没有人遇到这样的问题吗?为什么没有人回答@lihuazhang

#1 楼 @emily 用 Robotium 的人,这个社区不多。

写个工具来重启崩溃的 TestSuite,
使用线程管理的办法,adb shell 命令启动 TestSuite。
把每个手机当作一个线程,每个手机里跑的 robotium 都是单线程的。你需要监控,管理每个线程,同时你还有监控每台手机的 log,当出现 crashe 的 log 时,启动新的线程来启动新的 TestSuite。

#3 楼 @ganyunxiao 你说的工具是运行在 PC 上的还是手机上的 apk,方便和 jenkins 搭配吗?我考虑一下你的方案,再找找看有没有合适的,非常感谢

把用例拆了,一个一个执行,crash 了就影响不到了

#6 楼 @shixue33 我就是这么做的

叶子 #19 · 2015年08月20日 Author

#6 楼 @shixue33 嗯,我正用这个方法呢,但这个的结果都是一个一个的,我正在想办法汇总起来,你是怎么生成总报告的,有好的建议吗

#8 楼 @emily 你以前的结果是怎么样的?

#8 楼 @emily 一个一个的才好啊,更容易知道哪里出问题了。robotium 配合 spoon 很好用。

叶子 #11 · 2015年08月20日 Author

#9 楼 @shixue33
选择具体方法或者类后作为参数传入执行形如下列命令

adb shell am instrument -e class com.xxxx.sampletest.topics.TopicList#test_001_havenotanytopic,com.xxxx.sampletest.topics.TopicList#test_002_addtopic,com.xxxx.sampletest.topics.TopicList#test_003_cllectTopic"  -w com.xxxx.sample.test/pl.polidea.instrumentation.PolideaInstrumentationTestRunner"

生成报告

如果一条命令一条命令执行的话,结果是每个用例都是一个 Html 形式的报告,不是最终的汇总报告。我可能需要重写 PolideaInstrumentationTestRunner 来重新组合报告。

叶子 #12 · 2015年08月20日 Author

#10 楼 @yuweixx 最终生成的测试报告也是一个用例一个用例的吗?没有汇总?

我用 java swing 写了一个管理手机和启动 testsuite 工具,统一管理 testsuite。
运行在 pc 端,如果有需求也可以平台化。
jenkins 没用过。

首先,手机开 adb 连接电脑,工具上选择需要运行的手机设备。
现在用了一个 excel 来做配置文件,保存测试配置参数。
包括:设备 ID ; 被测 apk 路径 ;测试 apk 路径; RunClassName ;执行次数 ;保存路径 ;上传路径

RunClassName 是一个 testsuite 的 list。当运行到第 n 个 testsuite 崩溃时,就开启新的线程启动新的 testsuite 的 list。

收集测试报告: 我也写了一个小工具来解析 xml,把分散的 junit 的测试报告整合成几个或者一个报告。

#12 楼 @emily 看这里

https://testerhome.com/topics/1425 
叶子 #12 · 2015年08月21日 Author

#14 楼 @yuweixx 非常感谢,那个不太满足我的需求,而且它是会在崩溃后就不执行了

叶子 #11 · 2015年08月21日 Author

#13 楼 @ganyunxiao 谢谢分享,如果没有更好的方法的话,我就按你这个思路自己写写,我先找找看还有其它更好的方法没有,如果有现成的东西或者简单些的方法,就不自己再搞一套东西出来了,因为自己搞出来以后还需要和 jenkis 啥的配合。

#15 楼 @emily 如果你的用例有两个,执行第一个用例时崩溃了,第二个用例会执行的,并且有第一个的崩溃日志。至于你想统计有失败的数量,可以改下 spoon 的测试报告应该就可以做到。另外,spoon 最大的好处就是能多台设备同时执行用例。

#17 楼 @yuweixx 嗯,好的,我直接用了下效果不是很好,我刚下了一套 spoon 源码,打算改改,目前还没理明白,只能一点一点来了

@emily 你解决了吗?我跟你遇到了同样的问题

匿名 #7 · 2015年11月03日

#18 楼 @emily 同问 问题有进展吗

#1 楼 @emily
个人建议,每个 case 都重新启动 app 就好了,虽然费点时间,但是一旦 crash 了脚本仍然可以继续跑

匿名 #5 · 2015年11月04日

#21 楼 @xiaoxiao 脚本中具体怎么实现 ?如何进行拆分?

#22 楼 @huadashao520
每个 case 作为一个 class 来处理就好了

新起一个监控线程,监控如果 Crash 了就重新执行启动命令就好了。

使用 Python 脚本循环启动 Robotium 脚本,另外,Robotium 脚本记录下当前 case 的运行情况,即哪些 case 运行过了,Robotium 脚本运行的时候只运行当前未运行的 case,这种实现方式比较简单~

我最近在做细化的 Robotium 脚本,发现其实大部分的因为脚本的问题导致的 crash 是可以避免的,像你举的几个例子,一个是空指针,在操作相应的 view 对象前,先判断下是否为空或者是否可点击就可以避免这种问题了,第二种,view 定位的问题,将异常 catch 住然后抛出就不会报错了;

我们如果可以从根本上解决为什么 crash 的问题,就不用考虑 crash 后的处理了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册