通过前四章学习,这一章来和大家一起完善上一章的自动化测试
前置条件
- 通过前四章,已经搭建起express服务器
- 通过前四章,已经搭建好vue3界面
现在我们已经有了一个简单的自动化测试页面,通过点击页面的‘开始测试’按钮,我们向后端发送请求,后端收到后会执行puppeteer脚本,我们已经实现了首页,登录,和发布沸点的简单测试,但是只是一个简单的能判断状态的进度条而已,这一章来实现将错误信息与截图返回给前端进行展示。
puppeteer完善
首先我们实现一个方法screenshotPath,用来截取图片;将图片存在指定目录下,并返回这个路径,因为这个方法我们会用到很多次,所以将他封装起来。
// utils.js
const dayjs = require("dayjs");
function geTimeFormat(format = "YYYYMMDDHHmmss", date = new Date()) {
const _date = new dayjs(date).format(format);
return _date.toString();
}
// [min, max)
function randomFormat(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}
// 截取一个当前时间的图片放在screenshot目录下返回地址与文件名
async function screenshotPath(page) {
const screenshotPath =
"./screenshot/" + randomFormat(1, 999999) + geTimeFormat() + ".png";
await page.screenshot({
path: screenshotPath,
});
return screenshotPath
}
- 这里引入了
dayjs方便操作时间,需要npm install dayjs - 封装一个随机数用来生成随机id 然后我们在上一章已经完成的监听请求中实现截图
// 监听响应
function getResponseBody(resolve, reject) {
page.on("response", async (response) => {
if (["xhr", "fetch"].includes(response.request().resourceType())) {
if (response.url().indexOf("/short_msg/publish") >= 0) {
let body = await response.json();
console.log(body);
if (body.err_msg !== "success") {
const imgPath = await screenshotPath(page);
console.log("imgPath>>", imgPath);
body.image = "http://127.0.0.1:3000/" + imgPath;
reject(body);
} else {
resolve({err_msg: null});
}
}
}
});
}
- 这里包装好的错误格式是
{err_msg:'',iamge:''}可以扩展; body.image = "http://127.0.0.1:3000/" + imgPath;这里用的是本地服务所以大家这里写自己的端口号;home.js文件较简单只需要包装一下错误信息即可,就不额外贴代码了;
express完善
现在我们已经可以把错误信息截图,放到指定文件夹下,并返回文件名称给前端;这时需要一个静态文件目录来进行托管,使前端可以通过返回的图片路径进行访问。
// index.js
// 设置静态文件目录
app.use('/screenshot', express.static(__dirname + '/screenshot'))
注意这里的screenshot是puppeteer脚本中你指定放到的目录,这样就可以通过文件目录进行访问图片了。
ui完善
将返回信息进行解析,将返回的图片地址放在url即可
<div class="pins-steps">
<a-button type="primary" @click="clickCheckListHandle">开始测试</a-button>
<div class="step-list-box">
<a-steps :current="currentStep" size="small" :status="stepsStatus" class="step-list">
<a-step title="开始"></a-step>
<a-step title="首页测试">
<template #icon v-if="currentStep === 1 && stepsStatus !== 'error'">
<loading-outlined />
</template>
</a-step>
<a-step title="发布沸点测试" >
<template #icon v-if="currentStep === 2 && stepsStatus !== 'error'">
<loading-outlined />
</template>
</a-step>
</a-steps>
<div v-if="errInfo.length" class="err-box">
<div>错误信息:</div>
<div v-for="(item, index) in errInfo" :key="index">
<div>
{{item.err_msg}}
</div>
<div>
<img :src="item.image">
</div>
</div>
</div>
</div>
</div>
成果展示
这样我们就实现了一个完整的自动化测试,大家可以根据这个例子继续扩展,比如文章的自动化发布测试等等,后面待实现的功能:
- 使用websocket实现消息交互
- 实现多条测试用例并行执行
- ui界面展示更加友好