목차
Background
Automation SDK
捕获用户行为
요약
위챗 애플릿 미니 프로그램 개발 소규모 프로그램 자동화 테스트에 대한 자세한 설명

소규모 프로그램 자동화 테스트에 대한 자세한 설명

Aug 21, 2020 pm 05:11 PM
미니 프로그램 오토메이션

소규모 프로그램 자동화 테스트에 대한 자세한 설명

[관련 학습 권장 사항: WeChat 미니 프로그램 튜토리얼]

Background

최근 팀에서는 미니 프로그램을 자동으로 테스트하는 도구를 만들 계획이며, 이를 통해 비즈니스 담당자가 운영 후 이전 작업을 자동으로 복원할 수 있기를 바랍니다. 미니 프로그램 경로 및 작업 중에 발생하는 예외를 캡처하여 이번 릴리스가 미니 프로그램의 기본 기능에 영향을 미치는지 여부를 확인합니다.

소규모 프로그램 자동화 테스트에 대한 자세한 설명

위의 설명은 간단해 보이지만 여전히 중간에 난관이 좀 있습니다. 첫 번째 난관은 사업 담당자가 미니 프로그램을 운영할 때 작업 경로를 기록하는 방법이고, 두 번째 난관은 휴대하는 방법입니다. 기록된 작업 경로를 축소합니다.

Automation SDK

작업 경로를 복원하는 방법은 무엇입니까? 이 문제의 경우 공식 SDK인 miniprogram-automator를 사용하는 것이 좋습니다. miniprogram-automator

小程序自动化 SDK 为开发者提供了一套通过外部脚本操控小程序的소규모 프로그램 자동화 테스트에 대한 자세한 설명,从而实现小程序自动化测试的目的。通过该 SDK,你可以做到以下事情:

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

上面的描述都来自官方文档,建议阅读后面内容之前可以先看看官方文档,当然如果之前用过 puppeteer ,也可以快速上手,api 基本一致。下面简单介绍下 SDK 的使用方式。

// 引入sdkconst automator = require('miniprogram-automator')// 启动微信开发者工具automator.launch({  // 微信开发者工具安装路径下的 cli 工具
  // Windows下为安装路径下的 cli.bat
  // MacOS下为安装路径下的 cli
  cliPath: 'path/to/cli',  // 项目地址,即要运行的小程序的路径
  projectPath: 'path/to/project',
}).then(async miniProgram => { // miniProgram 为 IDE 启动后的实例
    // 启动小程序里的 index 页面
  const page = await miniProgram.reLaunch('/page/index/index')  // 等待 500 ms
  await page.waitFor(500)  // 获取页面元素
  const element = await page.$('.main-btn')  // 点击元素
  await element.tap()    // 关闭 IDE
  await miniProgram.close()
})复制代码
로그인 후 복사

有个地方需要提醒一下:使用 SDK 之前需要开启开发者工具的服务端口,要不然会启动失败。

소규모 프로그램 자동화 테스트에 대한 자세한 설명

捕获用户行为

有了还原操作路径的办法,接下来就要解决记录操作路径的难题了。

在小程序中,并不能像 web 中通过事件冒泡的方式在 window 中捕获所有的事件,好在小程序所以的页面和组件都必须通过 PageComponent 方法来包装,所以我们可以改写这两个方法,拦截传入的方法,并判断第一个参数是否为 event 对象,以此来捕获所有的事件。

// 暂存原生方法const originPage = Pageconst originComponent = Component// 改写 PagePage = (params) => {  const names = Object.keys(params)  for (const name of names) {    // 进行方法拦截
    if (typeof obj[name] === 'function') {
      params[name] = hookMethod(name, params[name], false)
    }
  }
  originPage(params)
}// 改写 ComponentComponent = (params) => {  if (params.methods) {      const { methods } = params      const names = Object.keys(methods)      for (const name of names) {        // 进行方法拦截
        if (typeof methods[name] === 'function') {
          methods[name] = hookMethod(name, methods[name], true)
        }
      }
  }
  originComponent(params)
}const hookMethod = (name, method, isComponent) => {  return function(...args) {    const [evt] = args // 取出第一个参数
    // 判断是否为 event 对象
    if (evt && evt.target && evt.type) {      // 记录用户行为
    }    return method.apply(this, args)
  }
}复制代码
로그인 후 복사

