小程序自动化+JEST框架测试学习总结及采坑

小程序自动化介绍

小程序自动化 SDK 为开发者提供了一套通过外部脚本操控小程序的方案,从而实现小程序自动化测试的目的。

小程序自动化特性

通过该 SDK,你可以做到以下事情:

  • 控制小程序跳转到指定页面
  • 获取小程序页面数据
  • 获取小程序页面元素状态
  • 触发小程序元素绑定事件
  • 往 AppService 注入代码片段
  • 调用 wx 对象上任意接口

运行环境

这里要注意一下,一定要满足以下条件小程序自动化SDK才能正常运行

  1. 安装Node,版本大于8.0
  2. 基础库版本为 2.7.3 及以上
  3. 开发者工具版本为 1.02.1907232 及以上

安装SDK

  npm i miniprogram-automator --save-dev

使用小程序自动化SDK

小程序自动化SDK为我们提供了Automator,MIniProgram,Page,Element四个模块的API功能,分为功能为

  • Automator 模块提供了启动及连接开发者工具的方法
  • MiniProgram 模块提供了控制小程序的方法
  • Page 模块提供了控制小程序页面的方法
  • Element 模块提供了控制小程序页面元素的方法

具体请参考小程序官方文档:小程序文档

使用JEST测试框架

小程序自动化 SDK 本身不提供测试框架。这意味着你可以将它与市面上流行的任意 Node.js 测试框架结合使用,以此来达到编写小程序测试用例的目的。

JEST具体请查阅JEST中文文档

在运行测试脚本之前需要把你的微信开发工具关闭才可以启动,否则脚本不会正常启动

连接并启动开发工具,这里有一个小坑,官方文档中给出的示例是这样的

const automator = require('miniprogram-automator')

describe('index', () => {
  let miniProgram
  let page

  beforeAll(async () => {
    miniProgram = await automator.launch({
      projectPath: 'path/to/miniprogram-demo'
    })
    page = await miniProgram.reLaunch('/page/component/index')
    await page.waitFor(500)
  }, 30000)

  afterAll(async () => {
    await miniProgram.close()
  })
})

这里automator,launch中配置的是你开发工具的路径以及你的项目路径,如果你的开发路径是默认选择的话可以不配
下面是文档截图:


automator.launch文档截图

这里按照文档的格式的话会打不开你的小程序项目,我尝试了半天最后按照下面这个路径格式打开的项目

describe('高考填报模块', () => { //describe : 创建一个将几个相关测试组合在一起的模块
    let miniProgram
    let page
    beforeAll(async () => { //运行此文件中的任何测试之前的功能
        miniProgram = await automator.launch({
            projectPath: 'C:\\project\\newWechat\\wechatMini'
        })
        page = await miniProgram.reLaunch('/pages/index/index')
        await page.waitFor(500)
    }, 300000)
    afterAll(async () => { //在所有测试结束之后
        await miniProgram.close() //断开与小程序运行时的连接并关闭项目窗口。
    })
})

启动了项目以后就可以按照小程序的自动化文档结合JEST文档来写测试代码了,这里贴一下

it('list', async () => {
  const lists = await page.$$('.kind-list-item')
  expect(lists.length).toBe(8)
  const list = await lists[0].$('.kind-list-item-hd')
  expect(await list.text()).toBe('视图容器')
})

运行测试代码,在命令行输入

jest 文件名.js

使用小程序自动化的采坑总结

1. 运行jest index.spec.js时报错

报错信息为

Failed to launch wechat web devTools, please make sure http port is open

我使用的版本:

  • node 版本为12.13.1
  • 基础库版本为2.10.0
  • 开发者工具版本为1.03.2005140

解决办法总结 :

  1. 开发工具版本问题
  • 安装 Node.js 并且版本大于 8.0
  • 基础库版本为 2.7.3 及以上
  • 开发者工具版本为 1.02.1907232 及以上
    查看一下是否满足以上3个条件

2.运行时关闭微信开发者工具

  1. 定义项目路径时出错
    1. 检查微信开发者工具是否为默认路径,
    • Mac:/Applications/wechatwebdevtools.app/Contents/MacOS/cli
    • Win:C:/Program Files (x86)/Tencent/微信web开发者工具/cli.bat
      如果不是则需要配置,我的电脑是默认路径所以没有出现问题
    1. 检查项目路径是否正确
      我是这里出现的问题,一开始我使用的路径是这样
miniProgram = await automator.launch({
    projectPath: 'C:/project/newWechat/wechatMini/wechatproject'
})

这样每次只打开了微信开发者工具就是打不开项目,后来我换成了下面这样的写法

miniProgram = await automator.launch({
    projectPath: 'C:\\project\\newWechat\\wechatMini\\wechatproject'
})

还有打开的页面,要配置为绝对路径的页面

 page = await miniProgram.reLaunch('/pages/index/index')
2. 给input加值
name.trigger("input", {"detail": {"value": "测试"}}) ---- 这个 trigger 触发控件支持的事件时,把 bind 去掉就可以了
self.page.call_method("bindKeyInput", {"detail": {"value": "测试"}}) ---- 这个通过触发控件input 事件绑定的函数
3. 添加路径时一定要是绝对路径
let miniProgram
    let page
    beforeAll(async () => { //运行此文件中的任何测试之前的功能
        miniProgram = await automator.launch({
            projectPath: 'C:\\project\\newWechat\\wechatMini'
        })

        page = await miniProgram.reLaunch('/pages/index/index')
        await page.waitFor(500)
    }, 300000)

如果不加"/"就会报错

pages/index/pages/index/indexjs
4. 获取自定义组件时的坑

获取自定义组件中的元素时返回的都是undefind,需要先打印一下父节点的wxml,会发现组件的雷鸣都加上了组件名前缀,使用这个类名就可以获取到自定义组件中的元素了

获取页面中的组件只能采用page.$()或page.$$()方法,经尝试选择器仅支持组件名和类名。无法直接获取自定义组件内部组件元素,需要在类名前增加前缀。实际项目的页面中大量使用自定义组件,对于自定义组件内部的结构判断非常不方便,只能通过wxml()方法将自定义组件内部结构打印出来才能确认内部的子组件的实际情况。且无法调用自定义组件内部的方法。

5. 获取微信wx原生组件,如:wx.showModule

小程序自动化不支持获取到wx的原生方法,但是可以通过miniProgram.mockWxMethod()方法模拟wx原生组件。

//示例代码
automator.launch().then(async miniProgram => {
  await miniProgram.mockWxMethod('showModal', {
    confirm: true,
    cancel: false
  })

  await miniProgram.mockWxMethod(
    'getStorageSync',
    function(key, defVal) {
      if (key === 'name') return 'redhoodsu'
      if (key === 'sex') return 'male'
      return defVal
    },
    'unknown',
  )
  // 调用 wx.getStorageSync('name') 返回 'redhoodsu'

  // 更改 getSystemInfo 中的 platform 字段
  await miniProgram.mockWxMethod(
    'getSystemInfo',
    function(obj, platform) {
      return new Promise(resolve => {
        // origin 指向原始方法
        this.origin({
          success(res) {
            res.platform = platform
            resolve(res)
          },
        })
      })
    },
    'test',
  )
})

文档说明截图

总结

前面就是我使用小程序SDK+JEST的一些心得,开发中有新的收获和采坑总结我也会记录在这里。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343