用Selendroid做手机自动化测试(一)

2016-11-09   出处: Methods & Tools  作/译者:Dominik Dary, Michael Palotas/梁仲兴

网站http://selendroid.io

版本:0.11.0

系统环境要求:已安装Java和 Android SDK

授权 & 定价:Selendroid项目已经被Apache 2.0 License授权

支持:Google Group http://groups.google.com/group/selendroid


        Selendroid是一个自动化测试框架,可以跑遍原生Android、各种应用(APP)以及手机web的UI。测试是用Selenium 2 客户端的API写的——那就是重点了!


1. 无边界事务以及对自动化测试的影响,还有我们为什么要用Selendroid

        随着手机变成了综合体验的一个重要部分,web在过去几年里已发生了巨大的变化。自动化测试是敏捷软件开发和持续集成交付的关键推动者。很多软件厂商突然遇到这样的挑战:他们不得不提供可靠的自动化测试,不仅是为了web,而且是为了含有手机web和本地应用这两种特点的手机。

        尤其是手机商务和越来越多的交易在手机设备上进行,关于在手机领域进行自动化测试的主题获得了巨大的意义。在过去客户会在web或者手机上开始和完成一个交易,现在的交易在不同平台之间“移动”进行,这有不断增加的趋势。这意味着用户可能在web上开始一个交易,而在手机上完成交易,或者反过来。

        手机像web一样需要做的健壮和可伸缩的自动化测试。在理想状态下,手机解决方案与web解决方案无缝地集成在一起,这样用户在平台和设备之间的操作就可以简单地作为一个自动化测试的一部分来重建。由于在web自动化使用Selenium取得了巨大的成功和经验,像eBay这样的公司决定开发“Selenium for mobile”解决方案,也就引发了两个开源项目的创建:Selendroid和ios-driver。

        Selendroid和ios-driver项目的创建需要的高水平的要求如下:

  • 重用现成的用于web的Selenium基础设施
  • Selenium协议的实现(JSON线协议)
  • 正在测试的应用(AUT)不应该被修改
  • 支持仿真器/模拟器,还有真实的设备
  • 在Selenium Grid上并行执行测试
  • 多应用、版本、语言的管理
  • 支持app运行时的检查
  • 混合的app支持

2. 背景:Selenium是什么?

        以防你们不熟悉Selenium,这里有一个关于它的简单介绍。Selenium最初是一个web浏览器自动化的工具。JSON Wire Protocol用浏览器描绘了用户的交互。每个浏览器都有一个特定的驱动程序,这个驱动程序用于本地的特定浏览器。Selenium是一个典型的客户端/服务端架构。客户端从驱动器(服务端)分离出来。从客户端的角度来看,不管用的是哪一款浏览器,与浏览器交互的命令都是一样的。

                                                  图 1. High-level Selenium架构

        Selenium支持很多种不同的编程语言(客户端绑定),比如Java、Python、Ruby和JavaScript。


手机自动化有什么不一样?

        当然,Web和手机自动化之间有不同的地方,手机自动化工具的核心工作与web是一样的。

  • 发现一个元素(例如按钮)
  • 与元素交互(例如点击按钮)
        因此最初为web发明的JSON线协议也能应用到手机领域,除了一些像滑动这样的特别操作以外。


3. Selendroid

        在设置好平台之后,让我们来重点向您介绍Selendroid。这个项目满足以上提到的要求以及被好多厂家使用。Selendroid主要的特点如下:

  • 完全兼容JSON Wire Protocol
  • 在测试需要自动化的情况下应用不需要修改
  • 用创建在Android驱动的webview 应用测试手机web
  • 关于本地自动化或混合应用的一样的概念
  • UI元素能被不同定位器类型发现
  • 支持手势:高级用户交互API
  • Selendroid能与不同Android设备(模拟器或者硬件设备)同时交互
  • 现有的模拟器自动启动
  • Selendroid支持硬件设备的热插拔
  • 完全结合作为一个点融入Selenium Grid进行缩放和并行测试
  • 支持多Android目标API(10到19)
  • 创建在检测器上简单地做测试用例的创建

