介绍Android测试工具Espress及安装使用

 更新时间:2016年9月20日 19:58  点击:2416
Espresso是一个API精确,简洁小巧,容易学习的针对APP的UI测试代码的小工具,可以用来测试Android开发,本文我们来介绍一下Espresso及Espresso的安装使用。

Espresso是一个新工具,相对于其他工具,API更加精确。并且规模更小、更简洁并且容易学习。它最初是2013年GTAC大会上推出的,目标是让开发者写出更简洁的针对APP的UI测试代码。

虽然针对的是开发者(Developer),但是对于测试人员来说也是可以用的。因为它有一些Robotiun和Selendroid缺乏的关键特征。

关键特征

1、快速;

2、代码快速上手;

3、容易扩展;

4、无需考虑复杂的多线程测试;

5、有Google做靠山。

Espresso的主要组件

Espresso – 与视图(views)交互的入口,并暴露了一些视图(views)无关的API(例如回退按钮)。

ViewMatchers – 实现匹配器的一组对象。允许可以通过多次的onView方法,在层次图中找到目标视图(views)。

ViewActions – 对视图触发动作(例如点击)。

ViewAssertions – 用于插入测试关键点的一组断言,可用于判断某视图(view)的状态。

例子

onView(withId(R.id.my_view))      // withId(R.id.my_view) 是匹配器
  .perform(click())               // click()事件
  .check(matches(isDisplayed())); // matches(isDisplayed())是断言

对于同样UI的代码复杂性对比

UiAotomator:

UiObject setnum = UiUtil.findByResourceId("android:id/edtno1");
setnum.click();
setnum.setText("10");

Robotium:

EditText txtVal1 = (EditText) solo.getView(R.id.edtno1);
solo.clearEditText(txtVal1);
solo.enterText(txtVal1, "12");

Espresso:

onView(withId(R.id.edtno1)).perform(clearText()).perform(typeText("12"));

可以看出,与其他框架相比,Espresso代码集成度更高,功能分块更加集中:onView用于定位视图,perform用于产生事件,check用于检测checkpoint。

Espresso的使用

setup

1、首先下载Espresso的独立jar包,之后在建立好的Android Test Project里引用这个jar包。

2、在AndroidManifest.xml里包含users-library和instrumentation字段,用于指明测试库和被测目标:

Espresso

3、在项目名称上右键->Run->Run Configurations,把Instrumentation Runner设置为如下:

Espresso

接着点击apply,run就可以开始测试。

可能遇到的问题:

Test run failed: Instrumentation run failed due to ‘java.lang.ClassNotFoundException’”

遇到这个问题,需要在项目->properties,左侧选择Java Build Path,然后在最后一个选项卡Order and Export中勾选espresso的jar包。如下:

Espresso

可以看到,由于espresso是基于Instrumentation的(继承ActivityInstrumentationTestCase2),所以在项目的建立和代码编写上,都与Instrumentation是一脉相承的。

Writing Case

建立的测试项目内容如下,主要实现对默认的hello world字段查找、点击、判断的功能,可以粗略看到espresso的代码结构和执行过程:

public void testHelloWorldTextClicked()
{
  // Find
  ViewInteraction helloWorldText = onView(withText("Hello world!"));
 
  // Action
  helloWorldText.perform(click());
 
  // Check
  helloWorldText.check(ViewAssertions.matches((isDisplayed())));
}

Run Test

开始执行时,底部console区域会输出带有espresso标签的log,同时,安装完apk并开始测试后,会在LogCat中显示内容,方便查看运行状态和调试。

运行结果:

Espresso

同时,由于是基于Instrumentation的,所以也摆脱不了框架本身的限制:

1.无法控制app process以外的activity

2.无法在ui线程进行动画时控制操纵activity

总结

目前,Espresso还处于开发人员预览状态,在Google Code上提供。但思路是,等到它足够成熟和稳定以后,将其迁移到Android SDK中。Google使用Espresso测试了他们自己的超过30个应用程序,包括G+、Maps和Drive。

有时也会需要获取一下Android手机的内存、CPU信息,获取这些硬件信息主要是用到adb命令工具,以下是本人总结的方法。


偶尔还是要dump一些手机的内存、CPU信息,自己看或者给RD们提供信息,所以对于Android一些基本的adb命令还是要熟悉一下。

查看内存用命令:

1、top
2、ps
3、procrank
4、dumpsys meminfo

四个命令都是shell命令,所以如果直接运行需要adb shell。嵌入程序,如果使用ddmlib来驱动他们,可以使用IDevice.executeShellCommand(command)。

输入这些命令之后,会发现得到的结果是所有进程……一句一句来看是很麻烦的事。所以需要使用一些方法处理一下……

之前讲过android手机的shell是半残,好些有用的命令都不支持,不过这次要用到的grep除外。在以上四个命令后面添加上package Name即可,例如

Procrank com.tencent.mobileqq,即可过滤出来所有包含此字段的数据。

至于为什么有四个命令,是因为他们分工和使用场合不同。

前两个命令只能查到VSS RSS内存占用信息,而后面两个命令可以查出 PSS USS内存占用。
dumpsys meminfo 可以查出native和dalvik分别占用多少内存,dumpsys 用来给出手机中所有应用程序的信息,并且也会给出现在手机的状态。

    VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
    RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
    PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
    USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
    一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

