
摘要
本文旨在帮助大家使用目前比较流行的行为驱动框架,借助 CukeTest 开发工具,快速搭建手机 app 自动化测试框架。你只需要掌握基本的测试技巧,了解基本的 js 语法,就能快速上手并实现手机 app 的自动化测试。
本次脚本针对 Appium 自带的应用 API Demo 执行自动化,开发完成后并成功运行,可以得到相关的测试报告:


以下为具体操作步骤:
下载 CukeTest,我们写 JavaScript 测试代码和行为驱动脚本用到的开发工具,下载地址: http://cuketest.com/
自备一台 Android 设备,并且在手机上安装好 appium 测试自带客户端 API-Demo: https://github.com/appium/sample-code/tree/master/sample-code/apps/ApiDemos/bin
下载 appium 桌面版录制运行脚本用https://github.com/appium/appium-desktop/releases/tag/v1.5.0
手机与 PC 必须在同一局域网并且可以相互通信,如果不能通信试着去关掉防火墙。
电脑上安装好 adb 环境变量,具体操作请自行网上查阅。
Android 手机打开开发者选项,允许开发者调试。
2.配置手机客户端的无线连接
$ adb devices
List of devices attached
U10AFH235V8 device
$ adb tcpip 5555
restartingin TCP mode port: 5555
$ adb connect 192.168.1.5:5555
connected to 192.168.1.5:5555
$ adb devices
List of devices attached
192.168.1.5:5555 device

例如我们要编写一个下图的简单操作场景:

我们也可以将 CukeTest 切换到文本界面,直接将如下代码复制进去。
# language: zh-CN
功能: 测试手机客户端用例
这是一个使用 CukeTest 以 BDD 的方式来做手机端的自动化测试样例。
场景: API Demo 自动化
假如点击 App 跳转到 App 页面
当在 App 页面中点击 Action Bar
那么页面应该跳转到 Action Bar 页面,页面中应该包含"Action Bar Mechanics"

我们使用其它语言来写手机自动化代码的时候,需要用到一些第三方的依赖库。同样,我们在这个项目中也需要使用到第三方的库文件。
此次我们用的库如下:
webdriverio: 封装的 web 和手机端的自动化操作控件库
@types/webdriverio:帮助我们在 CukeTest 中写代码时能够获得智能提示的库
在 CukeTest 中安装这些库非常简单:
点击更新包依赖配置—选择添加/删除
输入框中分别输入“webdriverio”和 “@types/webdriverio”,CukeTest 会自动帮我们搜索出对应的结果,选择即可。

完成之后直接点击保存,CukeTest 会自动帮我们保存到 package.json 文件中。

之后在这个项目目录的命令行中输入"npm install"就可以安装了。
备注:因为 npm 默认服务器在国外,如果遇到下载比较慢或者下载不下来的的情况,可以在命令行模式下使用 cnpm 进行安装依赖包。
打开 step_definitions/definitions.js 文件,逐一点击我们 feature 文件中操作步骤后面的灰色按钮,CukeTest 会自动为我们生成自动化样例代码到 definitions.js 文件中


{
"platformName": "Android",
"deviceName": "192.168.1.5:5555",
"appPackage": "io.appium.android.apis",
"appActivity": "io.appium.android.apis.ApiDemos",
"resetKeyboard": false,
"noReset": true
}
deviceName:我们在准备阶段设置好的手机户端地址(请输入自己在命令行输入的值)
appPackage:被测应用的包名
appActivity:被测应用的入口
resetKeyboard:是否重置手机键盘
noReset:不要重新安装手机 app
此时 appium 应该显示手机客户端打开的界面。


选中 App – 点击 tap,appium 会自动远程点击手机姐界面中的 App。

同样的在新的页面中点击 Action Bar 进入到 Action Bar 页面。

根据 appium 协助生成的代码,完善 definitions1.js 文件:
const { Given, When,Then } = require('cucumber');
//// 你的步骤定义 /////
Given(/^点击 App 跳转到 App 页面$/, async function () {
await driver.element("~App").click()
});
When(/^在App页面中点击Action Bar$/, async function () {
await driver.element("~ActionBar").click()
});
Then(/^页面应该跳转到 Action Bar 页面,页面中应该包含"([^"]\*)"\$/,async function (excpetval){
return'pending';
});
此时还不能运行,我们需要使用 webdriverio 库的相关方法创建 driver,在 support 目录下创建 get_driver.js 文件,编写如下代码:
var webdriverio = require('webdriverio');
let options = {
desiredCapabilities: {
platformName: "Android", //
deviceName: "U10AFCPH235V8", deviceName:"192.168.1.5:5555", platformVersion: "6.0", appPackage: "io.appium.android.apis", appActivity: "io.appium.android.apis.ApiDemos", resetKeyboard: false,
noReset: true,
},
host: "localhost",
port: 4723
} //根据您的浏览器配置创建 WebDriver 实例;
function createDriver() {
const client = webdriverio.remote(options); return client;
}
exports.driver = createDriver();
为了在每个场景运行之后做截屏操作,可以在 support 目录下创建 hooks.js。编写如下代码:
const { After,BeforeAll, Before, AfterAll, setDefaultTimeout } = require('cucumber');
const { driver } = require('./get_driver');
// 设置默认的超时时间
setDefaultTimeout(60 * 1000);
BeforeAll(function(){
return driver.init();
})
Before(function () {
//定义场景运行之前
})
After(async function () {
//定义场景运行之后
let screenshot = awaitdriver.saveScreenshot();
this.attach(screenshot,'image/png');
});
AfterAll( function () {
//perform some shared teardown
return driver.end();
})
在 definitions1.js 文件引入 driver
const { driver } = require('../support/get_driver')
现在点击运行场景,程序应该可以正常运行。你可以看到你的手机自动去按我们操作步骤中定义的那样去运行。
const assert = require('assert')
完善代码最终 definitions.js 文件代码:
const { Given, When,Then } = require('cucumber');
const assert = require('assert')
const { driver } = require('../support/get_driver')
Given(/^点击 App 跳转到 App 页面$/, async function () {
await driver.element("~App").click();
let text = await driver.element('~Action Bar').getText();
return assert.equal(text,'Action Bar')
});
When(/^在App页面中点击Action Bar$/, async function () {
await driver.element("~ActionBar").click();
});
Then(/^页面应该跳转到 Action Bar 页面,页面中应该包含"([^"]\*)"\$/, async function (excpetval) {
let text = await driver.element('~Action BarMechanics').getText();
return assert.equal(text,excpetval)
});
点击运行项目按钮,自动运行项目。

运行完成后,自动生成测试报告。在测试报告中可以看到截图的生成以及每一操作步骤的运行情况。

总结
这里使用了 Node.js + Cucumber 开发了 Appium 的客户端脚本,使用 CukeTest 开发环境,优势:
完全的开源的代码,可以在多平台运行,包括 Windows, Linux, Mac 等。
CukeTest 提供的开发环境快速生成自然语言的测试用例和框架代码,及可视化报表、视频等。
最新的 Node.js 和 JavaScript 的异步语法 async/await 在脚本开发中得到了广泛的应用,再也不用为异步编程的难度而烦恼了。
其它参考:
https://ke.qq.com/course/281565
https://ke.qq.com/course/280876
http://cuketest.com/zh-cn/summary

加 QQ 群 707467292,参与 Node.JS + Cucumber 技术的讨论。