app test

移动端测试要点

安装测试、卸载测试

UI测试

1615137765268

功能测试

1615133542830

运行app

1615134963504

应用的前后台切换

1615134979917

免登陆

1615135150085

数据更新

1615135195319

离线浏览

1615135394779

app更新

1615135456332

定位、照相机服务

1615135477942

时间测试

1615135504852

PUSH测试

1615135520679

性能测试

1615136053666

交叉事件测试

1615136213904

例如:微信视频和来电

兼容性测试

升级、更新测试

1615136698549

用户体验测试

1615136880550

硬件环境测试

1615136938152

接口测试

客户端数据库测试

1615137461874

安全测试

1615137928157

Android测试

Android系统的基本结构

linux内核层

Android函数库和Android运行的虚拟机

应用程序框架

应用程序

1615140074133

测试术语

  • 系 统碎片化
  • 屏幕尺寸
  • 分辨率
  • 像素
  • 网络制式
1615140333141
像素

一位=8字节

大小 1156*634 = 732904

732904/8=9291613=92K

9291613/1024=89.

网络制式
1615142556664

Android四大组件

缺一不可

1615232986341
  • 活动
1615233173816
  • 服务
1615233382480
  • 内容提供者
1615233473534
  • 广播接受者
1615233720649

Android测试环境搭建

:one:真机测试

使用真实的手机测试

:two:安卓模拟器

:three:Android自带的模拟器

:four:云真机测试

Android开发环境

  • 安装java, jdk
  • ADT工具包1615234913928

环境配置

1615309230399

打开eclipse

1615310931766

ADB命令

  • 启动和关闭服务

adb kill-server

adb start server

  • adb.exe connect 127.0.0.1:62001

  • 查看设备连接情况
1615312862427
  • 安装和卸载APK程序
1615313005852 1615313041547 1615314153934 1615314260967 1615314304693
  • 列出当前设备上的程序包

adb shell pm list packages

  • 上传和下载
1615314565572
  • 日志
1615396174848 1615396200109

过滤1615396478274

1615396559638
  • 其他
1615396733068

adb bugreport

monkey命令

是什么?
1615481732999
  • 所有的操作事件都是随机发生的。不以让人的意志为变化。 由于事件都是随机的、无序的,所以不做功能方面的测试,只对APP进行性能、稳定性方面的测试。

  • monkey测试的时候,需要长时间、大量的操作事件

特征
1615482052583
Monkey的停止条件
1615483112988
进入Monkey
1615483206902
命令
1615483820132 1615483835799
1615484056012
1615484263141 1615484482624 1615484538246 1615486792982

1615486953589

使用案例

1615487083624

–pct

monkey命令的参数,没有特别强制性的顺序,可以按照monkey命令的帮助列表的参数顺序记忆和使用.

Monkey异常log分析

1615487991940

1615488289973 1615488415636

Appium

https://github.com/appium/appium-desktop/releases/tag/v1.20.2

1615557202275 1615558307389 1615558370562 1615558953951

元素识别

使用ADT环境中的sdk目录下,tools目录中的uiautomatorviewer.bat

启动uiautomatorviewer.bat

点击device Screenshot

1615560081753

操作

1615560132106
模拟键盘手机操作

输入操作: sendkeys()

点击操作: click()

模拟手势操作
1615563279179
移动设备相关操作
1615563684414

Appium脚本编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class TestAppium{
public static main(String[] args) throws Exception{
//定义DesiredCapabilities对象
DesiredCapabilities dc = new DesiredCapabilities();
//设定DesiredCapabilities的属性
dc.setCapability("deviceName","127.0.0.1:56001");//adb命令查出的设备的编号
dc.setCapability("automationName","Appium");//设置自动化测试工具名称
dc.setCapability("platformName","Android");//设置平台系统名称
dc.setCapability("platformVersion","4.4.4");//设置Android系统版本号
dc.setCapability("appPackage","com.youba.calculate");//设置目标app包名
dc.setCapability("appActivity",".MainActivity");//设置目标app的启动界面

/**
* url:指的是本地appium服务的IP地址及对应的端口号(appium的默认端口号是4723)
* 通过该地址可以使appium连接Android设备
*
* Capabilities:就是DesiredCapabilities对象
**/
//定义appium驱动对象 打开本地app驱动(appium)
AppiumDriver appd = new AppiumDriver(new URL("http://127.0.0.1/wd/hub"),dc);

//写脚本,让计算器计算54+68
appd.findElement(By.id("com.youba.calculate:id/btn_five")).click();
appd.findElement(By.id("com.youba.calculate:id/btn_four")).click();
appd.findElement(By.id("com.youba.calculate:id/btn_plus")).click();
appd.findElement(By.id("com.youba.calculate:id/btn_six")).click();
appd.findElement(By.id("com.youba.calculate:id/btn_eight")).click();
appd.findElement(By.id("com.youba.calculate:id/btn_equal")).click();

appd.closeApp();
}
}

Junit

一次单元测试用例设计的过程

1615652206629

Junit环境

1615652373832

1615652610537

1615653557718

1615662647821

编写测试

在这里你将会看到一个应用 POJO 类,Business logic 类和在 test runner 中运行的 test 类的 JUnit 测试的例子。

C:\ > JUNIT_WORKSPACE 路径下创建一个名为 EmployeeDetails.java 的 POJO 类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class EmployeeDetails {

private String name;
private double monthlySalary;
private int age;

/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the monthlySalary
*/
public double getMonthlySalary() {
return monthlySalary;
}
/**
* @param monthlySalary the monthlySalary to set
*/
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
}

EmployeeDetails 类被用于

  • 取得或者设置雇员的姓名的值
  • 取得或者设置雇员的每月薪水的值
  • 取得或者设置雇员的年龄的值

C:\ > JUNIT_WORKSPACE 路径下创建一个名为 EmpBusinessLogic.java 的 business logic 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class EmpBusinessLogic {
// Calculate the yearly salary of employee
public double calculateYearlySalary(EmployeeDetails employeeDetails){
double yearlySalary=0;
yearlySalary = employeeDetails.getMonthlySalary() * 12;
return yearlySalary;
}

// Calculate the appraisal amount of employee
public double calculateAppraisal(EmployeeDetails employeeDetails){
double appraisal=0;
if(employeeDetails.getMonthlySalary() < 10000){
appraisal = 500;
}else{
appraisal = 1000;
}
return appraisal;
}
}

EmpBusinessLogic 类被用来计算

  • 雇员每年的薪水
  • 雇员的评估金额

C:\ > JUNIT_WORKSPACE 路径下创建一个名为 TestEmployeeDetails.java 的准备被测试的测试案例类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic =new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();

//test to check appraisal
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal= empBusinessLogic.calculateAppraisal(employee);
assertEquals(500, appraisal, 0.0);
}

// test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary= empBusinessLogic.calculateYearlySalary(employee);
assertEquals(96000, salary, 0.0);
}
}

TestEmployeeDetails 是用来测试 EmpBusinessLogic 类的方法的,它

  • 测试雇员的每年的薪水
  • 测试雇员的评估金额

现在让我们在 C:\ > JUNIT_WORKSPACE 路径下创建一个名为 TestRunner.java 的类来执行测试案例类

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestEmployeeDetails.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}

用javac编译 Test case 和 Test Runner 类

1
2
C:\JUNIT_WORKSPACE>javac EmployeeDetails.java 
EmpBusinessLogic.java TestEmployeeDetails.java TestRunner.java

现在运行将会运行 Test Case 类中定义和提供的测试案例的 Test Runner

1
C:\JUNIT_WORKSPACE>java TestRunner

检查运行结果

1
true