这里的代码只是代理了所有的事件方法,并不能用来还原用户的行为,要还原用户行为还必须知道该事件类型是否是需要的,比如点击、长按、输入。

const evtTypes = [    'tap', // 点击
    'input', // 输入
    'confirm', // 回车
    'longpress' // 长按]const hookMethod = (name, method) => {  return function(...args) {    const [evt] = args // 取出第一个参数
    // 判断是否为 event 对象
    if (
      evt && evt.target && evt.type &&
      evtTypes.includes(evt.type) // 判断事件类型
    ) {      // 记录用户行为
    }    return method.apply(this, args)
  }
}复制代码
로그인 후 복사

确定事件类型之后,还需要明确点击的元素到底是哪个,但是小程序里面比较坑的地方就是,event 对象的 target 属性中,并没有元素的类名,但是可以获取元素的 dataset。

소규모 프로그램 자동화 테스트에 대한 자세한 설명

为了准确的获取元素,我们需要在构建中增加一个步骤,修改 wxml 文件,将所有元素的 class 属性复制一份到 data-className 中。

<!-- 构建前 --><view></view><view></view><!-- 构建后 --><view></view><view></view>复制代码
로그인 후 복사

但是获取到 class 之后,又会有另一个坑,小程序的自动化测试工具并不能直接获取页面里自定义组件中的元素,必须先获取自定义组件。

<!-- Page --><toast></toast><!-- Component --><view>
  <text>{{text}}</text>
  <view></view></view>复制代码
로그인 후 복사
// 如果直接查找 .toast-close 会得到 nullconst element = await page.$('.toast-close')
element.tap() // Error!// 必须先通过自定义组件的 tagName 找到自定义组件// 再从自定义组件中通过 className 查找对应元素const element = await page.$('toast .toast-close')
element.tap()复制代码
로그인 후 복사

所以我们在构建操作的时候,还需要为元素插入 tagName。

<!-- 构建前 --><view></view><toast></toast><!-- 构建后 --><view></view><toast></toast>复制代码
로그인 후 복사

现在我们可以继续愉快的记录用户行为了。

// 记录用户行为的数组const actions = [];// 添加用户行为const addAction = (type, query, value = '') => {
  actions.push({    time: Date.now(),
    type,
    query,
    value
  })
}// 代理事件方法const hookMethod = (name, method, isComponent) => {  return function(...args) {    const [evt] = args // 取出第一个参数
    // 判断是否为 event 对象
    if (
      evt && evt.target && evt.type &&
      evtTypes.includes(evt.type) // 判断事件类型
    ) {      const { type, target, detail } = evt      const { id, dataset = {} } = target        const { className = '' } = dataset        const { value = '' } = detail // input事件触发时,输入框的值
      // 记录用户行为
      let query = ''
      if (isComponent) {        // 如果是组件内的方法,需要获取当前组件的 tagName
        query = `${this.dataset.tagName} `
      }      if (id) {        // id 存在,则直接通过 id 查找元素
        query += id
      } else {        // id 不存在,才通过 className 查找元素
        query += className
      }
      addAction(type, query, value)
    }    return method.apply(this, args)
  }
}复制代码
로그인 후 복사

到这里已经记录了用户所有的点击、输入、回车相关的操作。但是还有滚动屏幕的操作没有记录,我们可以直接代理 Page 的 onPageScroll

