UNPKG

yapi-plugin-intl-auto-test

Version:

YAPI自动化测试插件,支持在YAPI设置测试计划,历史测试结果存入ES,界面显示测试结果,自定义通知。

153 lines (132 loc) 5.01 kB
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;