自动化测试
在小程序中使用自动化测试,主要包括:单元测试、接口测试、web页面点击事件
单元测试
使用 jest
全局安装
代码语言:javascript复制npm i jest -g
在项目中创建jest.config.js
代码语言:javascript复制module.exports = {
snapshotSerializers: [], // Jest 应用于快照测试的快照序列化程序模块的路径列表
testEnvironment: 'jsdom', //默认:"node" 将用于测试的测试环境。Jest 中的默认环境是 Node.js 环境, 如正在构建一个网络应用程序,你可以使用类似浏览器的环境来jsdom代替
testMatch: '' //测试文件存放地址 jest 用于检测测试文件的 glob 模式。默认情况下,它会查找文件夹内的 、 和 文件.js,以及.jsx任何带有 or 后缀的文件(例如or )
}
<a href="https://jestjs.io/docs/configuration#snapshotserializers-arraystring">详细参考jest文档</a>
miniprogram-automator 自动化测试
搭建环境
推荐使用1.05.2110202 或以上版本的开发者工具,支持自动化录制、检查元素、data 快照、 断言/检查、 cgi mock等功能
<a href="https://developers.weixin.qq.com/miniprogram/dev/devtools/auto/record.html">详细参考微信工具文档</a>
下载自动化测试插件
代码语言:javascript复制npm i miniprogram-automator --save-dev
在项目根目录下新建文件 index.spec.js 启动文件
代码语言:javascript复制const automator = require('miniprogram-automator')
automator.launch({
cliPath: 'D:/Program Files (x86)/Tencent/tool/cli.bat', // 工具 cli 位置,如果你没有更改过默认安装位置,可以忽略此项
projectPath: 'D:/work/your_project_path', // 项目文件地址
}).then(async miniProgram => {
const page = await miniProgram.reLaunch('/pages/index/index')
await page.waitFor(500)
const element = await page.$('.functionality-item') // 获取页面元素
await element.tap() // 触发该元素的tap点击事件
})
cliPath需要设置绝对路径,为小程序开发工具安装目录,window系统需要加上cli.bat
启动时,需要关闭当前开发者工具,在安装目录下运行
代码语言:javascript复制cli auto --project D:workyour_project_path --auto-port 9420
在开发者工具里面提前打开设置-安全设置-服务端口
项目出现的问题
在终端中(非小程序开发工具),启动命令,不然会出现
Error: Failed to launch wechat web devTools, please make sure http port is open
使用查找元素element 的数组属性不能类似jq的用法
需要
代码语言:javascript复制 // error
const element = await page.$$('.functionality-item')[1] // 获取页面元素
await element.tap() // 触发该元素的tap点击事件
// correct
const element = await page.$$('.functionality-item') // 获取页面元素
await element[1].tap() // 触发该元素的tap点击事件
使用方式 工具手点 方式
优点:
不需要写代码
可以导出用例
缺点:
数据填充问题
特殊场景无法完成如:断网,接口报错,选择图片
使用
在开发者工具 -> 工具 -> 自动化测试中,添加用例,点击录制按钮,对左侧模拟器上的页面进行操作,系统会自动记录整个过程,在操作过程中,可以对数据,页面进行快照、截图等操作
在用例添加完成后,可以导出为jest代码,在单独的文件中维护
生成报表结果
在项目中也可以在非项目中,运行jest,会对jest.config.js 中的配置进行解析
- 1 publicPath 存放目录
- 2 pageTitle 报表标题
- 3 filename 文件名称
const moment = require('moment');
const date = moment(new Date()).format('YYYY-MM-DD-HH-mm-ss');
module.exports = {
reporters:[
"default",
[
"jest-html-reporters",
{
"publicPath": "./report",
"pageTitle":"Jest Report",
"filename":`${date}.html`,
"expand":true
}
]
],
}
使用方式 connect 方式
在开发用例的使用推荐使用,注意点,需要关闭开发工具后运行
代码语言:javascript复制cli auto --project D:workyour_project_path --auto-port 9420
会自动打开小程序,在运行命令执行脚本,修改后可配置
代码语言:javascript复制const automator = require('miniprogram-automator') // 自动化插件
automator.connect({
wsEndpoint: 'ws://localhost:9420'
}).then(async miniProgram => {
// await miniProgram.remote() // 扫码登录连接真机,在真机上执行后续测试脚本
// 测试代码
})
使用方式 launch 方式
使用 必须要关闭小程序开发工具,不然端口会被占用,如果在开发测试用例,不建议使用该方式
在终端中(非小程序开发工具),启动命令,不然会出现
Error: Failed to launch wechat web devTools, please make sure http port is open
代码语言:javascript复制const automator = require('miniprogram-automator') // 自动化插件
automator.launch({
cliPath: 'D:/TOOLS/cli.bat', // 工具 cli 位置,如果你没有更改过默认安装位置,可以忽略此项
projectPath: 'D:/work/your_project_path', // 项目文件地址
}).then(async miniProgram => {
const page = await miniProgram.reLaunch('/pages/list/list')
await page.waitFor(500)
const element = await page.$$('.reported__list-item') // 获取页面元素
await element[0].tap() // 触发该元素的tap点击事件
await page.waitFor(4000)
await miniProgram.navigateTo('/pkgShare/pages/editExperience/index')
await page.waitFor(4000)
const pageTwo = await miniProgram.currentPage()
const textarea = await pageTwo.$('.day-edit-box__textarea')
const commit = await pageTwo.$('.commit-edit-btns__confirm')
await textarea.input('test font length')
await page.waitFor(4000)
commit.tap()
py 写法 minium
minium 是为小程序专门开发的自动化框架。使用 minium 可以进行小程序 UI 自动化测试, 但是 minium 的功能不止于仅仅是 UI 自动化, 甚至可以使用 minium 来进行函数的 mock, 可以直接跳转到小程序某个页面并设置页面数据, 做针对性的全面测试, 这些都得益于我们开放了部分小程序 API 的能力。除此之外,小程序有部分组件使用了系统原生的组件,对于这部分的组件,我们也基于 uiautomator 和 wda 做了补充。
特点
支持一套脚本,iOS & Android & 模拟器,三端运行
运行环境
Python 3.8及以上
微信开发者工具 (本文档中简称IDE)最新版本,并打开安全模式: 设置 -> 安全设置 -> 服务端口: 打开
微信 >= 7.0.7 (确认微信公共库版本 >= 2.7.3即可)
安装
自动安装
代码语言:javascript复制pip3 install https://minitest.weixin.qq.com/minium/Python/dist/minium-latest.zip
手动安装 下载minium安装包, 解压后进入文件夹, 运行
代码语言:javascript复制python3 setup.py install
环境检查
minium安装完成后
代码语言:javascript复制minitest -v
配置
代码语言:python代码运行次数:0复制import minium
mini = minium.Minium({
"project_path": "D:/work/your_project_path", # 替换成你的【小程序项目目录地址】
"dev_tool_path": "D:/Program Files (x86)/Tencent/tool/cli.bat", # 替换成你的【开发者工具cli地址】,macOS: <安装路径>/Contents/MacOS/cli, Windows: <安装路径>/cli.bat
})
print(mini.get_system_info())
minium 基于 unittest 进行封装
代码语言:python代码运行次数:0复制import minium
import unittest
class Test (minium.MiniTest):
def test_index(self):
print(self.mini.get_system_info())
if __name__ == '__main__':
unittest.main()
# 在项目中需要加入 config.json
# {
# "project_path": "D:/work/Applet_jubao_proj",
# "dev_tool_path": "D:/TOOLS/cli.bat"
# }
核心组件
api | 注解 |
---|---|
self.mini | 小程序driver,链接开发者工具 |
self.app | 小程序 |
self.page | 小程序当前页 |
self.native | 微信的原生控件 |
MiniTest 小程序云测
MiniTest 小程序云测是一套由微信测试团队自主研发,联合 WeTest 云真机能力,共同推出的小程序自动化测试服务。
服务基于云真机,支持开发者简单快捷地实现小程序智能化 Monkey 测试,录制回放,自定义测试和性能分析等能力。
常见命令
命令 | 含义 |
---|---|
-h | --help: 使用帮助。 |
-v | --version: 查看 minium 的版本。 |
-p PATH/--path | PATH: 用例所在的文件夹,默认当前路径。 |
-m MODULE_PATH | --module MODULE_PATH: 用例的包名或者文件名。 |
--case | CASENAME: test开头的用例名。 |
-s SUITE | --suite SUITE:测试计划文件。 |
-c CONFIG | --config CONFIG:配置文件名,配置项目参考配置文件。 |
-g | --generate: 生成网页测试报告。 |
--module_search_path | SYS_PATH_LIST SYS_PATH_LIST ...: 添加 module 的搜索路径。 |
-a | --accounts: 查看开发者工具当前登录的多账号, 需要通过 9420 端口,以自动化模式打开开发者工具。 |
--mode | RUN_MODE: 选择以parallel(并行)或者fork(复刻)的方式运行用例。 |
miniprogram-automator 常见api
在当前page页面里面获取元素 Element
<a href="https://developers.weixin.qq.com/miniprogram/dev/devtools/auto/element.html">详细参考微信自动化文档</a>
api | 注解 |
---|---|
element.$ | 在元素范围内获取元素。 |
element.$$ | 在元素范围内获取元素数组。 |
element.size | 获取元素大小。 |
element.offset | 获取元素绝对位置。 |
element.text | 获取元素文本。 |
element.attribute | 获取元素特性。 |
element.property | 获取元素属性。 |
element.wxml | 获取元素 WXML。 |
element.outerWxml | 同 wxml,只是会获取到元素本身。 |
element.style | 获取元素样式值。 |
element.tap | 点击元素。 |
element.longpress | 长按元素。 |
element.touchstart | 手指开始触摸元素。 |
element.touchmove | 手指触摸元素后移动。 |
element.touchend | 手指结束触摸元素。 |
element.trigger | 触发元素事件。 |
element.input | 输入文本,仅 input、textarea 组件可以使用。 |
element.callMethod | 调用组件实例指定方法,仅自定义组件可以使用。 |
element.data | 获取组件实例渲染数据,仅自定义组件可以使用。 |
element.setData | 设置组件实例渲染数据,仅自定义组件可以使用。 |
element.callContextMethod | 调用上下文 Context 对象方法,仅 video 组件可以使用。 |
element.scrollWidth | 获取滚动宽度,仅 scroll-view 组件可以使用。 |
element.scrollHeight | 获取滚动高度,仅 scroll-view 组件可以使用。 |
element.scrollTo | 滚动到指定位置,仅 scroll-view 组件可以使用。 |
element.swipeTo | 滑动到指定滑块,仅 swiper 组件可以使用 |
element.moveTo | 移动视图容器,仅 movable-view 组件可以使用。 |
element.slideTo | 滑动到指定数值,仅 slider 组件可以使用。 |