今天在用 Espresso 做 Intent 测试时,发生了一个很奇怪的现象:
某个测试用例的所有步骤全部都跑完了,这个用例的统计结果依然为失败.
我在测试用例结尾打印了特制的 Log Tag,而 Tag 从最后运行时的日志来看,已经被打印出来了,可见中间未发生其他异常或断言失败的错误——因为前一句是
intended(expectedIntent);
这一句如果执行失败会抛出 AssertionFailedError 的错误而不会再打印出我的 Tag.
然后我回去详细看了所有 Log,发现了一个这玩意儿:
04-13 17:30:20.636 24663-24678/? E/OrchestrationXmlTestRunListener: Failed to generate report data
java.io.IOException: Failed to prepare report directory.
at android.support.test.orchestrator.listeners.OrchestrationXmlTestRunListener.createOutputResultStream(OrchestrationXmlTestRunListener.java:254)
at android.support.test.orchestrator.listeners.OrchestrationXmlTestRunListener.generateDocument(OrchestrationXmlTestRunListener.java:192)
at android.support.test.orchestrator.listeners.OrchestrationXmlTestRunListener.orchestrationRunFinished(OrchestrationXmlTestRunListener.java:177)
at android.support.test.orchestrator.AndroidTestOrchestrator.finish(AndroidTestOrchestrator.java:399)
at android.support.test.orchestrator.AndroidTestOrchestrator.executeNextTest(AndroidTestOrchestrator.java:319)
at android.support.test.orchestrator.AndroidTestOrchestrator.runFinished(AndroidTestOrchestrator.java:297)
at android.support.test.orchestrator.TestRunnable.run(TestRunnable.java:157)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:833)
大概意思就是创建测试报告失败.测试报告在哪儿呢? 之前的此文已经提到过,在这里:
/data/data/android.support.test.orchestrator/files/测试报告名称.txt
而这个目录是非 root 权限不能访问的.
所以,如果你发现你的测试用例全都执行完了,而且能够确定测试用例本身没有发生执行时的异常或断言错误,但最终结果是失败的的话,不妨换个可以 root 的机器试试.
因为我换了一个 root 机器,就成功了Ծ‸Ծ.