脚本示例

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

测试对象

这里以小程序示例为测试对象,从 GitHub 上将小程序示例的源码下载到本地,然后打开小程序工具,将该项目导入进去。

初始化

新建文件夹 miniprogram-demo-test 放置测试代码,执行以下命令安装依赖:

npm i miniprogram-automator jest
npm i jest -g

按照快速开始中的使用说明安装符合要求的开发者工具版本及打开安全设置 CLI/HTTP 调用功能后就可以开始编写脚本了。

脚本编写

现在我们准备为小程序示例的首页编写测试用例,如下图所示:

miniprogram-demo-index

创建完测试文件 index.spec.js 后,首先要做的是:

  1. 启动并连接工具
  2. 重新启动小程序到首页
  3. 断开连接并关闭工具

对应脚本如下:

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()
  })
})

工具项目窗口启动初次编译需要一定时长,Jest 默认 5 秒超时太短,需修改。

1. 测试顶部描述

  1. 通过 .index-desc 选择器获取目标元素
  2. 目标元素应该是个 view 组件
  3. 目标元素应该包含有“以下将展示小程序官方组件能力”的文本

对应脚本如下:

it('desc', async () => {
  const desc = await page.$('.index-desc')
  expect(desc.tagName).toBe('view')
  expect(await desc.text()).toContain('以下将展示小程序官方组件能力')
})

2. 测试列表项

  1. 获取列表元素集合
  2. 目标元素集的个数应该是 8 个
  3. 第一个列表元素的标题应该是“视图窗器”

对应脚本如下:

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('视图容器')
})

3. 测试列表项行为

  1. 点击列表标题应该展示或隐藏子列表
  2. 点击子列表项应该会跳转到指定页面

对应脚本如下:

it('list action', async () => {
  const listHead = await page.$('.kind-list-item-hd')
  expect(await listHead.attribute('class')).toBe('kind-list-item-hd')
  await listHead.tap()
  await page.waitFor(200)
  expect(await listHead.attribute('class')).toBe(
    'kind-list-item-hd kind-list-item-hd-show',
  )
  await listHead.tap()
  await page.waitFor(200)
  expect(await listHead.attribute('class')).toBe('kind-list-item-hd')
  await listHead.tap()
  await page.waitFor(200)
  const item = await page.$('.index-bd navigator')
  await item.tap()
  await page.waitFor(500)
  expect((await miniProgram.currentPage()).path).toBe('page/component/pages/view/view')
})

脚本执行

编写完脚本后直接执行以下脚本:

jest index.spec.js

如果看到控制台输出以下信息,说明测试成功。

 PASS  ./index.spec.js (5.341s)
  index
    √ desc (18ms)
    √ list (14ms)
    √ list action (1274ms)

Test Suites: 1 passed, 1 total
Tests:       3 passed, 3 total
Snapshots:   0 total
Time:        6.378s
Ran all test suites matching /index.spec.js/i.