미니 프로그램 자동화 SDK는 개발자에게 외부 스크립트를 통해 미니 프로그램을 제어할 수 있는 솔루션 세트를 제공하여 미니 프로그램의 자동화된 테스트 목적을 달성합니다. 이 SDK를 통해 다음을 수행할 수 있습니다:

  • 미니 프로그램을 제어하여 지정된 페이지로 이동
  • 미니 프로그램 페이지 데이터 가져오기
  • 미니 가져오기 프로그램 페이지 요소 상태
  • 미니 프로그램 요소 바인딩 이벤트 트리거
  • AppService에 코드 조각 삽입
  • wx 개체에서 인터페이스 호출
  • ...
위 설명은 모두 공식 문서에서 발췌한 것입니다. 물론, 이전에 Puppeteer를 사용해 본 적이 있는 경우에도 시작하실 수 있습니다. API는 기본적으로 동일합니다. 다음은 SDK 사용방법을 간략하게 소개합니다.

// 记录用户行为的数组const actions = [];// 添加用户行为const addAction = (type, query, value = '') => {  if (type === 'scroll' || type === 'input') {    // 如果上一次行为也是滚动或输入,则重置 value 即可
    const last = this.actions[this.actions.length - 1]    if (last && last.type === type) {
      last.value = value
      last.time = Date.now()      return
    }
  }
  actions.push({    time: Date.now(),
    type,
    query,
    value
  })
}

Page = (params) => {  const names = Object.keys(params)  for (const name of names) {    // 进行方法拦截
    if (typeof obj[name] === 'function') {
      params[name] = hookMethod(name, params[name], false)
    }
  }  const { onPageScroll } = params  // 拦截滚动事件
  params.onPageScroll = function (...args) {    const [evt] = args    const { scrollTop } = evt
    addAction('scroll', '', scrollTop)
    onPageScroll.apply(this, args)
  }
  originPage(params)
}复制代码
로그인 후 복사

한 가지 주의할 점이 있습니다. SDK를 사용하기 전에 개발자 도구의 서비스 포트를 열어야 합니다. 그렇지 않으면 시작이 실패합니다.

서비스 포트 열기

🎜

