常用示例

这里提供一些常用的测试方法示例,以帮助你更好地去使用自动化 SDK 完成测试任务。

错误处理

SDK 的方法调用有可能会抛出错误,比如 miniProgram.navigateTo('path/to/page') 在页面不存在时会出错。

在可能出错的代码上,你可以使用 try catch 进行处理,比如下面这样:

automator.launch().then(async miniProgram => {
  let page
  try {
    page = await miniProgram.navigateTo('/page/component/index')
  } catch (e) {
    // 处理出错情况
    console.log(e.message)
  }
})

模板测试

小程序的模板是由 WXML 标记语言编写的。在执行时,小程序会将模板和页面数据相结合渲染出最终的页面来。测试框架 Jest 提供了一项很棒的快照功能。利用这个特性和 SDK 提供的设置页面数据接口,你可以很轻松地测试模板文件在不同数据下渲染出来的结果是否正确。

下面是小程序示例测试接口页模板的代码示例:

const automator = require('miniprogram-automator')

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

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

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

  it('wxml', async () => {
    const element = await page.$('page')
    expect(await element.wxml()).toMatchSnapshot()
    await page.setData({
      list: []
    })
    expect(await element.wxml()).toMatchSnapshot()
  })
})

测试环境

在测试时,有时候你可能需要执行一些特殊逻辑,比如使用测试账号,或者使用不同的请求地址。这种情况我们建议在小程序代码中植入这部分代码,然后在全局对象 globalData 上设置开关,通过 SDK 提供的执行代码片段功能在测试时开启。

下面是小程序示例测试登录接口页模板的代码示例:

const automator = require('miniprogram-automator')

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

  beforeAll(async () => {
    miniProgram = await automator.launch({
      projectPath: 'path/to/miniprogram-demo'
    })
    // 直接更改全局变量
    await miniProgram.evaluate(() => {
      getApp().globalData.hasLogin = true
    })
    page = await miniProgram.reLaunch('/page/API/pages/login/login')
    await page.waitFor(500)
  })

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

  it('wxml', async () => {
    const element = await page.$('page')
    expect(await element.wxml()).toMatchSnapshot()
  })
})

伪造请求结果

在测试环境中,有时为了模拟各种情况,需要对 wx 方法调用的结果进行伪造,比如伪造地理位置、伪造请求结果等,这种情况下就可以使用 miniProgram.mockWxMethod

下面是伪造特定请求结果的代码示例:

const automator = require('miniprogram-automator')

describe('api', () => {
  let miniProgram

  beforeAll(async () => {
    miniProgram = await automator.launch({
      projectPath: 'path/to/miniprogram-demo'
    })
  })

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

  it('request', async () => {
    const mockData = [
      {
        rule: 'testRequest',
        result: {
          data: 'test',
          cookies: [],
          header: {},
          statusCode: 200,
        },
      },
    ]
    await miniProgram.mockWxMethod(
      'request',
      function(obj, data) {
        for (let i = 0, len = data.length; i < len; i++) {
          const item = data[i]
          const rule = new RegExp(item.rule)
          if (rule.test(obj.url)) {
            return item.result
          }

          // 没命中规则的真实访问后台
          return new Promise(resolve => {
            obj.success = res => resolve(res)
            obj.fail = res => resolve(res)
            this.origin(obj)
          })
        }
      },
      mockData,
    )
    
    const result = await miniProgram.callWxMethod('request', {
      url: 'https://14592619.qcloud.la/testRequest',
    })
    console.log(result.data) // -> 'test'
    await miniProgram.restoreWxMethod('request')
  })
})