自动化测试实用文档——把自己当成用户

APP测试功能点总结



1.功能性测试:根据产品需求文档编写测试用例;软件设计文档编写用例
2.兼容性测试:Android版本的兼容性;手机分辨率兼容性;网络的兼容性;APP跨版本的兼容性
1.适配性测试:
  1>.手机不同分辨率支持:客户端支持的分辨率等
  2>.手机不同版本的支持:2.34.04.4等;在测试计划中:需要安排单独的时间用于android不同系统的兼容性测试,包括2.0以下版本和4.0以上等
  3>.手机不同厂家系统的支持:不同厂家会有不同android系统,例如:小米, 华为,锤子对市面上主流手机的支持
  4>.手机不同尺寸的支持:3.5到5.0屏幕在UI显示有区别,要支持最大到最小。
2.安装、卸载测试:
  1>.生成apk文件在真机上可以安装及卸载;
  2>.Android手机端通用安装工具。如:豌豆荚
3.在线升级测试:
  1>.验证数字签名
  2>.升级后可以正常使用。
  3>.在线跨版本升级。

3.性能测试:压力测试;电量流量测试lcup。内存消耗;app启动时长;crash率;内存泄漏
4.网络测试:
1.外网测试主要现实模拟客户使用网络环境,检验客户单程序在实际网若环境中使用情况及进行业务操作。
2.外网测试主要覆盖到wifi\2G\3G\4G,.net\wap、电信\移动\联通、所有可能的组合进行测试。
原则:
  1.尽可能全面覆盖用户的使用场景,测试用例中需要包含不同网络排列组合的各种可能。
  2.还有模拟信号被屏蔽时候。客户端的影响等。还有做外包场景测试,在高山、丘陵、火车上等特殊环境下进行全面测试
5.接口测试:clien端和service端的交互;client的数据更新和service的数据是否一致;client更新时断开;client更新时service挂了。
6.业务逻辑测试:
1.业务逻辑测试:主要测试客户端业务能否正常完成。
2.功能点测试:主要测试客户端功能点是否正常使用
3.关联性测试:主要测试客户端与pc端的交互,客户端处理完后,pc端与客户端数据一致

7.异常测试
    交互异常性测试:客户端作为手机特性测试,包括被打扰的情况;如来电,来短信,低电量测试等,待机,插拔数据线,耳机等操作不会影响客户端
    异常性测试:断网,断电,服务器异常等情况下,客户端能否正常处理,保证数据正确
8.客户端侧性能测试
    基准性能测试:通过服务器端口及客户端在不同网络环境下响应速度
    大数量的测试:主要在特定环境下,客户端一次性更新大量的数据及人员列表时,客户端能否正常处理,
        客户端第一次使用,第一次就更新大量数据及人员列表
        客户端在平时更新中,更新大量的数据
        客户端已经在手机本地下载很多数据后,再次更新大量


自动化测试的工具

  • MonkeyRunner 
    monkeyrunner工具提供一个API来控制Android设备。可以写一个Python脚本来安装应用,运行应用,发送键值,截图。monkeyrunner对python进行了封装,加入了一些针对Android设备的类。可以完全用python脚本来实现这些功能。

  • Instrumentation 
    基于Android单个Activitiy的测试框架。

  • Robotium 
    一个优秀的测试框架,基于Instrumentation的二次封装。

  • QTP 
    一个Web上的自动化测试工具,通过录制脚本来实现自动化测试。

  • UiAutomator 
    目前最佳的UI自动化测试框架。基于Android 4.X+系统,专业UI自动化测试,可以模拟用户对手机的各种行为。编写快速、可以使用大部分的Android API、无需签名,无任何Activity限制。

测试框架 使用语言 运行方式 限制 适用环境
MonkeyRunner Python ADB、Python 测试靠坐标 压力测试
Instrumentation Java ADB 只能单个Activity测试,且需要应用相同签名,代码量大 白盒测试
Robotium 同上 同上 同上 同上
UiAutomator Java ADB或者脱机 Android 4.X+ UI测试


Android stdio自动化测试基本脚本配置

1. 安装依赖库

工程中使用UI自动化模块,需要编辑你的工程下 app 目录下的文件 build.gradle ,添加如下信任:

androidTestCompile 'com.android.support.test:runner:0.2'                       
  androidTestCompile 'com.android.support.test:rules:0.2'                        
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.0'

现在屏幕上应该有 Sync Now 按钮了,但点击它时,会看到如下错误信息:

点击 Install Repository and sync project 链接来安装 Android Support Repository 

如果使用的是库 appcompat-v7 且其版本号是 22.1.1 ,你需要添加如下依赖以确保应用本身和测试应用都使用相同版本的com.android.support:support-annotations:

androidTestCompile 'com.android.support:support-annotations:22.1.1'

接下来,由于Android Studio自身的一个bug,你需要通过packagingOptions执行一个名为 LICENSE.txt 的文件。这个执行失败的话,在运行测试时将引起如下错误:

Execution failed for task ':app:packageDebugAndroidTest'.                                                                                   
   Duplicate files copied in APK LICENSE.txt                                                                                                   

   File 1: ~/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/1.1/860340562250678d1a344907ac75754e259cdb14/hamcrest-core-1.1.jar  
   File 2: ~/.gradle/caches/modules-2/files-2.1/junit/junit-dep/4.10/64417b3bafdecd366afa514bd5beeae6c1f85ece/junit-dep-4.10.jar

在你的 build.gradle 文件底部增加如下代码段:

android {                                       
       packagingOptions {                          
           exclude 'LICENSE.txt'                   
       }                                           
   }

2、创建测试类

创建一个新的测试类,CalculatorTester,通过在 androidTest 目录下创建名为 CalculatorTester.java 的文件实现。创建的UI自动化测试用例,必须继承自InstrumentationTestCase。(Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation并不是这样的,我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类


按 Alt+Insert后选择 SetUp Method 来重写setUp方法。setup方法,测试前的准备工作(初始化工作)

再次按 Alt+Insert 后选择 Test Method 来生成新的测试方法,命名为testAdd。到此CalculatorTester类定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
   public class CalculatorTester extends InstrumentationTestCase {
 
       @ Override                                                
       public void setUp ( ) throws Exception {                     
 
       }                                                         
 
       public void testAdd ( ) throws Exception {                   
 
       }                                                         
   }                                                                     
 

3、查看Launcher UI

连接你的Android设备到电脑商,点击home按键,进入主界面。

返回到你的电脑,使用文件管理或者终端浏览你安装Android SDK的目录,进入到 tools目录下,点击 uiautomatorviewer 。这个会启动 UI Automater Viewer ,你将看到如下界面:

点击上方手机图标来获取Android设备截屏。注意到此时获取到的截屏是可交互的。点击下面的Apps图标。在右方的 Node Detail 区域,你就可以看到根据选择图标的不同显示不同的详细信息,如下图所示:

与屏幕上的应用交互,UI自动化测试需要能唯一识别它们。在这个教程中,可以使用应用的textcontent-desc或者class字段来唯一的区分。

从上图可以看到Apps图标没有text字段,但有content-desc。记下它的值,后面将用到这个值。

拿起Android设备,触摸Apps图标,进入设备安装的所有应用界面。使用 UI Automater Viewe 获取另外一张屏幕截图。因为要写一个计算器应用的测试,点击计算器图标查看详细界面。

这次content-desc是空的,但是text的值为Calculator,同样记住这个值。

如果你的Android设备运行不同的主界面或者不同的Android版本,界面和显示的细节会有所不同。这意味着后续代码中需要做一些修改,以匹配你的操作系统


安装文件目录D:\android\sdk\tools中的    uiautomatorviewer(UI Automater Viewe)做UI测试。可以使用应用的textcontent-desc或者class字段来唯一的区分。

4、准备测试环境

返回到Android Studio,给setUp方法中添加代码。如同其名字,setUp方法是用来准备测试环境的。换句话说,这个方法是在真正测试之前指定具体需要执行什么动作的。

现在需要写代码来模拟刚才在Android设备上执行的几个动作:
1、按home键进入主界面
2、按Apps图标进入应用界面
3、点击计算器图标启动它

在你的类中声明类型为UiDevice的变量device。它代表你的Android设备,后续使用它来模拟用户行为。

1
2
   private UiDevice  device ;
 

setUp方法中,通过调用UiDevice.getInstance method来初始化device,传递Instrumentation实例,如下所示:

1
2
   device = UiDevice . getInstance ( getInstrumentation ( ) ) ;
 

模拟点击设备home键,需要调用pressHome方法。

1
2
   device . pressHome ( ) ;
 

接下来,需要模拟点击Apps图标的动作。不能立即做这个动作,因为Android设备需要一个反应时间来加载界面。如果在屏幕显示出来之前执行这个动作就会引起运行时异常。

等待一些事情发生时,需要调用UiDevice实例的wait方法。等待Apps图标显示到屏幕,使用Until.hasObject方法。

识别Apps图标需要使用By.desc方法并传递值为Apps的参数。你还需要指定最长等待时间,单位为毫秒。此处设置为3000。
至此形成如下代码段:

1
2
3
   // Wait for the Apps icon to show up on the screen
   device . wait ( Until . hasObject ( By . desc ( "Apps" ) ) , 3000 ) ;
 

要获取Apps图标的引用,需要使用findObject方法。一旦有了Apps图标的引用,就可以调用click方法来模拟点击动作了。

1
2
3
   UiObject2  appsButton = device . findObject ( By . desc ( "Apps" ) ) ;
   appsButton . click ( ) ;
 

和前面一样,我们需要等待一些时间,保证计算器图标显示到屏幕上。在之前的步骤中,我们看到可以通过text字段唯一的识别计算器图标。我们调用By.text方法来找到图标,传递参数为Calculator

1
2
3
   // Wait for the Calculator icon to show up on the screen
   device . wait ( Until . hasObject ( By . text ( "Calculator" ) ) , 3000 ) ;
 

5、检查计算器UI

在你的Android设备上启动计算器应用,使用 UI Automater Viewer 来查看显示。获取到一个截屏后,点击不同的按钮来观察使用何值可以唯一的区分它们。

在本次测试用例中,使用计算器计算 9+9= 的值并确认结果是否为 18。这意味着你需要知道怎么区分按键 9、+ 和 =。

在我的设备上,如下是我收集到的信息:

  1. 数字按键匹配text
  2. + 和 = 使用content-desc值,分别对应 plus 和 equals
  3. 返回值显示在EditText控件中

如果你使用不同版本的计算器应用,请注意这些值有可能不一样。

6、创建测试类

在前面几步操作中,你已经学会了使用findObject方法通过By.text或者By.desc来获取屏幕上不同对象的引用。还学会了通过click方法来模拟点击对象的动作。下面的代码使用这些方法来模拟 9+9=。添加这些到类CalculatorTester的方法testAdd中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
   // Wait till the Calculator's buttons are on the screen        
   device . wait ( Until . hasObject ( By . text ( "9" ) ) , 3000 ) ;               
 
   // Select the button for 9                                    
   UiObject2  buttonNine = device . findObject ( By . text ( "9" ) ) ;         
   buttonNine . click ( ) ;                                             
 
   // Select the button for +                                    
   UiObject2  buttonPlus = device . findObject ( By . desc ( "plus" ) ) ;     
   buttonPlus . click ( ) ;                                             
 
   // Press 9 again as we are calculating 9+9                    
   buttonNine . click ( ) ;                                             
 
   // Select the button for =                                    
   UiObject2  buttonEquals = device . findObject ( By . desc ( "equals" ) ) ;
   buttonEquals . click ( ) ;                                           
 

现在就等待运行结果。此处不能使用Until.hasObject,因为包含计算结果的EditText已经显示在屏幕上了。取而代之,我们使用waitForIdle方法来等待计算完成。同样,最长等待时间是3000毫秒。

1
2
device . waitForIdle ( 3000 ) ;
 

使用findObjectBy.clazz methods方法获取EditText对象的引用。一旦有了此引用,就可以调用getText 方法来确定计算结果是否正确。

1
2
3
   UiObject2  resultText = device . findObject ( By . clazz ( "android.widget.EditText" ) ) ;
   String result = resultText . getText ( ) ;
 

最后,使用assertTrue来检验范围值是否为18。

1
2
   assertTrue ( result . equals ( "18" ) ) ;
 

测试到此结束。

7、执行测试

执行测试,需要在Android Studio的工具栏中选择CalculatorTester,点击它右方的play按钮。

一旦编译结束,测试就成功运行完整。当测试运行时,在你的Android设备上就会看到UI自动化运行界面。

测试方法:
//        device.drag(300, 300, 0, 300, 5);//向左滑屏
// device.drag(0, 300, 300, 300, 5);//向右滑屏
// device.click(200, 300);//点击绝对坐标点
// device.pressHome();//点击home
// device.pressBack();//点击返回键
// device.pressEnter();//点击键盘确认键
// device.pressMenu();//点击菜单键
// device.isScreenOn();//判断是否锁屏
// device.getDisplayHeight();//获取屏幕高度
// device.getDisplayWidth();//获取屏幕宽度
// device.sleep();//设备休眠
// device.getDisplaySizeDp();//获取显示尺寸
// //device.takeScreenshot();//截取屏幕,参数为储存路径,需要先I/O读取
// device.wakeUp();//唤醒设备
// device.waitForWindowUpdate("", 2000);//等待窗口更新
//
//
//  findObject获取某个东西的引用
// Until.hasObject等待某个东西出现在屏幕上
// device.wait(Until.hasObject(By.res("")), 3000);// 通过 ID 获取操作对象
// device.wait(Until.hasObject(By.desc("")), 3000);// 通过 Description 获取操作对象
// device.wait(Until.hasObject(By.text("")), 3000);// 通过 text 获取操作对象
// device.wait(Until.hasObject(By.textContains("")), 3000);// 通过 Text 包含内容获取操作对象
// device.wait(Until.hasObject(By.descContains("")), 3000);// 通过 Description 包含内容获取操作对象
// device.wait(Until.hasObject(By.pkg("")), 3000);// 通过包名获取操作对象
//
//
// UiObject2 app = device.findObject(By.desc("Apps"));
// app.click();// 点击
// app.longClick();// 长按
// app.clear();// 清除
// app.fling(Direction.DOWN);// 切换
// app.scroll(Direction.RIGHT, (float) 0.5);// 向右滚动 0.5 个屏幕(滚动条)
// app.setText("");// 编辑框输入内容
// app.swipe(Direction.DOWN, (float) 0.5);// 向右滑动 0.5 个屏幕
// app.drag(new Point(200, 300), 4);// 拖拽到指定坐标位置
//
// scrollable.scrollTextIntoView("");// 滚动到文本所在的位置
// scrollable.setAsVerticalList().scrollTextIntoView("");// 设置垂直滚动到文本指定位置 http://blog.csdn.net/yzzky/article/details/45933699
//
//
//
// assertTrue("", true);// 验证操

猜你喜欢

转载自blog.csdn.net/cao_mary/article/details/79526244