微信小程序自动化测试之路

news2024/11/28 14:28:58

1. 前言

    在每次发布新版本之前、都需要回归核心功能、已确保上线后小程序也能按照预期运行. 目前这部分回归工作是由测试同事手工去验证测试用例、按照每周一版本的迭代节奏、回归就花了测试挺多时间的.
最近前端工作比较轻松、故在思考能否把这部分重复的工作交给程序自动来进行呢、省时省力。

2. 何谓小程序自动化

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

大白话翻译就是: 让开发者工具能按照代码的执行顺序自动在页面上完成点击、输入等操作(即模拟用户操作), 再将操作后的页面表现与预期想要的结果做对比得到测试结论(断言).
官网链接: developers.weixin.qq.com/miniprogram…
小程序自动化测试SDK: www.npmjs.com/package/min…

小程序自动化测试SDK具备的特性:
A. 控制小程序跳转到指定页面;
B. 获取小程序页面数据;
C. 获取小程序页面元素状态;
D. 触发小程序元素绑定事件;
E. 往AppService注入代码片段;
F. 调用wx对象上任意接口;
G. ...

3. 小程序自动化SDK【文末免费分享全套自动化测试学习资源】

3.1 运行环境

A. 安装Node.js并且版本大于8.0;
B. 基础库版本为2.7.3及以上;
C. 开发者工具版本为1.02.1907232及以上;
D. 要做自动化测试的项目(后面会介绍哦);
如何查看&修改基础库版本、请见下图.


如何查看开发者工具版本、请见下图.
需要做自动化测试的项目(3选1):
A. 借助微信开发者工具新建个项目;
B. 开发者可直接从github下载小程序官方组件源码下来(小程序官方组件源码git地址: github.com/wechat-mini…);
C. 真实的项目;
在本篇文章中、为尽可能直白讲清楚实践步骤、采取方案A新建个项目(下文所有的演示都是基于该项目).
先来看看大概的一个目录结构如下: 若具备以上运行环境了、请继续往下看.

3.2 安装自动化测试SDK

Tips: cd 进入到项目根目录下, 终端执行如下命令。

npm i miniprogram-automator --save-dev
复制代码

带--save-dev跟不带的区别, 详细见下文: juejin.cn/post/684490…
该命令执行成功后、在终端会输出如下内容、说明安装成功.

终端也有些warn告警、暂不影响使用、故先不处理。

3.3 初体验

A. 开启工具安全设置中的CLI/HTTP调用功能。
具体操作指南如下: 打开微信开发者工具->设置-> 安全设置 -> 启用服务端口.


有关于CLI/HTTP功能的详细介绍、请戳此链接: developers.weixin.qq.com/miniprogram…

B. 先准备个需要做自动化测试的页面(为方便、下面会以最简单的demo来演示)

// 想要测试的页面index
// index.wxml
<view class="usermotto">
  <text class="user-motto" bind:tap="tapFn">{{motto}}</text>
</view>

// index.js
// 获取应用实例
const app = getApp()

Page({
  data: {
    motto: 'Hello World',
  },
  tapFn (e) {
    console.log(e,'测试自动化结果')
  }
})

// index.wxss
.usermotto {
  margin-top: 200px;
  text-align: center;
}
复制代码

C. 在项目中新建文件、以.spec.js结尾(本文以在项目根目录下新建index.spce.js为例子), 输入类似如下内容(在实际过程中根据自己的项目修改即可)

const automator = require('miniprogram-automator')

automator.launch({
  cliPath: '/Applications/wechatwebdevtools.app/Contents/MacOS/cli', // 工具 cli 位置,如果你没有更改过默认安装位置,可以忽略此项
  projectPath: '/Users/susan.li/files/mini-demo', // 项目文件地址
}).then(async miniProgram => {
  const page = await miniProgram.reLaunch('/pages/index/index')
  await page.waitFor(500)
  const element = await page.$('.user-motto')
  console.log(await element.attribute('class'))
  await element.tap()

  await miniProgram.close()
})
复制代码

这里有3个点需要注意:
1.修改cli工具的路径(若您没更改过微信开发者工具的默认安装路径、可忽略此项、若改过安装路径的、就需要自行寻找安装路径是什么然后补充到这);
若不清楚如何查看软件安装位置的, 请戳此链接: juejin.cn/post/697060…
2.修改项目的文件路径(这里推荐绝对路径);
3.修改下面demo中实际想要操作的元素;

D.在终端输入如下命令、就在执行自动化测试结果了。

node index.spec.js
复制代码

我们来看看命令执行的全过程.
这里需要留意一点, 在自动化测试启动微信开发者工具时、留意右侧是否出现下图内容[启动自动化端口].

