静态分析以及单元测试的对象为开源App的源码,这里是要求为实验三开发后的源码的分析,以及单元测试的编写需要覆盖更新后的功能,但是Appium测试脚本的编写主要针对的实验对象是:原始的开源Apk
本次实验主要是为了掌握基本的程序分析方法和测试方法。从静态分析、⽩盒测试、⿊盒测试三个⽅面出发,将实验设置为以下三个部分:
在https://github.com/appium/appium-desktop/releases/tag/v1.21.0-1下载1.21或以下的客户端即可,注意一定要1.21版本以下! 下⾯以Windows为例讲解Appium的配置及使用⽅法,Mac的Appium的配置与使用方法见《Appium自动化测试框架的配置安装与使用》。 下载完成后双击运行Appium,启动页面如下:
点击Edit Configurations按钮进行相应环境变量配置,主要是Android SDK路径及Java路径。
Android SDK的位置一般在:C:\Users\xxxxx\AppData\Local\Android\Sdk
Java路径为Java的安装路径:下图仅供参考
完成路路径配置后,点击save and restart按钮重启appium。再次在重启⻚页⾯面,点击start server 即可启动appium。
可以看到,当前appium的监听端⼝口为0.0.0.0:4723。此时appium已经成功启动。
本次使⽤用GUI测试脚本使⽤用Python3编写,Python环境配置过程如下:
Python下载地址:https://www.python.org/downloads/。 请勿下载python2.7版本! 下载完成安装后配置相应环境变量量即可。
对于Mac⽤用户,推荐使⽤用brew进⾏安装可避免与系统已有python版本冲突。
完成python环境配置后,使⽤用pip命令进⾏行行appium依赖添加,pip命令如下:
pip install Appium-Python-Client
如果发现⽆无法使用pip,请先进⾏行行pip的安装,安装⽅方法如下:
参考⽹网址:https://pip.pypa.io/en/stable/installing/
⾸先下载get-pip.py⽂文件,下载方式如下:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
下载完成后,在get-pip.py⽂文件所在⽬目录下,运⾏如下命令安装pip:
python get-pip.py
完成pip安装后重新执⾏行行appium依赖安装命令即可。
Android Studio已经集成静态分析工具Lint。只需点击Analyze->Inspect Code即可。
在配置⻚面,你可以根据⾃己的需求更改配置,选择分析整个文件还是某一模块。当然你也可以直接点击ok进⾏行行代码分析。
运行完成后,分析结果报告如下:
报告结果中基本项的含义:
Correctness :不够完美的编码,⽐如硬编码、使⽤用过时 API 等
Performance: 对性能有影响的编码,⽐如:静态引用,循环引用等
Internationalization: 国际化,直接使⽤用汉字,没有使⽤资源引用等
Security: 不安全的编码,比如在 WebView 中允许使⽤JavaScriptInterface 等
Usability: 可用的,有更好的替换的,比如排版、图标格式建议.png格式 等
Accessibility: 辅助选项,⽐如ImageView的contentDescription,往往建议在属性中定义等
你可以从该报告结果中看到程序代码中存在的缺陷,及相应的推荐改进⽅方案。据此,你可以对程序代码进⾏行行完善。
如果你想了解更更多关于Lint的知识,可以参考:https://developer.android.com/studio/write/lint
一个简单的例子
待测试代码:
public class Calculater {
public int add(int a, int b){
return a + b;
}
}
单元测试用例:
public class CalculaterTest {
Calculater calculater = new Calculater();
junit.Test .
// 运⾏行行测试时,所有被@org.junit.Test注解的⽅方法均会被执⾏行行
public void testAdd(){
int a = 1 , b = 2 ;
int result = calculater.add(a, b);
Assert.assertEquals(result, 3 );
}
}
运⾏测试,在Android Studio中可以看到测试通过:
如果将上述代码改为Assert.assertEquals(result, 4);,则测试失败:
Appium提供了获取当前⻚面中控件信息的功能。 ⾸先按上述Appium启动步骤,启动Appium。然后点击下图红框中按钮。
在配置界⾯,填写配置信息,即填写Desired Capabilites:
基本Desired Capabilites配置如下:
xxxxxxxxxx
{
"platformName": "Android", // 设备类型,Andorid平台默认为Android
"platformVersion": "7.1.1", // 设备Android版本信息
"deviceName": "emulator-5554", // 设备名称
"appPackage": "chat.tox.antox", // 待测试应⽤用包名
"appActivity": "chat.tox.antox.SplashActivity" // 待测试应⽤用MainActivity名称
}
// 其中设备信息可在设备的设置中获取
// 应⽤用包名、MainActivity信息可在项⽬目AndroidManifest.xml中获得
填写好相应配置后,点击start session即可,查看应⽤当前页⾯控件信息。
在左侧点击相应控件即可在右侧看到该控件的相应信息。
如果进入新的⻚面,只需点击上图红框中按钮即可刷新⻚面进而获得新的⻚面的控件信息。
以下给出⼀个简单的测试脚本:
# -*- coding:utf8 -*-
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# appium 配置信息
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '7.1.1'
desired_caps['deviceName'] = 'emulator-5554'
desired_caps['appPackage'] = 'chat.tox.antox'
desired_caps['appActivity'] = 'chat.tox.antox.SplashActivity'
desired_caps['noReset'] = True
desired_caps["unicodeKeyboard"] = "True"
desired_caps["resetKeyboard"] = "True"
# test case3:
# 启动webdriver执⾏行行测试脚本
# http://0.0.0.0:4723/wd/hub为默认端⼝口,可修改为启动appium时你所设置的端⼝口,例例
如:http://127.0.0.1:2233/wd/hub
driver = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
driver.implicitly_wait(20)
time.sleep( 2 )
# 根据控件的class_name来获取控件
el = driver.find_elements_by_class_name("android.widget.ImageButton")[0]
el.click() # 点击该控件
# 根据控件的ID来获取控件
el = driver.find_elements_by_id("android:id/title")[ 0 ]
el.click()
el = driver.find_elements_by_id("a2dp.Vol:id/checkBox1")[ 0 ]
el.click()
# 根据控件的Class_name来获取控件
el = driver.find_elements_by_class_name("android.widget.ImageButton")[0]
el.click()
el = driver.find_elements_by_id("android:id/title")[0]
el.click()
driver.back()
driver.quit()
完成测试脚本的编写后,启动appium,再执行测试脚本即可对应用进⾏测试。 编写时需要严格按照《规范文档》,不然会影响实验五!
a. 报告中请提交⾄少一张使用Appium获取控件信息功能获取应用⻚⾯控件的使用截图。图⽚类似下图:
b. 至少3张Appium其他功能探索的截图。
注意:
截图中应⽤必须是你⾃⼰所分配的APP
以表格形式提交静态分析结果,表格格式类似下表:
类别 | 数目 |
---|---|
Correctness | 2 |
Bug | 2 |
如果你对静态分析结果进⾏了改进,请列出你所改进前后代码。如果更改代码较多,列出部分即可( 3 条以上,附加得分)。
以表格形式列出你所编写单元测试基本信息,表格格式类似下表(所测试方法(需要至少包含可以覆盖实验三更新的方法)不得少于10个,特殊情况向助教反映):
所测试方法 | 所测试⽅法功能描述 | 测试⽤例数⽬ | Pass测试用例数⽬ | Fail测试用例数⽬ | 测试覆盖度 |
---|---|---|---|---|---|
MainActivity.onCreate() | 加法 | 3 | 2 | 1 | 10% |
至少提交一张Pass测试⽤例的运⾏结果截图及一张Fail测试⽤例的运⾏结果截图。
以表格形式列出你所编写测试脚本基本信息,表格格式类似下表(功能场景测试不得少于5个,需要覆盖实验三更新的功能,要求:在原始的Apk上可以运行,但是在更新后的Apk上无法运行,例如原始Apk的重命名功能,我的测试脚本可以测试原始Apk的这个功能,但是我的测试脚本不能测试更新了重命名功能之后的App)测试脚本需要按照《规范文档》进行编写,不然会影响实验5:
测试场景 | 测试该场景的测试⽤例数目 | 测试该场景的测试用例代码⾏行数 |
---|---|---|
文件浏览功能 | 2 | 30 |
文件删除 | ||
文件重命名 | ||
设置 |
提交测试脚本(.py)文件。