知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 小程序相關(guān) >
小程序自動(dòng)化測(cè)試優(yōu)化之wx API攔截
發(fā)表時(shí)間:2021-1-5
發(fā)布人:葵宇科技
瀏覽次數(shù):60
隨著小程序越來越被廣泛使用,我們前端的開發(fā)工作也從單純的web開發(fā),擴(kuò)大到web+小程序的跨端開發(fā)。為了提高研發(fā)效率,越來越多的web模塊需要遷移、更新,兼容小程序以實(shí)現(xiàn)跨端復(fù)用。而這些模塊也會(huì)跟隨業(yè)務(wù)進(jìn)行迭代和版本更新,這時(shí)候,我們就需要有良好的測(cè)試來保障各端模塊的可靠性。
由于我們將許多已有的web模塊遷移到小程序,web端的測(cè)試相對(duì)已經(jīng)比較完備了。因此我們需要考慮的是:
-
如何快速的將已有的web用例遷移到小程序
-
針對(duì)新模塊,如何快速編寫兩端用例。
(我們?cè)趙eb端使用的主要是Puppeteer和Jest的搭配。)
可直接移步最終方案
測(cè)試模塊類型我們目前的模塊主要是以下三種類型:
- 與環(huán)境無關(guān)的邏輯層模塊
- 與環(huán)境關(guān)聯(lián)的邏輯層模塊
- 與環(huán)境關(guān)聯(lián)的UI組件模塊
類型1的模塊由于不受環(huán)境限制,可與web共用單元測(cè)試,無需額外的測(cè)試用例開發(fā)。
類型3的模塊,由于小程序與web端差異較大,比較難實(shí)現(xiàn)復(fù)用(目前我們的web UI層主要基于React,小程序使用原生開發(fā),同時(shí)配合kbone進(jìn)行部分頁面的同構(gòu)開發(fā))。
我們這里主要針對(duì)類型2的模塊進(jìn)行測(cè)試用例的遷移。
小程序端測(cè)試工具選擇小程序官方目前提供了兩種工具來支持小程序測(cè)試:
- 組件單元測(cè)試 提供了一個(gè)測(cè)試工具集以支持自定義組件在 nodejs 單線程中運(yùn)行。
- 小程序自動(dòng)化 為開發(fā)者提供了一套通過外部腳本操控小程序的方案。
通過官方工具結(jié)合Jest, Mocha等測(cè)試框架,我們可以實(shí)現(xiàn)在小程序環(huán)境下的測(cè)試。
我們選擇了小程序自動(dòng)化。類似于在Puppeteer運(yùn)行web端的測(cè)試,我們可以通過小程序自動(dòng)化,操控開發(fā)者工具,以實(shí)現(xiàn)小程序環(huán)境下的測(cè)試。兩者的相似之處給我們實(shí)現(xiàn)測(cè)試用例的跨端遷移甚至復(fù)用提供了可能性。
如何遷移測(cè)試用例以遷移一個(gè)上報(bào)模塊的測(cè)試用例為例,如下是我們已有的一個(gè)web上報(bào)模塊測(cè)試用例。
web測(cè)試用例該用例覆蓋的路徑為:調(diào)用imlog.default.error()方法 -> 瀏覽器將發(fā)起請(qǐng)求 -> 對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn)
。
test('.error()調(diào)用正常', async done => {
const opts = {
project: 'imlogtest',
};
// 檢查上報(bào)請(qǐng)求的參數(shù)
const expector = req => {
try {
const url = req.url();
const method = req.method();
const headers = req.headers();
const body = req.postData();
const data = http://www.wxapp-union.com/JSON.parse(body);
expect(url).toBe(DEFAULT_URL); // 請(qǐng)求的url符合預(yù)期
expect(method).toBe('POST'); // 請(qǐng)求的method符合預(yù)期
expect(headers['content-type']).toBe('text/plain'); // 請(qǐng)求的contentType符合預(yù)期
expect(data.url).toBe(TEST_PAGE_URL); // 請(qǐng)求體的url字段符合預(yù)期
done();
} catch(error) {
done(error);
}
};
// 監(jiān)聽上報(bào)請(qǐng)求并校驗(yàn)參數(shù)
page.once('request', expector);
// 在瀏覽器中執(zhí)行上報(bào)
page.evaluate(
(o) => {
const reportor = window.imlog.default;
reportor.config(o);
reportor.error('test'); // 進(jìn)行上報(bào)
},
opts
);
});
復(fù)制代碼
以上主要用到了Puppeteer的Page API。
- page.evaluate 控制頁面執(zhí)行一段邏輯(執(zhí)行imlog.default.error())
- page.once('request', expector) 監(jiān)聽頁面的請(qǐng)求并獲取參數(shù)(檢測(cè)是否發(fā)起請(qǐng)求并校驗(yàn)請(qǐng)求參數(shù))
小程序自動(dòng)化給我們提供了一些類似于puppeteer的API:
- miniProgram.evaluate 控制小程序往 AppService 注入代碼片段并返回執(zhí)行結(jié)果
如果小程序能夠像Puppeteer,使用監(jiān)聽事件的形式攔截到wx API的調(diào)用參數(shù),測(cè)試用例編寫將會(huì)方便許多。我們想象的小程序用例將會(huì)是如下形式:
test('.error()調(diào)用正常', async done => {
const opts = {
project: 'imlogtest',
};
// 檢查上報(bào)請(qǐng)求的參數(shù)
const expector = req => {
try {
// diff:按照特定格式解析出小程序請(qǐng)求參數(shù)
const {url, method, headers, body, data} = parseWxReqParams(req);
expect(url).toBe(DEFAULT_URL); // 請(qǐng)求的url符合預(yù)期
expect(method).toBe('POST'); // 請(qǐng)求的method符合預(yù)期
expect(headers['content-type']).toBe('text/plain'); // 請(qǐng)求的contentType符合預(yù)期
expect(data.url).toBe(TEST_PAGE_URL); // 請(qǐng)求體的url字段符合預(yù)期
done();
} catch(error) {
done(error);
}
};
// 監(jiān)聽上報(bào)請(qǐng)求并校驗(yàn)參數(shù)
// todo: miniProgram對(duì)象支持once/on等事件方法
miniProgram.once('request', expector);
// 在小程序中執(zhí)行上報(bào)
miniProgram.evaluate(
(o) => {
// diff: 請(qǐng)求方法掛在小程序app對(duì)象上
const reportor = getApp().imlog.default;
reportor.config(o);
reportor.error('test'); // 進(jìn)行上報(bào)
},
opts
);
});
復(fù)制代碼
只要我們尋找一種方式,通過事件的形式,以miniProgram.on('api', fn)的方式監(jiān)聽到調(diào)用API時(shí)傳遞的參數(shù)。
在這種形式下,web和小程序用例的差異僅在于:
- web中page對(duì)象的操作轉(zhuǎn)移到小程序miniProgram對(duì)象完成
- web中掛載在window下的方法,小程序中掛載在app下
- web和小程序解析請(qǐng)求參數(shù)的方式不同
首先觀察miniProgram對(duì)象,通過miniprogram-automator暴露出來的MiniProgram.d.ts,可以發(fā)現(xiàn)MiniProgram類本身就繼承自EventEmitter。
import { EventEmitter } from 'events';
export default class MiniProgram extends EventEmitter {
// ...
}
復(fù)制代碼
接下來就需要尋找方法,在api調(diào)用時(shí)觸發(fā)miniProgram對(duì)象的emit方法。
有兩個(gè)自動(dòng)化API可以幫助我們實(shí)現(xiàn)這點(diǎn)。
-
miniProgram.mockWxMethod 允許我們覆蓋 wx 對(duì)象上指定方法的調(diào)用結(jié)果。
-
miniProgram.exposeFunction 在 AppService 全局暴露方法,供小程序側(cè)調(diào)用測(cè)試腳本中的方法。
此時(shí),一個(gè)大膽的想法涌上心頭
相關(guān)案例查看更多
相關(guān)閱讀
- web前端
- 云南網(wǎng)站建設(shè)首選公司
- 軟件定制
- 江蘇小程序開發(fā)
- 網(wǎng)絡(luò)公司哪家好
- 昆明做網(wǎng)站
- 網(wǎng)絡(luò)營銷
- 云南網(wǎng)站建設(shè)公司哪家好
- 云南網(wǎng)站建設(shè)方案 doc
- 云南網(wǎng)站維護(hù)
- 制作一個(gè)小程序
- 小程序用戶登錄
- 小程序定制
- 汽車報(bào)廢回收軟件
- 云南網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務(wù)
- 分銷系統(tǒng)
- 網(wǎng)站建設(shè)公司哪家好
- 云南網(wǎng)站建設(shè)靠譜公司
- 云南電商網(wǎng)站建設(shè)
- 云南小程序開發(fā)公司推薦
- 汽車報(bào)廢管理
- 排名
- 小程序表單
- 網(wǎng)站建設(shè)首頁
- 云南手機(jī)網(wǎng)站建設(shè)
- 商標(biāo)
- 云南網(wǎng)站開發(fā)哪家好
- 曲靖小程序開發(fā)
- 云南網(wǎng)站建設(shè)一條龍
- 云南小程序開發(fā)