紧接着我们看看开发者工具是否有打印出相关内容 最后我们再看看终端, 你会发现终端会输出如下内容, 跟你代码的预期是符合的. 本演示demo想实现的是: 通过自动化测试SDK模拟用户点击Hello World文本(tap操作)、看能否正常执行bindtap里面的方法.
Question: 若在执行node index.spec.js中遇到如下报错, 是什么原因讷?

(node:2903) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'attribute' of null
    at automator.launch.then (/xxx/index.spec.js:38:29)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:2903) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)

(node:2903) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
复制代码

至此、小程序自动化测试算是开了个头, 请接着往下看.

B. 执行如下命令全局安装Jest框架

npm i jest -g
复制代码

在安装过程中、遇到了如下报错:


根据报错提示、应该是权限不够, 故执行如下命令(实际过程开发者可根据自身报错去处理)

// 看看命令行、应该会提示你要输入密码。
sudo npm i jest -g
复制代码

C. 开启工具安全设置中的CLI/HTTP调用功能(同2.4打开步骤)

至此, Jest测试框架已搭建完成, 可进入到下一步.

4.2 Jest初体验

A. 编写脚本(目标: 自动启动微信开发者工具&&打开该项目)

const automator = require('miniprogram-automator')
describe('index', () => {
  let miniProgram
  let page

  beforeAll(async () => {
    miniProgram = await automator.launch({
      projectPath: '/Users/susan.li/files/shop-mini',
      cliPath: '/Applications/wechatwebdevtools.app/Contents/MacOS/cli'
    })
    page = await miniProgram.reLaunch('/pages/index/index')
    await page.waitFor(5000)
  }, 30000)

  afterAll(async () => {
    await miniProgram.close()
  })
})
复制代码

B. 开启工具安全设置中的CLI/HTTP调用功能(同2.4打开步骤)
C. 关闭后、重新启动小程序到首页
D. 关闭工具安全设置中的CLI/HTTP调用功能(同2.4打开步骤)并关闭微信开发者工具
E. 在项目根目录下, 执行如下脚本

jest index.spec.js
复制代码

哎呀妈呀, 报错了, look look.


解决方案: 在项目目录下执行如下命令.

npm init
复制代码

安装完成后、项目根目录下就多了package.json文件了.


那我们再次执行E步骤:哎呀妈呀, 再次报错了, look look. 报错解析: 脚本里面至少要包含一个测试, 即类似it('xxx', () => expect('xxx').toBe('xxx'))的代码, 详细用法可以搜索下jest测试框架的教程.
解决方案: 加上至少一个测试用例(下面例子演示的是模拟文本的tap事件)。
最终的脚本代码如下:

const automator = require('miniprogram-automator')
describe('index', () => {
  let miniProgram
  let page

  beforeAll(async () => {
    miniProgram = await automator.launch({
      projectPath: '/Users/susan.li/files/mini-demo',
      cliPath: '/Applications/wechatwebdevtools.app/Contents/MacOS/cli'
    })
    page = await miniProgram.reLaunch('/pages/index/index')
    await page.waitFor(5000)
  }, 30000)

  it('点击hello world文本', async () => {
      await page.waitFor(3000)
      // 通过.user-motto选择目标元素
      const tabbar = await page.$('.user-motto')
      tabbar.tap()
  })
  // afterAll(async () => {
  //   await miniProgram.close()
  // })
})
复制代码

那我们再次执行E步骤: 我们会发现、在开发者工具下有执行tap方法.

脚本执行完毕后、终端会输出如下内容、告诉执行结果:

4.3 进阶玩法

上述做法需要在代码内注入微信开发者工具的安装路径&&项目路径, 不同项目成员内的配置是不同、那我们思考下能否做成隔离的?
即项目本身只维护测试用例脚本、至于在哪里执行脚本、执行的项目目录是什么、由开发者自行决定.

通过命令打开开发版微信开发者工具的自动化接口并连接自动化接口。 A. 找到微信开发者工具安装目录, 在该目录终端下输入如下命令:

// 进入微信开发者工具的安装目录(笔者的目录结构是: /Applications/wechatwebdevtools.app) -> /微信开发者工具安装目录/Contents/MacOS
cd /Applications/wechatwebdevtools.app/Contents/MacOS
// 找到要执行自动化测试的目录(笔者项目路径是:/Users/susan.li/files/mini-demo)
cli --auto /Users/susan.li/files/mini-demo --auto-port 9420
复制代码

Tips: 自动化端口是独立于服务端口的(你在开发者工具->设置->安全->打印出来的52968其实是服务器端口); 我们需要在终端看到如下提示才意味着成功打开了自动化端口(9420)

// 要看到这句话、这句话很关键!!!!!!
✔ Open project with automation enabled success /Users/susan.li/files/mini-demo
复制代码

