Android测试初探(六) 利用UI Automator框架实现跨应用测试

UI Automator

在较早版本的Android系统中,Instrumentation必须在系统权限下,才能操作整个手机;否则只能操作自身或与其签名一致的APP。而由于Instrumentation通常不能获取系统权限(需要系统签名,而系统签名文件在编译系统时已经被编译进去,不能获取到),于是基于Instrumentation的很多框架只能进行单个APP的测试,不能跨应用测试。

不能跨应用测试,一些例如分享到QQ之类的功能就不能被实现。

UI Automator是谷歌在Android 4.3引入的测试框架,最重要的特点就是支持跨应用测试,缺点是必须在Android 4.3及以上设备中才能使用。UI Automator基于Android 4.3中Instrumentation新引入的API,直接可以操作手机,而不局限于某个应用。

UI Automator使用默认的Instrumentation Test Runner即可,配置只需要添加一个依赖项如下。

  1. dependencies {
  2. androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
  3. }

示例代码先进行了按键操作(HOME键、音量键),并先后启动桌面的Settings和UnitTest应用。注意,如果桌面没有这个名称的应用,会抛出UiObjectNotFoundException,从而测试失败。

  1. public class UiAutomatorTest extends InstrumentationTestCase {

  2. private UiDevice mDevice;

  3. @Override

  4. protected void setUp() throws Exception {

  5. super.setUp();

  6. mDevice = UiDevice.getInstance(getInstrumentation());

  7. }

  8. public void testDemo() throws UiObjectNotFoundException {

  9. mDevice.pressHome();

  10. mDevice.pressKeyCode(KeyEvent.KEYCODE_VOLUME_UP);

  11. mDevice.pressKeyCode(KeyEvent.KEYCODE_VOLUME_DOWN);

  12. mDevice.findObject(new UiSelector().text("Settings")).clickAndWaitForNewWindow();

  13. mDevice.pressHome();

  14. mDevice.findObject(new UiSelector().text("UnitTest")).clickAndWaitForNewWindow();

  15. }

  16. }

参考资料与扩展阅读

《Best Practices for Testing》http://developer.android.com/intl/zh-cn/training/testing/index.html
《Gradle Plugin User Guide》 http://tools.android.com/tech-docs/new-build-system/user-guide
《在Android Studio中进行单元测试和UI测试》 http://www.jianshu.com/p/03118c11c199
《Android Espresso 测试框架介绍》 https://github.com/bboyfeiyu/android-tech-frontier/blob/master/issue-11/Android-Espresso测试框架介绍.md