Android Espresso AppNotIdleException

最近在研究安卓单元测试,看到官方推荐用Espresso做UI层面的测试,就简单用了下。虽然Espresso很简单,但是适配到真实项目中还是走了不少弯路,踩了不少坑的。这里记录一下:

  1. 由于项目开发的比较早,是传统的Eclipse工程转AndroidStudio工程的,因此项目结构还是传统的Eclipse工程结构,主代码都在跟目录的src文件夹下。这种情况其实很难加入测试用例进工程,要知道Android测试分为两种,即Test和AndroidTest,一个是用来测Java的,一个是用来测Android依赖的,例如测UI。除了文件目录不同之外在Gradle中的引用配置也不相同,如果没有配置好就会出现明明引入了第三方包,但是怎么也找不到的情况。而且需要在gradle中手动配置test和AndroidTest的路径,例如:
 sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

       androidTest{
            java.srcDirs = ['androidTest/src']
        }

        test{
            java.srcDirs = ['test/src']
        }
    }

这样配置之后工程就知道test的路径和AndroidTest的路径对应在哪里了。但是即便这样配置没问题,代码也能跑通,之后却会遇到各种各样奇怪的问题。这里不详细描述了,我反正在这里踩了两天的坑之后决定放弃了。于是我把工程整体迁移到了新的AndroidStudio结构下,即主代码在app文件夹下,迁移完成之后关于之前遇到的测试的坑全部解决了。因此建议想做单元测试的并且用Eclipse老版结构工程的尽早修改为新AS结构,可以少走不少弯路!

  1. 改为AS标准工程结构之后单元测试的坑是被填了,但是莫名其妙的跑出来性能问题。之前旧版工程开启主页Activity的时候很快,几乎是秒开。新工程开启主页Activity竟然会白屏1~2s,严重的时候2~3s。甚是奇怪。抛开首页实现逻辑问题不谈,仅仅修改工程结构竟然会导致加载性能的退后简直让人捉摸不透。最终的解决办法是UI分阶段延迟加载。

  2. 一切准备工作完成之后,本以为踩坑三天的我可以愉快的玩耍一下了,却遇到了各种Espresso水土不服,不能正常运行,Loading速度极慢之后还报错了,说AppNotIdleException。再次吐槽一下,估计国内国外做安卓单元测试的人很少,这方面的资料真是少之又少,而且都是你抄我我抄你不说,绝大多数都是讲的介绍和入门,没有什么实战经验。即便是官方文档也只是简单粗略的介绍一番。
    首先推荐看Google官方的demo,地址:https://github.com/googlesamples/android-testing
    这玩意跑在手机上贼流畅,而且AndroidStudio中直接支持Record Espresso Test。通常情况下大家直接用AS的RET功能不会遇到问题,即便是遇到问题,通过看Google官方的Demo也能解决了。
    但是我就是遇到了AppNotIdleException问题。在网上搜了一圈之后也没找到解决的办法,遇到这个问题的人通常都是由于自己写的测试用例有问题,而我排除了这个原因。最后又折腾了2天准备放弃的时候看到了这个:https://groups.google.com/forum/#!topic/android-test-kit-discuss/s9hsoZ9XdFc
    后来查资料才知道原来Espresso为了保证线程安全,会等所有AsyncTask任务全部执行完了之后才执行。如果这个等待时间超过了60s就会报AppNotIdleException。这个时候找到没有执行完的AsyncTask任务就好了。

private void dumpThreads() {
        int activeCount = Thread.activeCount();
        Thread[] threads = new Thread[activeCount];
        Thread.enumerate(threads);
        for (Thread thread : threads) {
            if("RUNNABLE".equals(thread.getState().toString()) && thread.getName().startsWith("AsyncTask")) {
                LogHelper.e("H3c", thread.getName() + ": " + thread.getState() + "=" + "RUNNABLE".equals(thread.getState().toString()));
                for (StackTraceElement stackTraceElement : thread.getStackTrace()) {
                    LogHelper.e("H3c", "VVV:" + stackTraceElement);
                }
            }
        }
    }

通过这段代码,可以输出所有正在运行的AsyncTask,通过日志找到没有结束的任务。我跟上面哪个链接中的兄弟一样,遇到的是Facebook创建的某个AsyncTask一直在运行导致的,最终我开了翻墙工具之后一切正常了。
总的来说,就是遇到AppNotIdleException问题之后,先排查代码是否写错了,如果不是代码问题,可能就跟我遇到的是一样的问题了,用上面的方法找到正在运行的AsyncTask,然后结束掉就OK了。

此文献给所有用Espresso踩坑的人。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,387评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,845评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,091评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,308评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,662评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,795评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,008评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,466评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,687评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,181评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,531评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,177评论 3 239
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,126评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,862评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,734评论 2 274

推荐阅读更多精彩内容