注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

TestNG + NativeDriver实现android的UI自动化测试  

来自kevinkong   2011-08-29 17:11:12|  分类: 自动化测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

NativeDriver是google推出的一个开源的跨平台的UI自动化测试框架,框架具体信息请查看http://code.google.com/p/nativedriver/

使用过程如下:

1、编译源代码生成jar包
参考http://code.google.com/p/nativedriver/wiki/AndroidMakeAnAppTestable
     下载源代码,编辑生成jar包,肯定会用到的另个jar包为server-standalone.jar和client-standalone.jar。 看jar包的名字就可以知道一个是用在server端,就是在被测应用中,一个是用在client端,就是我们写测试代码的测试程序中

2、被测应用加入jar包以及修改配置
把server-standalone.jar加入到被测的应用中,同时被测应用的AndroidManifest.xml 文件中需要加入如下的权限
<instrumentation android:targetPackage="com.netease.wb"     android:name="com.google.android.testing.nativedriver.server.ServerInstrumentation" />   <uses-permission android:name="android.permission.INTERNET" />   <uses-permission android:name="android.permission.WAKE_LOCK" />   <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
targetPackage中对应的就是你被测程序的包名
如果应用不是你自己开发的,此过程需要开发那边的协助,完成以上步骤后重新编辑生成apk文件,测试的时候需要用到的是加入此配置的apk。

3、安装apk
拿到了加入jar包和修改配置文件的apk文件之后必须的得安装了,我这边就安装在模拟器中(PS:没有android真机,真悲剧,赶紧的去搞一个)
安装命令: adb install ****
使用adb命令来安装,adb命令功能很强大,需要用到的自己去google一下吧

4、启动服务
通过查看nativedriver,该框架测试程序与被测应用的通信是通过http来进行的,server端会有一个jetty服务器来监听测试程序发送过去的命令,那必须的测试之前就需要启动服务了,进入cmd中,输入下面的命令即可:
# com.netease.wb是被测程序的包名,不同测试程序换一下即可, adb shell am instrument com.netease.wb/com.google.android.testing.nativedriver.server.ServerInstrumentation
# 启动的通信端口,默认的都是用的这个端口
adb forward tcp:54129 tcp:54129
这两条命令后续会放入到testng的beforesuite中

5、搭建测试程序

通过上面的4个步骤,被测程序已经准备好了,就开始我们写测试程序了,nativedriver通过http发送消息去server端,所以我们的测试程序新建的时候只需要新建一般的java工程即可,通过也不需要一定使用Junit3,可以使用TestNG来进行测试。

通过eclipse新建一个一般的java工程,加入client-standalone.jar包,用于和server端进行通信,我们要用到testng当然还需要加入testng的jar包。


以下的只是自己的一些实现思路,如果您有更好的建议欢迎交流。
图中为测试程序的目录结构:
autotest.generated包中放置了手工生成的资源元素信息
      这个模仿了Android工程中对于元素的管理方式,测试代码中因为也会用到很多控件ID资源,这些控件ID等都存放在res/xml /resource.xml文件中,通过运行util包中的XmlResourceOper.java会生成R.java文件,测试代码通过 R.Login.username类似的方式来访问资源,需要新增修改资源的话只需要修改resouce.xml文件,修改后运行一下 XmlResourceOper.java文件。
autotest.util包中放置了一些测试用例支持的功能
  testng监听功能,发送邮件功能,所有测试用例的父类等
autotest.weibo.testing 具体的测试用例
autotest.weibo.util.operations放置测试用例用到的一些公共方法
res文件夹放置用到的一些公共资源
TestNG + NativeDriver实现android的UI自动化测试 - kevinkong - 风之云的足迹
 


6、具体程序编写
上面看了整体的目录结构,下面看一下如果来具体写一个测试用例吧,已登录功能来举例。
  • 元素识别
登录功能一般就是输入用户名、密码,点击登录按钮。一般的UI自动测试的话很重要的一点就是元素的获取,android中提供了一个叫做
hierarchyviewer的工具,可以识别android的控件元素,该工具是在android SDk安装路径的tools目录下,下面会有一个hierarchyviewer.bat文件。
  • 测试代码(例子)
public class Login {
    private AndroidNativeDriver driver;
   
    @Test
    public void login(){
       //启动具体的activity
        startLoginActivity();
        try {
             //查找到输入用户名文本框,并且输入数据,这里的控件ID就是通过hierarchyviewer来识别得到的
            WebElement userName = driver.findElement(By.id("UserName"));
            userName.clear();
            userName.sendKeys("***@163.com");
            userName.click();
           
           //查找到输入密码文本框,并且输入密码
            WebElement passWord = driver.findElement(By.id("PassWord"));
            passWord.click();
            passWord.clear();
            passWord.sendKeys("***");
           
            //回退触摸键盘
            driver.navigate().back();
           //查找到登录按钮,并且点击登录
            WebElement login = driver.findElement(By.id("Login"));
            Assert.assertNotNull(login);
            login.click();
            //等待登录界面跳转
            Thread.sleep(10000);
                //登录成功后进行断言相应的控件出现了
                List<AndroidNativeElement> contentView =  driver.findAndroidNativeElements(By.id("bas_content"));
                System.out.println(contentView.toString());
                Assert.assertNotNull(contentView.get(0));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Assert.fail("登陆微博异常,错误信息如下:" + e);
        }
    }
   
    protected AndroidNativeDriver getDriver() {
        return new AndroidNativeDriverBuilder()
            .withDefaultServer()
            .build();
      }
   
    private void startLoginActivity() {
      //启动activity
        driver.startActivity("com.netease.wb.activity.LoginActivity");
    }

    @BeforeMethod
    public void beforeMethod() {
       
    }

    @AfterMethod
    public void afterMethod() {
       
    }

    @BeforeClass
    public void beforeClass() {
        //这里把之前的adb命令放入到beforeclass中,如果有beforesuite的话也可以放到beforesuite中
        String cmd = "cmd.exe /k start adb shell am instrument " +
                "com.netease.wb/com.google.android.testing.nativedriver.server.ServerInstrumentation";
        Runtime.getRuntime().exec(cmd);
        Thread.sleep(10000);
        String cmd2 = "cmd.exe /k start " +
        "adb forward tcp:54129 tcp:54129";
        Runtime.getRuntime().exec(cmd2); 
        Thread.sleep(2000);
        driver = getDriver();
       //统一设置通过find方法查找元素等待超时的时间,这里有时候发现等待超时的时间远远大于这个设置的,原因还未知
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    }

    @AfterClass(alwaysRun = true)
    public void afterClass() {
     //退出
       driver.quit();
    }

}


7、后续跟进
  • 调研对webview的支持
  • 在真机上运行测试用例
  评论这张
 
阅读(2506)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016