附:

dumpsys [Option]
option可以为:
dumpsysmeminfo 显示内存信息
cpuinfo 显示CPU信息
account 显示accounts信息
activity 显示所有的activities的信息
window 显示键盘,窗口和它们的关系
wifi 显示wifi信息

Android ADB是一个 客户端-服务器端 程序, 其中客户端是你用来操作的电脑, 服务器端是android设备,本文我们来看看widnows和linux下adb找不到设备解决办法。

通常,在安装并配置完android SDK的环境变量之后,成功在命令行(Terminal)输入adb devices之后,并不会立刻看到自己的设备。这里排除掉设备本身驱动的问题,最常见的就是在用户目录下的.android文件夹内没有adb_usb.ini的文件存在。windows和linux环境均如此。

Windows环境

进入C:Users目录,找到自己名字的文件夹,会看到一个.android命名的文件夹(没有则新建一个)。打开之后里面是一些adbkey之类的信息,查找是否存在adb_usb.ini的文件存在,没有则新建。内容是设备的地址,通常为0x1782。
adb_usb.ini文件格式如:

    0x1792
    0x119a

输入并保存即可。

Ubuntu环境

与win类似,只要在当前用户目录下创建创建文件”.android/adb_usb.ini” ,内容为lsusb看到的设备的idVendor。
adb_usb.ini中即每一行加入一个idVendor。

之后执行命令行:
sudo adb kill-server
sudo adb devices

即可看到设备。

BusyBox 是一个集成了一百多个最常用linux命令和工具的软件。BusyBox 包含了一些简单的工具,例如ls、cat和echo等。本文我们来介绍一下在Android设备上如何安装BusyBox

由于工作需要,经常要连接手机并用adb进行一些操作,发现shell功能很好用,但是处于阉割状态,最明显的一条是,执行了一些命令之后,目录下出现了一些 -p 、 -l 、 755 之类的文件,让人很是蛋疼。更明显的是,一些linux好用的第三方工具,挪到android下根本无法执行。。于是就想办法让android设备支持全功能的shell。这里最直接的就是安装BusyBox了。

什么是BusyBox

    BusyBox 是标准 Linux 工具的一个单个可执行实现。BusyBox 包含了一些简单的工具,例如 cat 和 echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。

如何安装busybox

1、root手机,安装adb

这是必须的!上网搜一下,会有很多对应版本的root教程。adb随意下载并配置一个,命令行敲adb有反应即可。

2、下载最新版的BusyBox

去这里 :busybox.net
最下面有latest,下载一个busybox-armv6l或者busybox-armv7l就可以了

3、安装

如果像我一样,是在windows下安装的,那么可以win+R打开cmd,输入adb。

    adb root
    adb remount

这样进入了root模式,然后把BusyBox的二进制文件push到手机端

    adb push busybox /data/busybox

接着进入shell模式,并安装busybox

    adb shell
    #cd data/busybox
    #./busybox –install

最后一步添加环境变量

    #export PATH=/data/busybox:$PATH

ok,这时候再输入一遍ls看看,是不是跟之前完全不一样了?

Smart Phones Dumb Apps是一款用perl语言开发的脚本集,可以分析android和分析iphone app的功能,下面我们来简单介绍一下。

这个是一个脚本集,可以帮助分析者分析app的安全性,用perl语言开发。由于只是一些脚本,所以用起来可能没那么智能,没有GUI界面,也不会有“优雅”的分析结果。所以基本上,就是类似“aapt加强版”的脚本。由于加入了分析android和分析iphone app的功能,所以用处的话还是有一些的。

项目地址 [GoogleCode] https://code.google.com/p/smartphonesdumbapps/
如何打不开就翻墙吧,唉

主要功能

Android

    解包apk;
    解码manifest.xml(用axml2lxml);
    获取app需要的权限;
    获取app的截屏(根据 Android manifest);
    反编译DEX,通过解析DEX来检查文件权限等;
    查找URL,主机名以及一些网络路径。

Iphone App

    解包iPhone IPA file或者破解XYZ.app/文件夹;
    把.plist转成XML以供浏览;
    通过查看.plist XMLs来查找app定义的一些URL;
    查找URLs,主机名和一些网络路径。

相关内容

Smart Phones Dumb Apps这个脚本集的初衷在于“智能手机意外丢失,‘别有用心’的人通过你的app都能获取到什么信息”这个假设来的(想必是有类似惨痛经历),所以内容是在分析AndroidManifest.xml、res/文件夹中的其他XML文件、classes.dex 这个DEX的二进制文件,通过这些文件,都能看到什么信息,或者有什么隐含的攻击点。

在解码xml文件的时候,用到了 axml2xml,在解DEX的时候,用的是 dedexer,都是比较常用的工具。之后,通过 dex2jar 转换成可读的java代码。

通过以上几步,攻击者甚至可以看到许多程序的数据流程、调用方式、调取的第三方服务等敏感信息,通过一些分析,就能得到程序的薄弱点并加以攻击。

当然,这个只提供了前面解析的部分,攻击的事还是得交给metasploit之类的来……

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20