사용자 행동 캡처🎜🎜작업 경로 복원 방법으로 다음 단계는 녹음 문제를 해결하는 것입니다. 작업 경로. 🎜🎜미니 프로그램에서는 웹처럼 이벤트 버블링을 통해 창에 있는 모든 이벤트를 캡처할 수는 없습니다. 다행히 미니 프로그램의 모든 페이지와 구성 요소는 페이지, 를 통과해야 합니다. 래핑할 구성 요소 메서드를 사용하여 이 두 메서드를 다시 작성하고 들어오는 메서드를 가로채고 첫 번째 매개변수가 모든 이벤트를 캡처하는 event 개체인지 확인합니다. 🎜
// 引入sdkconst automator = require('miniprogram-automator')// 用户操作行为const actions = [
  { type: 'tap', query: 'goods .title', value: '', time: 1596965650000 },
  { type: 'scroll', query: '', value: 560, time: 1596965710680 },
  { type: 'tap', query: 'gotoTop', value: '', time: 1596965770000 }
]// 启动微信开发者工具automator.launch({  projectPath: 'path/to/project',
}).then(async miniProgram => {  let page = await miniProgram.reLaunch('/page/index/index')  
  let prevTime  for (const action of actions) {    const { type, query, value, time } = action    if (prevTime) {      // 计算两次操作之间的等待时间
        await page.waitFor(time - prevTime)
    }    // 重置上次操作时间
    prevTime = time    
    // 获取当前页面实例
    page = await miniProgram.currentPage()    switch (type) {      case 'tap':            const element = await page.$(query)        await element.tap()        break;      case 'input':            const element = await page.$(query)        await element.input(value)        break;      case 'confirm':            const element = await page.$(query)                await element.trigger('confirm', { value });        break;      case 'scroll':        await miniProgram.pageScrollTo(value)        break;
    }    // 每次操作结束后,等待 5s,防止页面跳转过程中,后面的操作找不到页面
    await page.waitFor(5000)
  }    // 关闭 IDE
  await miniProgram.close()
})复制代码
로그인 후 복사
🎜여기의 코드는 모든 이벤트 메소드만을 나타내며 사용자의 행동을 복원하는 데 사용할 수 없습니다. 사용자의 행동을 복원하려면 클릭, 길게 누르기, 입력 등 이벤트 유형이 필요한지 여부도 알아야 합니다. 🎜rrreee🎜이벤트 유형을 결정한 후에도 어떤 요소가 클릭되었는지 명확히 해야 합니다. 그러나 미니 프로그램의 함정은 이벤트 개체의 대상 속성에 해당 요소의 클래스 이름이 없지만 해당 요소의 데이터 세트가 있다는 것입니다. 요소를 얻을 수 있습니다. 🎜🎜event object🎜🎜🎜🎜요소를 정확하게 얻으려면 구성 단계를 추가하고 wxml 파일을 수정한 다음 class 속성을 ​​복사해야 합니다. data-className의 모든 요소. 🎜rrreee🎜하지만 클래스를 얻은 후에는 또 다른 함정이 있습니다. 미니 프로그램의 자동화된 테스트 도구는 페이지의 사용자 정의 구성 요소를 직접 얻을 수 없습니다. 먼저 사용자 정의 구성 요소를 얻어야 합니다. 🎜rrreeerrreee🎜따라서 작업을 빌드할 때 요소에 tagName도 삽입해야 합니다. 🎜rrreee🎜이제 사용자 행동을 계속해서 즐겁게 기록할 수 있습니다. 🎜rrreee🎜지금까지 사용자의 클릭, 입력, 엔터 관련 작업이 모두 기록되었습니다. 그러나 스크롤 화면 작업은 기록되지 않습니다. Page의 onPageScroll 메서드를 직접 프록시할 수 있습니다. 🎜rrreee🎜 여기에 최적화 포인트가 있습니다. 즉, 스크롤 작업을 기록할 때 마지막 작업도 스크롤 작업인지 판단할 수 있습니다. 동일한 작업이라면 스크롤 거리만 수정하면 되기 때문입니다. 두 개의 스크롤을 한 번에 수행할 수 있습니다. 입력 이벤트도 마찬가지이며, 입력값도 한 단계로 도달할 수 있습니다. 🎜🎜사용자 행동 복원🎜🎜사용자 작업이 완료된 후 사용자 행동의 json 텍스트를 콘솔에 출력할 수 있습니다. json 텍스트를 복사한 후 자동화 도구를 통해 실행할 수 있습니다. 🎜rrreee🎜이것은 사용자의 작업 동작을 간단히 복원하는 것일 뿐입니다. 실제 작업 중에는 네트워크 요청 및 로컬 저장소 모의 작업도 포함되므로 여기서는 설명하지 않습니다. 동시에 Jest 도구에 액세스하여 사용 사례를 더 쉽게 작성할 수도 있습니다. 🎜

요약

어려워 보이는 요구 사항에 대해 주의 깊게 탐색하는 한 언제든지 해당 솔루션을 찾을 수 있습니다. 또한 WeChat 미니 프로그램의 자동화 도구에는 정말 많은 함정이 있습니다. 문제가 발생하면 먼저 미니 프로그램 커뮤니티에 가서 대부분의 함정을 찾을 수 있습니다. 현재 해결할 수 없는 문제는 피할 수 있는 다른 방법만 찾을 수 있습니다. 마지막으로, 버그 없는 세상이 되었으면 좋겠습니다.

관련 학습 권장사항: WeChat 공개 계정 개발 튜토리얼

위 내용은 소규모 프로그램 자동화 테스트에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

WeChat 미니 프로그램에서 카드 뒤집기 효과 구현 WeChat 미니 프로그램에서 카드 뒤집기 효과 구현 Nov 21, 2023 am 10:55 AM

