Robotium 介绍一下 Spoon------配合 Robotium 多设备分发测试,生成测试结果

剪烛 · 2014年09月22日 · 最后由 Jhon 回复于 2016年12月21日 · 2756 次阅读
本帖已被设为精华帖!

最近群里有好几个人都问了 robotium 怎么生成报告,一般看见大家有这样几种做法:
1 改写 InstrumentationTestRunner,替代原有的,测试过程中会把测试结果写在定义的目录 -------- 网上有教程,但是我没有试验过
2 jenkins 有自带的 junit 插件可以生成报告 -------- 没试验成功
3 使用命令行发送测试命令,然后收集返回的结果,根据模板生成网页,恩,各种自定义的功能比如说统计,失败重跑都可以做 -------- 我做过,劳心劳力,不会做页面还特丑。
恩,直到后来一位前同事给我介绍了这个工具,觉得是初用 Robotium 又不熟悉怎么生成报告的同学的福音,用法简单,效果显著,居家必备。
下面介绍一个用来介绍一个与 robotium 结合得特别好的用来多设备运行,并且生成网页报告的工具------spoon

先上 github 地址:
https://github.com/square/spoon
主页:
http://square.github.io/spoon/
sample 地址:
http://square.github.io/spoon/sample/index.html(可能很慢)

打不开以上网址的福利:
源代码 zip:
http://pan.baidu.com/s/1kTolyvX
runner jar:
http://pan.baidu.com/s/1jGIFEF8
client jar:
http://pan.baidu.com/s/1jG20AZ8

介绍:
spoon-runner
提供测试 apk 和被测 apk 后,spoon-runner 可以同时在多台机器上运行测试 apk 包含的 tests,tests 运行结束后,spoon 会对所有的结果和图片进行处理,并且生成一个静态的 html 文件(其实有很多 html 文件)
生成的结果 html 大概是这样的:

spoon-client
需要导入到 robotium 的测试工程中,它提供了截图的方法,通过这个方法,可以将图片生成到结果 html 中

使用方法:
1 spoon-client
需要将 spoon-client jar 导入到你的测试工程中,就像到 robotium.jar 包那样导入工程。
spoon-client jar 可使用的方法有以下(该方法的第二个参数为自定义文件名):

Spoon.screenshot(activity, "initial_state");
/* Normal test code... */
Spoon.screenshot(activity, "after_login");

就是这样将你需要截图的地方嵌入这个方法,并写描述
2 spoon-runner
这是个在电脑上可运行的 jar 文件,就是用它来驱动测试并完成各种数据收集的工作的。它需要你提前将已经签名好的测试 apk 和被测 apk 文件。
以下示例一个最基础的启动方式

java -jar spoon-runner-1.0.0-jar-with-dependencies.jar --apk example-app.apk --test-apk example-tests.apk

它还提供这些更高级的设置 (比如改变生成结果的地址):

Options:
    --apk               Application APK
    --fail-on-failure   Non-zero exit code on failure
    --output            Output path 
    --sdk               Path to Android SDK
    --test-apk          Test application APK
    --title             Execution title
    --class-name        Test class name to run (fully-qualified)
    --method-name       Test method name to run (must also use --class-name)
    --no-animations     Disable animated gif generation
    --size              Only run test methods annotated by testSize (small, medium, large)
    --adb-timeout       Set maximum execution time per test in seconds (10min default)

还有一些类似 maven 的设置,请直接去 github 参照。

它有个很好玩的是,可以对截图进行顺序动态显示,好像是生成了 GIF,很直观。
不过好像没有做统计相关的功能,恩,还有失败重跑这样的。不过我觉得初期可以用用,至少报告可以好看点。

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

获得成就,Robotium 专精!

剪烛 #50 · 2014年09月22日 Author

#1 楼 @daydayup = ̄ω ̄=只是介绍

#3 楼 @emilyli2013 恩恩,我也觉得亮点很多

不错,不过报告最好可以自己定制。我们的做法是在运行过程中,将过程数据生成 XML。结束后,会有个站点自动解析这个 xml,生成结果报告。包含错误 log、截图、数据统计等信息。

#5 楼 @mggao 嗯嗯,这个工具是对于数据统计这方面没做多少工作,优点是使用比较简单,对于刚入门使用 robotium 又不是很熟悉工具开发的同学会好一点,更高级一些的功能就需要自己定制了。

怎么发帖啊?

#7 楼 @amwaydp 新注册用户要一天以后才能发帖,请先浏览下论坛的帖子,熟悉下发帖风格。

#2 楼 @shixue33 大神,收徒弟吗

剪烛 #10 · 2015年01月19日 Author

#9 楼 @kesha0 Σ( ° △ °|||)︴我不是大神

java -jar spoon-runner-1.0.0-jar-with-dependencies.jar --apk example-app.apk --test-apk example-tests.apk 执行完这句,安装完两个 APK 后就终止了,不会自动运行,这是什么情况?