3.1. 开始行动

        在Selendroid可以被使用前,必须满足系统要求。这里有一个详细的介绍页面关于怎样开始。

        为了尽量使这个例子简单,这里有一个Selendroid-test-app被使用的小项目模板。那个项目正在用这个相同的应用来验证Selendroid自身是否正常运作。项目demoproject-selendroid正在使用maven、JUnit和Java来写测试。

        以下依赖声明是用来导入Selendroid和JUnit的:


    <dependencies >
          <dependency >
                  <groupId >io.selendroid </groupId >
                  <version >0.11.0 </version >
                  <artifactId >Selendroid-standalone </artifactId >
          </dependency >
          <dependency >
                  <groupId >io.selendroid </groupId >
                  <version >0.11.0 </version >
                  <artifactId >Selendroid-client </artifactId >
          </dependency >
          <dependency >
                  <groupId >junit </groupId >
                  <artifactId >junit </artifactId >
                  <version >4.8.2 </version >
          </dependency >

        </dependencies >

        被测试的应用放置在文件夹src/main/resources/。


3.1.1. 启动Selendroid-standalone

        在客户端驱动器被安装前,要首先启动Selendroid-standalone组件。

        这可以通过一个shell终端运行以下命令来完成:

    java -jar selendroid-standalone-0.11.0-with-dependencies.jar -app selendroid-test-app-0.11.0.apk

        另一个选择就是要从测试代码直接启动Selendroid-standalone组件:

    SelendroidConfiguration config = new SelendroidConfiguration();
    config.addSupportedApp("src/main/resources/selendroid-test-app-0.11.0.apk");
    selendroidServer = new SelendroidLauncher(config);
    selendroidServer.launchSelendroid();

        你可以打开一个浏览器以及导航到http://localhost:4444/wd/hub/status检查应用和设备是否能被识别。

        你应该看到类似以下这样的结果:

         {
           status: 0,
           value: {
           "os": {
             "name": "Android"
             },
           "build": {
             "browserName": "Selendroid",
             "version": "0.11.0"
           },
           "supportedApps": [{
             "appId": "io.selendroid.testapp:0.11.0",
             "mainActivity": "io.selendroid.testapp.HomeScreenActivity",
             "basePackage": "io.selendroid.testapp"
           }],
           "supportedDevices": [{
             "screenSize": "320x480",
             "targetPlatform": "ANDROID17",
             "emulator": true,
             "avdName": "latest"
           }]
         }  


3.1.2. 第一个测试

        测试是用Selenium 2 client API写的。对于Java,我们提供像以下例子这样使用的Selendroid-client库:

         SelendroidCapabilities capa = new SelendroidCapabilities("io.selendroid.testapp:0.11.0");
         SelendroidDriver selendroidDriver = new SelendroidDriver(capa);
         WebElement inputField = selendroidDriver.findElement(By.id("my_text_field"));
         Assert.assertEquals("true", inputField.getAttribute("enabled"));
         inputField.sendKeys("Selendroid");
         Assert.assertEquals("Selendroid", inputField.getText());
         selendroidDriver.quit();

        为了在期望的性能下创建一个新的测试会话,被测试的应用的id必须写成这种格式:io.selendroid.testapp:0.11.0。基于这种格式,一个匹配Android设备将会被定义,否则测试会话将会抛出一个错误以及不能启动。

        在被发现的设备被初始化后,一个自定义的Selendroid-server将被创建和自动安装到设备上。被测试的应用将也会被安装,设备上的Selendroid-server将会自动启动。

        在测试会话成功初始化后,好像查找一个元素和元素交互这样的测试命令被定位到这个设备上。如果测试会话结束了,模拟器会自动停止。




 

【英文原文:http://www.methodsandtools.com/tools/selendroid.php】

{测试窝原创译文,译者:梁仲兴}

译者简介:梁仲兴,专注于云计算、自动化、网络运维领域的工作者。


声明:本文为本站编辑转载,文章版权归原作者所有。文章内容为作者个人观点,本站只提供转载参考(依行业惯例严格标明出处和作译者),目的在于传递更多专业信息,普惠测试相关从业者,开源分享,推动行业交流和进步。 如涉及作品内容、版权和其它问题,请原作者及时与本站联系(QQ:1017718740),我们将第一时间进行处理。本站拥有对此声明的最终解释权!欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,与我们的编辑和其他窝友交流。
784° /7846 人阅读/0 条评论 发表评论

登录 后发表评论