我们看看实际效果图:


命令运行成功后、会自动打开开发者工具&项目、并在右上角有如下提示.
B. 找到自动化测试的项目根目录下, 执行如下命令安装SDK(若已安装、可忽略)

// 若需要安装、安装命令如下:
npm i miniprogram-automator --save-dev
复制代码

C. 引入自动化测试SDK, 在脚本中连接自动化操作端口

const automator = require('miniprogram-automator');

const miniProgram = automator.connect({
  wsEndpoint: 'ws://localhost:9420',
})
复制代码

D. 根据业务需要编写对应的脚本并进行相关操作

const automator = require('miniprogram-automator')

describe('index', () => {
  let miniProgram
  // 运行测试前调用、启用自动化端口9420
  beforeAll(async () => {
    miniProgram = await automator.connect({
      wsEndpoint: 'ws://localhost:9420',
    })
  })
  // 运行测试后调用
  afterAll(() => {
    miniProgram.disconnect();
  })
  // 自动化测试内容
  it('点击hello world文本', async () => {
    // 获取页面相关信息
    const page = await miniProgram.reLaunch('/pages/index/index')
    // 通过.user-motto选择目标元素
    const tabbar = await page.$('.user-motto')
    // 模拟tap事件
    tabbar.tap()
  })
})
复制代码

E. 脚本准备完毕、执行如下命令做自动化测试(保持微笑开发者工具是打开的状态)

jest index.spec.js
复制代码

若测试通过、在终端会有如下PASS提示,结果如图所示:

5. 写在最后

      作为电商类小程序, 保障线上业务的稳定运行、要求各页面各模块在异常情况下进行适当的兜底处理、确保给到用户最基础的用户体验。
此文仅作为自动化测试的初入门, 接下来会结合实际业务去做进一步梳理演示。

若有错误之处, 恳请留言, 定会及时更正!
若觉着对您有帮助的话恳请点个赞或着收藏吧!


绵薄之力

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

面试资料

我们学习软件测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

​这些资料,对于想进阶【自动化测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EhCache: 一款Java的进程内缓存框架】EhCache 是什么、代码实战 Demo

文章目录1 EhCache 是什么2 代码实战 DemoTestEH.javaehcache.xml1 EhCache 是什么 Ehcache 是一种开源的、基于标准的缓存&#xff0c;可提高性能、卸载数据库并简化可扩展性。它是最广泛使用的基于 Java 的缓存&#xff0c;因为它健壮、经过验证、功能齐全&#xff0c;并且与…

python 基于PHP+MySQL的装修网站的设计与实现

至今为止,越来越多企业公司都已经实现了线上推广,提高了企业的运营工作效率,为装修公司设计一款强大的智能装修网,集企业信息展示和信息管理于一体,结合企业与外部的在线交流功能,主要用于大力宣传企业服务、企业产品等信息,让更多的人了解,提高企业的知名度 1&#xff1a;系统…

Spring Data Neo4j(1.对象映射)

文章目录一、Spring Data Neo4j二、注释NodeIdVersion(乐观锁)PropertyRelationship一、Spring Data Neo4j Spring Data Neo4j或简称SDN是下一代Spring Data模块&#xff0c;由Neo4j&#xff0c;Inc.创建和维护。与VMware的Spring Data Team密切合作。 它支持所有官方支持的Ne…

<Linux> shell运行原理及Linux权限的理解

文章目录一、shell 命令及其运行原理shell外壳shell运行原理二、Linux 权限的概念1.用户分类2.切换用户3.用户提权三、Linux 权限管理1.文件访问者的分类&#xff08;人&#xff09;2.文件类型和访问权限&#xff08;事物属性&#xff09;四、文件权限值的表示方法1.字符表示法…

Pycharm 配置远程SSH服务器环境(切换不同虚拟环境)

1.首先在Xshell上通过conda创建新的虚拟环境 2.此时在 /home/y210101004/.conda/envs下多了刚刚创建的环境的文件夹 3.路径说明&#xff01; &#xff08;注意&#xff01;&#xff09;该环境的编译器python3.6就在.../jiayan_test/bin里面 &#xff08;注意&#xff01;&…

04.函数

一、 函数 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一个大型程序中的某部分代码&#xff0c; 由一个或多个语句块组 成。它负责完成某项特定任务…

ctfshow学习记录-misc入门(图片篇-颜色通道50-59)

目录misc50misc51misc52misc53misc54misc55misc56misc57misc58misc59misc51-52的wp和脚本参考的是csdn博主&#xff1a;z.volcano 九某人的碎碎念&#xff1a;这篇一更&#xff0c;说明近期是真的没有时间写wp了。虽说好多都是之前做过的题&#xff0c;但是wp整理起来还是比较耗…

