如何对小程序进行测试

发布时间:2023-05-22

一、单元测试

单元测试是对小程序不同模块、函数等独立单元进行测试,保证其有良好的功能和接口,可以提高测试的效率,并可及早发现代码的错误。

1. 测试框架

小程序的测试框架官方提供了一套名为「mina」的测试框架。mina是一款轻量、易用、灵活的小程序测试框架。mina提供了测试工具包(如WXML SnapshotTester)和测试用例BLI(编写方式形同HTML),且mina测试框架支持持续集成。使用mina可方便的实现指定目标代码文件的覆盖。

# 测试框架安装
npm install mina-test-framework -D

2. 测试实例

以计算器小程序为例进行单元测试,测试实例包括:输入数字、加法计算、减法计算

// 加法计算测试
var calc = require('../../utils/calc.js')
test('add', function() {
  expect(cal.add(1,2)).toBe(3)
  expect(cal.add(-1,2)).toBe(1)
})
// 减法计算测试
test('minus', function() {
  expect(cal.minus(1,2)).toBe(-1)
  expect(cal.minus(-1,2)).toBe(-3)
})

二、性能测试

性能测试的主要目的是衡量小程序在特定条件下的性能,并发现可能的瓶颈。性能测试可以在小程序进行开发的各个阶段进行,也能恰当地掌握不同平台的性能信息,为开发者提供数据支持,从而优化小程序。

1. 测试平台

小程序性能测试需要依赖多个测试平台。目前市面上常用的测试平台包括Top App、Rabbit Preload等。

2. 测试指标

对于小程序性能测试来说,可以考虑四个方面的指标处理: 性能测试指标1:响应时间,即完成任务的平均时间。小程序响应时间受网络状况、服务器资源、客户端硬件等因素影响。 性能测试指标2:并发能力,即同时支持的请求数量。虽然每个客户每秒发送的请求数量通常靠近或接近1秒,但是很多小程序都需要支持大量的并发请求。 性能测试指标3:稳定性,即小程序在不同时段和场景下的表现。包括短时间的高并发和持续时间较长的压力测试,以及小程序的过载估计,稳定性的测试反映出了小程序系统级能力。 性能测试指标4:吞吐量,小程序系统能够承载的最大请求数量。

三、界面测试

界面测试是小程序开发的重要测试环节,小程序的良好交互体验需要优秀的界面。在界面测试中,需要考虑以下几个方面。

1. UI自动化测试工具

目前市场上较为成熟的小程序UI自动化工具仍较少,国内常用的UI自动化工具包括「UIAutomator」、「Appium」、「Webdriver.io」等。

2. 编写测试用例

为保证测试流程的准确性和稳定性,在编写测试用例时需要注意以下几个方面: 测试对象: 小程序的每个页面对应一个wxml模板文件和wxml页面文件。在编写测试用例的时候一定要注意测试对象。 执行时序: 针对交互事件进行测试,通常是UI元素组件的点击或者滑动。 测试数据: 通过模拟输入数据进行测试,比如输入一组符合格式的用户名卡号等。

四、安全测试

安全测试是小程序开发的重要测试环节,小程序涉及到用户的隐私、财产等重要信息,在开发之初,就应该考虑安全性及其测试。

1. 安全测试类型

渗透测试: 渗透测试通过对小程序进行模拟攻击、扫描等,发现可能的安全漏洞。 代码审查: 对小程序代码进行安全检查,控制程序中的业务逻辑与安全策略的一致性、安全配置的正确性等。 加固处理: 对小程序的漏洞进行修补。

// 常见小程序的漏洞处理
function escape(str) {
  str.replace(/&/g, "&")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;")
    .replace(/`/g, "`")
  return str
}

2. 重要接口测试

检测小程序的重要接口是否可正常使用,如登陆API是否可正常使用。

// 微信小程序接口测试例子
import * as APIs from '../../../api/api'
import fetchMock from 'fetch-mock'
fetchMock.mock(APIs.MOCK_API_URL + '/wechat/hotel', 'POST', {
  data: true,
  code: 200,
  message: '查询成功'
})
APIs.searchHotel('xxx', 'xxxx').then(resp => {
  expect(resp.data).toBe(true)
})