WeChat 미니 프로그램에서 카드 뒤집기 효과 구현 WeChat 미니 프로그램에서 카드 뒤집기 효과를 구현하는 것은 사용자 경험과 인터페이스 상호 작용의 매력을 향상시킬 수 있는 일반적인 애니메이션 효과입니다. 다음은 WeChat 애플릿에서 카드 뒤집기 효과를 구현하는 방법을 자세히 소개하고 관련 코드 예제를 제공합니다. 먼저, 미니 프로그램의 페이지 레이아웃 파일에 두 개의 카드 요소를 정의해야 합니다. 하나는 앞면 내용을 표시하기 위한 것이고 다른 하나는 뒷면 내용을 표시하기 위한 것입니다. &lt;--index.wxml- -&gt;&l

SpringBoot와 SpringMVC의 차이점과 비교 이해 SpringBoot와 SpringMVC의 차이점과 비교 이해 Dec 29, 2023 am 09:20 AM

SpringBoot와 SpringMVC를 비교하고 차이점을 이해하십시오. Java 개발의 지속적인 개발로 인해 Spring 프레임워크는 많은 개발자와 기업에서 첫 번째 선택이 되었습니다. Spring 생태계에서 SpringBoot와 SpringMVC는 매우 중요한 두 가지 구성 요소입니다. 둘 다 Spring 프레임워크를 기반으로 하지만 기능과 사용법에 약간의 차이가 있습니다. 이 기사에서는 SpringBoot와 Spring을 비교하는 데 중점을 둘 것입니다.

Alipay, 희귀 문자 라이브러리를 수집하고 보완하는 '한자 따기-희귀 문자' 미니 프로그램 출시 Alipay, 희귀 문자 라이브러리를 수집하고 보완하는 '한자 따기-희귀 문자' 미니 프로그램 출시 Oct 31, 2023 pm 09:25 PM

10월 31일 이 사이트의 소식에 따르면 올해 5월 27일 Ant Group은 '한자 선택 프로젝트'를 시작한다고 발표했으며 최근 새로운 진전을 보였습니다. Alipay는 '한자 선택 - 흔하지 않은 문자' 미니 프로그램을 출시했습니다. 희귀 캐릭터는 희귀 캐릭터 라이브러리를 보완하고 희귀 캐릭터에 대한 다양한 입력 경험을 제공하여 Alipay의 희귀 캐릭터 입력 방법을 개선하는 데 도움을 줍니다. 현재 사용자는 "한자픽업", "희귀문자" 등의 키워드를 검색하여 "특수문자" 애플릿에 진입할 수 있습니다. 미니 프로그램에서 사용자는 시스템에서 인식 및 입력되지 않은 희귀 문자의 사진을 제출할 수 있으며 확인 후 Alipay 엔지니어가 글꼴 라이브러리에 추가 항목을 작성합니다. 이 웹사이트에서는 미니 프로그램에서도 최신 문자 분할 입력 방식을 경험할 수 있다고 밝혔습니다. 이 입력 방식은 발음이 불분명한 희귀 문자를 위해 설계되었습니다. 사용자 해체

PHP 지속적 통합의 Jenkins: 빌드 및 배포 자동화의 마스터 PHP 지속적 통합의 Jenkins: 빌드 및 배포 자동화의 마스터 Feb 19, 2024 pm 06:51 PM

현대 소프트웨어 개발에서 CI(지속적 통합)는 코드 품질과 개발 효율성을 향상시키는 중요한 방식이 되었습니다. 그중 Jenkins는 성숙하고 강력한 오픈 소스 CI 도구로, 특히 PHP 애플리케이션에 적합합니다. 다음 콘텐츠에서는 Jenkins를 사용하여 PHP 지속적 통합을 구현하는 방법을 살펴보고 특정 샘플 코드와 세부 단계를 제공합니다. Jenkins 설치 및 구성 먼저 Jenkins를 서버에 설치해야 합니다. 공식 웹사이트에서 최신 버전을 다운로드하여 설치하세요. 설치가 완료되면 관리자 계정 설정, 플러그인 설치, 작업 구성을 포함한 몇 가지 기본 구성이 필요합니다. 새 작업 만들기 Jenkins 대시보드에서 "새 작업" 버튼을 클릭하세요. "무료"를 선택하세요.