剪烛 #40 · 2015年02月28日 Author

#11 楼 @zhou 1 是否有错误信息输出呢?
2 用 instrumentation 调用命令可以调起测试吗?

生成的报告会乱码怎么办?

像这样的 junit.framework.AssertionFailedError: ����Ⱥ�Ի��� expected: but was:

#13 楼 @bajao 浏览器自己改字符编码为 GBK 即可

#14 楼 @bajao 乱码请修改浏览器 字符编码为 GBK

Nexus 7-Android 5.1.1 截图报错怎么破,是跟 Android5.1.1 系统有关吗:
Caused by: java.lang.IllegalAccessException: Unable to create output dir: /storage/emulated/0/app_spoon-screenshots
Android 4.4.4 的设备无此问题。

#17 楼 @yuweixx spoon 源码中对 5.0 及以上的系统是做了处理的,但还是有问题~~

rivate static File obtainScreenshotDirectory(Context context, String testClassName,
      String testMethodName) throws IllegalAccessException {
    File screenshotsDir;
    if (Build.VERSION.SDK_INT >= 21) {
      // Use external storage.
      screenshotsDir = new File(getExternalStorageDirectory(), "app_" + SPOON_SCREENSHOTS);
    } else {
      // Use internal storage.
      screenshotsDir = context.getDir(SPOON_SCREENSHOTS, MODE_WORLD_READABLE);
    }

#18 楼 @yuweixx 搞定了,被测程序中需加入

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

赞。。

@shixue33 有没有碰到截图失败的,就是没有截到图片,也没创建 app_spoon_screenshots 文件夹。
我写的代码

spoon.screenshot(solo.getCurrentActivity(), "aa"+counts);
剪烛 #30 · 2015年09月25日 Author

#21 楼 @best1196 有设置了读写 sd 卡的权限吗?

这玩意儿最大的亮点是多设备执行 Instrumentation test,我用的 fork

剪烛 #28 · 2015年10月24日 Author

#23 楼 @shenkai600 多设备执行是个亮点,但我觉得 gif 显示测试过程是很新奇的功能 (_)

匿名 #27 · 2015年11月03日

#24 楼 @shixue33 我这边也试过这种方案,但是测试用例执行超过 15 个之后程序 crash,测试进程也相应中断,美女有好的解决方案吗 呵呵

剪烛 #26 · 2015年11月03日 Author

#25 楼 @huadashao520 具体是什么情况?必崩?检查脚本了吗?错误信息提示什么?

匿名 #25 · 2015年11月04日

#26 楼 @shixue33 其实就是这个帖子提到的问题 https://testerhome.com/topics/3149

LZ,我是在 Android studio 上使用 Robotium 进行自动化测试的,测试 apk 该如何生成,是新建一个 moudle,build 生成 apk 这样吗?但是我在命令行上运行显示运行了 0 test...如果不用 spoon 的话测试用例是可以正常运行的。
测试新手,希望楼主能看到并帮忙解答下问题,多谢了!

剪烛 #29 · 2016年07月18日 Author

#28 楼 @surprise 使用非正式签名生成的 apk 包就可以了

#15 楼 @young 感谢,目前看下 spoon 还是比较方便的

#16 楼 @young 每次修改好麻烦,有没有浏览器能强制每次都以 GBK 打开?

设置了浏览器编码还是乱码,日志也是乱码,截图第二个参数填什么呀。文件路径??

剪烛 #17 · 2016年11月14日 Author

#32 楼 @Jhon 应该是截图的自定义文件名

@shixue33 秒回啊,厉害。

@shixue33 试了下,第二个参数,我填的的是一个绝对路径的文件名,D:\test\apk\spoon-output\image 但是报错了

#32 楼 @Jhon 英文也是乱码?用的什么浏览器?
截图你是指 Spoon.screenshot(activity, "initial_state"); 中的 "initial_state"吗?

@yuweixx 截图对的,指的是 initial_state,这个是什么鬼,

#39 楼 @Jhon 这个是截图保存时的文件名

@yuweixx 噢噢。“xxx.jpg” 就可以对嘛,我用的 chrome 浏览器

#41 楼 @Jhon 不用带.jpg

#39 楼 @Jhon 你图中的乱码应该不是啥重要信息,不用太在意

@yuweixx 我日志中的中文是乱码,看日志不好分析

#44 楼 @Jhon 你用 IE-GB2312 试试

@yuweixx
日志就这个鬼样子,非常不利于分析日志


大家如果遇到报告乱码,可以这样解决,我用的是 chrome,点击工具,选择编码,然后选择 gbk 或则中文都试试,然后发现果真有用。之前设置错了地方,哈哈

@yuweixx Spoon 可以运行 espresso 测试项目嘛???好像 espresso 要基于源码。

#48 楼 @Jhon Distributing instrumentation tests to all your Androids.
理论上支持所有基于 instrumentation 的 Android 测试框架。

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