我在寻找Android UI自动化的测试框架,偶然发现了UI Automator
和Espresso
,这是我感到困惑的部分-
- 两者均由谷歌维护
- 两者都用于功能UI测试
- 两者都是仅限
Android
的框架
所以我的问题/疑虑在这里-
UI Automator
和Espresso
的主要区别是什么- 是否必须修改源代码才能集成这些框架
- 一个框架比另一个有优势吗?如果是,那么哪个框架最适合Android应用程序的UI自动化
实际上,您不需要进行选择。UIAutomator和Espresso使用相同的仪器运行程序,因此您可以在一次测试中使用这两个工具的命令。Espresso在UI上有各种匹配器、断言和操作,这是自动售货机所没有的:
浓缩咖啡备忘单
Espresso是在单独的线程中运行的,与其他测试框架相比,它真的很快。
总结:在测试中同时使用这两种工具,Espresso是主要工具,UIAutomator是操作系统集成的附加工具。
UIAutomator功能强大,具有良好的外部操作系统集成,例如可以在测试期间打开和关闭WiFi并访问其他设置,但缺乏向后兼容性,因为它需要果冻豆或更高版本。但是,也缺乏详细的视图访问,因此可以说这可能更像是一个纯粹的黑盒测试。Espresso可以在哪里查看内部(见下文)。这是developer.android.com上推荐的"测试多个应用程序的UI"
Espresso-与ui automator相比,它的重量更轻,支持2.2 Froyo及以上版本,它还有一个流畅的api和强大的hamcrest(https://github.com/hamcrest)集成使代码更具可读性和可扩展性(它比Ui-automator更新)。它不能访问系统集成测试,但可以访问视图内部,例如可以测试webview(对于混合应用程序测试或webview重测试很有用)。与UI Automator相比,灰盒测试略多。这是developer.android.com上推荐的"测试单个应用程序的UI"。从Android Studio 2.2开始,它现在提供UI测试录制(如UIAutomator)
如果你只测试一个应用程序,那么Espresso。
如果要测试多个应用程序或其与其他应用程序或系统的集成,请使用UiAutomator。
我发现了一篇有趣的文章,它讨论了为什么应该同时使用它们。看看:
http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html
Espresso
对我来说已经足够了,但由于一些原因,比如测试应用程序通知,我会在几周内学习uiautomator
。
花点时间进行
- 查看谷歌使用这些框架的示例:
https://github.com/googlesamples/android-testing/tree/master/ui
- 阅读这些框架的文档:
http://developer.android.com/training/testing/ui-testing/espresso-testing.html
http://developer.android.com/training/testing/ui-testing/uiautomator-testing.html
要快速了解这两种方法的工作原理,让我们举一个例子。让我们尝试使用UIAutomator
和Espresso
:在棒棒糖上找到并单击标题为"开始"的按钮
-
UI Automator:你必须搜索大写的"START",因为在棒棒糖上按钮是大写的。
device.findObject(new UiSelector().text("START")).click();
-
Espresso:您只需要使用
R.string.start
,不需要关心平台实际如何渲染字符串。您不关心视图是否具有textAllCaps=true
或是否已省略号。onView(withText(R.string.start)).perform(click());
TL:DR
UIAutomator通过Instrumentation机制并遍历视图层次结构的AccessibilityNodeInfo
树,以低于Espresso的级别样式搜索视图。意式浓缩咖啡通常会遍历视图层次结构本身。
使用UIAutomator时,您必须使用18+API,而使用Espresso时,您可以低至API 8。
正如Android文档所述,多应用程序测试应该使用UIAutomator进行,而如果你只想在自己的应用程序包中运行测试,你可以使用Espresso。
在本文档页面的底部,您可以找到这两种测试风格的介绍以及示例。
使用Espresso的一个关键好处是,它可以自动将测试操作与正在测试的应用程序的UI同步。Espresso检测主线程何时空闲,因此它能够在适当的时间运行测试命令,从而提高测试的可靠性。此功能还使您不必在测试代码中添加任何定时解决方案,例如Thread.sleep()。
Espresso测试框架是一个基于仪器的API,并与AndroidJUnitRunner测试运行器配合使用。
来源:https://developer.android.com/training/testing/ui-testing/espresso-testing.html