uniapp이 미니 프로그램과 H5 간의 빠른 전환을 달성하는 방법 uniapp이 미니 프로그램과 H5 간의 빠른 전환을 달성하는 방법 Oct 20, 2023 pm 02:12 PM

유니앱이 미니 프로그램과 H5 사이를 빠르게 전환하려면 구체적인 코드 예제가 필요합니다. 최근 모바일 인터넷의 발전과 스마트폰의 대중화로 인해 미니 프로그램과 H5는 필수 애플리케이션 형태가 되었습니다. 크로스 플랫폼 개발 프레임워크인 uniapp은 코드 세트를 기반으로 작은 프로그램과 H5 간의 변환을 신속하게 실현하여 개발 효율성을 크게 향상시킬 수 있습니다. 이 기사에서는 uniapp이 미니 프로그램과 H5 간의 신속한 변환을 달성하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 유니앱 유니아 소개

Apple 바로가기 명령 자동화를 삭제하는 방법 Apple 바로가기 명령 자동화를 삭제하는 방법 Feb 20, 2024 pm 10:36 PM

Apple 바로가기 자동화 삭제 방법 Apple의 새로운 iOS13 시스템이 출시되면서 사용자는 바로가기(Apple 바로가기)를 사용하여 다양한 휴대폰 작업을 사용자 정의하고 자동화할 수 있어 사용자의 휴대폰 경험이 크게 향상됩니다. 그러나 때로는 더 이상 필요하지 않은 일부 바로가기를 삭제해야 할 수도 있습니다. 그렇다면 Apple 단축키 명령 자동화를 삭제하는 방법은 무엇입니까? 방법 1: 바로가기 앱을 통해 삭제하세요. iPhone 또는 iPad에서 '바로가기' 앱을 엽니다. 하단 탐색 모음에서 선택

Python 스크립트를 사용하여 Linux 플랫폼에서 작업 예약 및 자동화 구현 Python 스크립트를 사용하여 Linux 플랫폼에서 작업 예약 및 자동화 구현 Oct 05, 2023 am 10:51 AM

Python 스크립트를 사용하여 Linux 플랫폼에서 작업 예약 및 자동화 구현 현대 정보 기술 환경에서 작업 예약 및 자동화는 대부분의 기업에 필수적인 도구가 되었습니다. 간단하고 배우기 쉽고 기능이 풍부한 프로그래밍 언어인 Python은 Linux 플랫폼에서 작업 예약 및 자동화를 구현하는 데 매우 편리하고 효율적입니다. Python은 작업 예약을 위한 다양한 라이브러리를 제공하며, 그 중 가장 일반적으로 사용되고 강력한 라이브러리는 crontab입니다. crontab은 관리 및 스케줄링 시스템입니다

미니프로그램 등록 조작방법 미니프로그램 등록 조작방법 Sep 13, 2023 pm 04:36 PM

미니 프로그램 등록 작업 단계: 1. 개인 ID 카드, 기업 사업자 등록증, 법인 ID 카드 및 기타 제출 자료 사본을 준비합니다. 2. 미니 프로그램 관리 배경에 로그인합니다. 4. "기본 설정"을 선택합니다. 5. 제출 정보를 입력합니다. 6. 제출 자료를 업로드합니다. 7. 제출 신청서를 제출합니다. 8. 심사 결과를 기다립니다. 제출이 통과되지 않은 경우 사유에 따라 수정합니다. 9. 제출에 대한 후속 작업은 다음과 같습니다.

See all articles