安卓测试:UIAutomator vs Espresso

81

我正在寻找用于Android UI自动化测试的测试框架,偶然发现了 UI AutomatorEspresso,让我感到疑惑的是 -

  1. 两个框架都由Google维护
  2. 两个框架都用于功能性UI测试
  3. 两个框架都是仅限于Android平台的

因此,我的问题/疑问是 -

  • UI AutomatorEspresso 之间的主要区别是什么?
  • 是否需要修改源代码来集成这些框架中的任何一个?
  • 这两个框架中的一个是否具有优势? 如果有,那么哪个框架最适合用于Android应用程序的UI自动化?
7个回答

49

其实,你不需要做出选择。UIAutomator和Espresso使用相同的仪器运行程序,因此你可以在单个测试中使用它们两者的命令。 Espresso有各种匹配器、断言和UI操作,而Automator没有:

Espresso备忘单

Espresso在单独的线程中运行,并且与其他测试框架相比速度非常快。

总结:在你的测试中同时使用它们两个,Espresso是主要工具,UIAutomator是用于操作系统集成的附加工具。


4
+1 提到可以同时使用两者,即使您不在同一个测试用例中使用UIAutomator和Espresso,您也可以在同一套件的不同测试用例中同时使用它们。 - Code-Apprentice

47

UIAutomator - 强大且具有良好的外部操作系统集成,例如可以在测试期间打开和关闭WiFi并访问其他设置,但缺乏向后兼容性,因为它需要Jelly Bean或更高版本。但是,它也缺乏详细的视图访问权限,因此可以说它可能更像一个纯黑盒测试。而Espresso可以访问视图内部(见下文)。开发者.android.com建议在“多应用程序测试UI”中使用。

Espresso - 与ui automator相比较轻量级,并支持2.2 Froyo及更高版本,它还具有流畅的API和强大的hamcrest(https://github.com/hamcrest) 集成,使代码更易读和可扩展(相对于Ui automator而言,它更新一些)。它没有访问系统集成测试的权限,但可以访问视图内部,例如可以测试Webview(对混合应用程序测试或Webview重度测试很有用)。相对于UI Automator,略微更灰盒测试。开发者.android.com建议在“单个应用程序测试UI”中使用。从Android Studio 2.2开始,现在提供UI测试记录(类似于UIAutomator)。


1
最低API级别的支持不是问题,但是假设在测试期间我不需要任何系统集成,那么同样的功能是否可以使用UIAutomator本身实现? - Shikhar
2
不。如果您不测试系统/跨应用程序,我个人会选择Espresso。例如,最近发布了espresso-web 2.2,它允许测试Web视图,而这是UI Automator不支持的。Espresso似乎正在获得更多的功能关注。请参见https://code.google.com/p/android-test-kit/wiki/ReleaseNotes。 - Steven Mark Ford

17
如果你只是测试单个应用程序,那么使用Espresso。
如果你需要测试多个应用程序或其与其他应用程序或系统的集成,则使用UiAutomator。

1
我可能需要将被测试的应用程序与系统集成,但是 UIAutomatorEspresso 的组合是否可行? - Shikhar
1
是的,两者都可以使用。 - Diego Torres Milano

10

我发现了一篇有趣的文章,介绍了为什么你应该同时使用它们。看一下:

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


7
为了快速了解两者的工作原理,让我们举个例子。在Lollipop上,尝试使用UIAutomator和Espresso查找并点击标题为“Start”的按钮:
  • UIAutomator:您必须搜索大写的“START”,因为在Lollipop上,按钮以大写字母呈现。 device.findObject(new UiSelector().text("START")).click();
  • Espresso:您只需要使用R.string.start,无需关心平台如何实际呈现该字符串。您不需要关心视图是否具有textAllCaps=true或其是否被省略。 onView(withText(R.string.start)).perform(click());

TL:DR;

UIAutomator以比Espresso更低级别的样式搜索视图 - 通过仪器机制和遍历视图层次结构的AccessibilityNodeInfo树来遍历。而Espresso通常会自己遍历视图层次结构。


4
当使用UIAutomator时,您必须使用18+的API,而使用Espresso,则可以低至API 8。
正如Android文档所述,多应用程序测试应该使用UIAutomator,而如果您只想让测试在您自己的应用程序包内运行,则可以使用Espresso。
此文档页面底部,您可以找到介绍以及这两种测试样式的示例。

最低API级别的支持不是问题,但在Espresso的情况下,假设被测试应用程序的源代码必须被修改,这是否是一个安全的假设? - Shikhar

3
使用Espresso的一个关键优势是它能够将测试操作与您正在测试的应用程序的UI自动同步。Espresso会检测主线程何时处于空闲状态,因此能够在适当的时间运行您的测试命令,提高测试的可靠性。这种功能还可以使您免受添加任何时间工作的困扰,例如在测试代码中使用Thread.sleep()。
Espresso测试框架是一种基于仪器的API,并与AndroidJUnitRunner测试运行器配合使用。
来源:https://developer.android.com/training/testing/ui-testing/espresso-testing.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接