yapi-plugin-intl-auto-test
Version:
YAPI自动化测试插件,支持在YAPI设置测试计划,历史测试结果存入ES,界面显示测试结果,自定义通知。
153 lines (132 loc) • 5.01 kB
JavaScript
const testResultController = require('./controllers/result');
const schedule = require('node-schedule');
const planModel = require('./models/plan');
const projectModel = require('../../server/models/project');
const groupModel = require('../../server/models/group');
const interfaceColModel = require('../../server/models/interfaceCol');
const resultModel = require('./models/result');
const resultController = require('./controllers/result');
const yapi = require('yapi.js');
const axios = require('axios');
const jobMap = new Map();
const logType = "intl-auto-test";
/**
* 定时执行测试计划
*/
class testSchedule extends testResultController{
constructor(ctx) {
super(ctx);
this.ctx = ctx;
this.planModel = yapi.getInst(planModel);
this.resultModel = yapi.getInst(resultModel);
this.projectModel = yapi.getInst(projectModel);
this.interfaceColModel = yapi.getInst(interfaceColModel);
this.groupModel = yapi.getInst(groupModel);
this.resultController = yapi.getInst(resultController);
this.init();
}
// 初始化定时任务
async init() {
const allPlan = await this.planModel.listAll();
for (let i = 0, len = allPlan.length; i < len; i++) {
const plan = allPlan[i];
if (plan.is_plan_open) {
this.addTestJob(plan._id, plan);
}
}
}
/**
* 添加一个测试计划
* @param {测试计划id} planId
* @param {测试计划} plan
*/
async addTestJob(planId, plan) {
// 判断是否已经存在这个任务
const jobItem = jobMap.get(planId);
if (jobItem) {
jobItem.cancel();
}
let url = plan.plan_url;
// 自动测试不支持下载
url = url.replace("download=true", "download=false");
url = url.replace("mode=html", "mode=json");
// 清空url中带的plan_id
url = url.replace(/&plan_id=\d+&/, "&")
// 替换API
url = url.replace("/api/open/run_auto_test", "/api/open/plugin/test/run");
url += `&plan_id=${planId}`;
const handlerPlan = async (planId, plan) => {
try {
const projectInfo = await this.projectModel.get(plan.project_id);
const groupInfo = await this.groupModel.get(projectInfo.group_id);
yapi.commons.log(`group:${groupInfo.group_name},project:${projectInfo.name},plan:${plan.plan_name} triggered`, logType);
// use url deprecated, directly call auto_Test to bypass ECONNREST
// const urlEncode = encodeURI(url);
// const result = await axios.get(urlEncode, {maxRedirects: 0} );
console.log("url",url)
const urlObject = new URL(url);
var ctx = {};
ctx.params = {};
ctx.params.token = urlObject.searchParams.get('token');
ctx.params.project_id = plan.project_id;
ctx.params.plan_id = planId;
ctx.params.id = +urlObject.searchParams.get('id');
ctx.params.run_descendants = ( urlObject.searchParams.get('run_descendants') === 'true' );
ctx.params.mode = "json";
ctx.params.download = false;
// disable email
ctx.params.email = true;
Object.keys(urlObject.searchParams).map(item => {
if (/env_/gi.test(item)) {
ctx.params[item] = urlObject.searchParams[item]
}
});
const result = await this.runAutoTest(ctx);
if (result.hasOwnProperty("errmsg")) {
this.saveTestLog(plan.plan_name, result.errmsg, plan.uid, plan.project_id);
yapi.commons.log(`group:${groupInfo.group_name},project:${projectInfo.name},plan:${plan.plan_name},detail:${JSON.stringify(result)}`, logType);
} else {
if (plan.plan_result_size >= 0) {
const results = await this.resultModel.findByPlan(planId);
const ids = results.map((val) => val._id).slice(plan.plan_result_size);
await this.resultModel.deleteByIds(ids);
}
}
} catch (error) { // 增加project信息
yapi.commons.log(`catch error:${error},plan:${JSON.stringify(plan)}`, logType);
}
};
const scheduleItem = schedule.scheduleJob(plan.plan_cron, async () => {
handlerPlan(planId, plan);
});
jobMap.set(planId, scheduleItem);
}
/**
* 获取测试计划
* @param {测试计划id} planId
*/
getTestJob(planId) {
return jobMap.get(planId);
}
/**
* 删除测试计划
* @param {测试计划id} planId
*/
deleteTestJob(planId) {
let jobItem = jobMap.get(planId);
if (jobItem) {
jobItem.cancel();
}
}
// 动态中添加测试结果
saveTestLog(plan, msg, uid, projectId) {
yapi.commons.saveLog({
content: `成功执行计划名为"${plan}"的自动化测试,${msg}。`,
type: 'project',
uid: uid,
username: "自动化测试",
typeid: projectId
});
}
}
module.exports = testSchedule;