OpenCV-Python 颜色识别(红色)并拟合矫正目标区域

OpenCV版本&#xff1a;4.6.0.66 算法实现思路&#xff1a; 颜色识别(红色)形态学去噪轮廓检测多边形拟合透视矫正代码实现&#xff1a; import cv2 import numpy as np# 可视化 def img_show(name, img):cv2.namedWindow(name, 0)cv2.resizeWindow(name, 1000, 500)cv2.imsh…

Java内存模型与volatile

Java内存模型 Java内存模型Java Memory Model&#xff0c;简称JMM&#xff0c;本身是一种抽象的概念并不真实存在它仅仅描述的是一组约定或规范&#xff0c;通过这组规范定义了程序中(尤其是多线程)各个变量的读写访问方式并决定一个线程对共享变量的写入何时以及如何变成对另…

白鹭群优化算法(ESOA)附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

单调区间能写成并吗?【基于间断区间的讨论】

不能。 问题 在做到一道题的时候&#xff0c;发现了两个减区间&#xff0c;于是就用并∪连接到一起了&#xff0c;但是答案是要用和连接。于是想要辨析一下这个并和和的区别。 区别 并&#xff1a;并的意思是将多个区间看成一个并起来的整体&#xff0c;在整个区间上仍然是…

按照 STAR 法则介绍自己做过的项目

大家好啊&#xff0c;我是大田 介绍项目注意两点&#xff1a;1、自己真的做过 2、逻辑表达能力 为什么推荐你用 STAR 法则说呢&#xff1f; STAR 法则是结构化面试中非常重要的理论。 面试官通过这样的描述全面了解你的测试知识、经验、技术能力的掌握程度&#xff0c;通过你发…

本地pycharm连接到远程服务器(超级详细)

本地pycharm连接到远程服务器&#xff08;超级详细&#xff09; 文章之前&#xff0c;你需要做的是 1.服务器需要创建好虚拟环境 2.你的本地安装好pycharm 目的是 同步服务器上的文件 在本地进行debug&#xff0c;并将修改后的文件进行更新 一般是将文件代码上传到服务器上面&…

【微服务】Sentinel 控制台

目录 1. 概述 2. 启动控制台 2.1 获取 Sentinel 控制台 2.2 启动 3. 客户端接入控制台 3.1 引入JAR包 3.2 配置启动参数 3.3 触发客户端初始化 4. 查看机器列表以及健康情况 5. 监控 5.1 "簇点链路"中显示刚刚调用的资源&#xff08;单机实时&#xff09; …

猿创征文|分享一下我的日常开发工具和常用软件

1、Eclipse IDE for Java Developers 这个软件&#xff0c;个人已经用了很多年的免费 Java 开发软件。 1&#xff09;配置JDK 2&#xff09;新建项目 3&#xff09;运行使用 这里注意到有 Run As 和 Debug As ,区别就是后者是调试模式&#xff0c;你可以在代码任意处打断点跟…

element-ui中获取el-divider的组件的ref时为空

element-ui中的el-divider组件是函数式组件,所以当我尝试获取其ref时总是获取不到,因为函数式组件没有this. ![在这里插入图片描述](https://img-blog.csdnimg.cn/496711bf5c2a4dd1bee168e4e2d638d4.png)此时打印this.$refs,控制台输出: 没有h2,翻看el-divider源码发现是函数式…

C++入门学习3-指针与字符数组,函数,指针数组

c入门学习3char型指针的使用p*p*p与p与[整型指针指向整型数组]的区别指针与函数的使用指向函数的指针空指针调用函数从函数中返回指针一维数组和二维数组的类比CHAR型指针数组关于&achar型指针的使用 char型指针可以直接指向一个字符串&#xff0c;如下 char s[]{a,b,c};…

YOLO V7源码解析

1.命令行参数介绍 YOLO v7参数与YOLO v5差不多&#xff0c;我就直接将YOLO v5命令行参数搬过来了&#xff0c;偷个懒 --weights:初始权重--cfg:模型配置文件--data:数据配置文件--hyp:学习率等超参数文件--epochs:迭代次数-imgsz&#xff1a;图像大小--rect&#xff1a;长方…

多目标蜉蝣优化算法(MOMA)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

统计信号处理基础 习题解答6-6

题目 在本题中&#xff0c;我们扩展标量BLUE的结果。假定 其中θ 是待估计的未知参数&#xff0c;β 是已知常数&#xff0c;数据矢量x 的协方差矩阵是C 。在本题我们定义修正的线性估计量为 证明BLUE为&#xff1a; 另外求最小方差。 解答&#xff1a; 首先确保线性估计量是…