UNPKG

yapi-plugin-pl-auto-test

Version:

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

248 lines (216 loc) 7.32 kB
const baseController = require('controllers/base.js'); const testPlanModel = require('../models/plan'); const yapi = require('yapi.js'); const schedule = require('../schedule'); const URL = require('url'); const interfaceColModel = require('models/interfaceCol.js'); class testPlanController extends baseController { constructor(ctx) { super(ctx); this.testPlanModel = yapi.getInst(testPlanModel); this.schedule = yapi.getInst(schedule); this.interfaceColModel = yapi.getInst(interfaceColModel); } /** * 获取项目下的测试计划 * @param {*} ctx */ async getTestPlans (ctx) { try { const projectId = ctx.params.project_id; const plans = await this.testPlanModel.findByProject(projectId) ctx.body = yapi.commons.resReturn(plans); } catch (e) { ctx.body = yapi.commons.resReturn(null, 401, e.message); } } /** * 获取项目下的测试计划覆盖到的测试集合 * @param {*} ctx */ async getTestPlanCols (ctx) { try { const projectId = ctx.params.project_id; if (!projectId) { return (ctx.body = yapi.commons.resReturn(null, 400, '项目id不能为空')); } const planOpenParam = ctx.params.plan_open; let planOpen = true; if (planOpenParam) { planOpen = planOpenParam } let results = [] const plans = await this.testPlanModel.listByFilters({ project_id: projectId, is_plan_open: planOpen },"plan_url plan_name") for (const item of plans){ const urlObj = URL.parse(item.plan_url, true); const colId = urlObj.query.id; let env = ""; for(const key of Object.keys(urlObj.query)) { if (key.startsWith("env")){ env = urlObj.query[key] continue } } if (colId && colId != ""){ const colletionId = parseInt(colId); const collection = await this.interfaceColModel.get(colletionId); if (collection) { results.push({ colName: collection.name, colId: colletionId, env: env, planName: item.plan_name, }); }else{ console.log(`自动化测试包含异常集合,将忽略。项目:${projectId}, 集合Id: ${colletionId}, 计划名称: ${item.plan_name}`); } } } ctx.body = yapi.commons.resReturn(results); } catch (e) { ctx.body = yapi.commons.resReturn(null, 40022, e.message); } } /** * 新建测试计划 * @param {*} ctx */ async saveTestPlan (ctx) { let params = ctx.request.body; params = yapi.commons.handleParams(params, { plan_name: 'string', plan_url: 'string', plan_cron: 'string', plan_result_size: 'number' }); if (!params.plan_name) { return (ctx.body = yapi.commons.resReturn(null, 400, '计划名不能为空')); } if (!params.plan_url) { return (ctx.body = yapi.commons.resReturn(null, 400, '测试链接不能为空')); } if (!params.plan_cron) { return (ctx.body = yapi.commons.resReturn(null, 400, 'Cron表达式不能为空')); } const checkRepeat = await this.testPlanModel.findByName(params.plan_name); if (checkRepeat) { return (ctx.body = yapi.commons.resReturn(null, 401, '计划名重复')); } if (params.plan_url.includes("https")){ params.plan_url = params.plan_url.replace("https","http") } const webhook = params.webhook; const webhookUrl = params.webhook_url; let webhookData = params.webhook_data; try { const data = { project_id: params.project_id, plan_name: params.plan_name, is_plan_open: params.is_plan_open, plan_cron: params.plan_cron, plan_url: params.plan_url, plan_result_size: params.plan_result_size, notice_trigger: params.notice_trigger, notifier: { target: "workWX", url: params.notifier_url }, webhook: webhook, webhook_url: webhookUrl, webhook_data: webhookData, uid: this.getUid() } const plan = await this.testPlanModel.save(data); if (data.is_plan_open) { this.schedule.addTestJob(plan._id, plan); } ctx.body = yapi.commons.resReturn(plan); } catch (e) { ctx.body = yapi.commons.resReturn(null, 401, e.message); } } /** * 更新测试计划 * @param {*} ctx */ async updateTestPlan (ctx) { let params = ctx.request.body; const id = params.id; params = yapi.commons.handleParams(params, { plan_name: 'string', plan_url: 'string', plan_cron: 'string', plan_result_size: 'number', webhook_url: 'string' }); if (!params.plan_name) { return (ctx.body = yapi.commons.resReturn(null, 400, '计划名不能为空')); } if (!params.plan_url) { return (ctx.body = yapi.commons.resReturn(null, 400, '测试链接不能为空')); } if (!params.plan_cron) { return (ctx.body = yapi.commons.resReturn(null, 400, 'Cron表达式不能为空')); } if (params.plan_url.includes("https")){ params.plan_url = params.plan_url.replace("https","http") } const webhook = params.webhook; const webhookUrl = params.webhook_url; let webhookData = params.webhook_data; const checkRepeat = await this.testPlanModel.findByName(params.plan_name); if (checkRepeat && checkRepeat._id !== id) { return (ctx.body = yapi.commons.resReturn(null, 401, '计划名重复')); } try { const data = { project_id: params.project_id, plan_name: params.plan_name, is_plan_open: params.is_plan_open, plan_cron: params.plan_cron, plan_url: params.plan_url, plan_result_size: params.plan_result_size, notice_trigger: params.notice_trigger, notifier: { target: "workWX", url: params.notifier_url }, webhook: webhook, webhook_url: webhookUrl, webhook_data: webhookData } await this.testPlanModel.update(id, data); const plan = await this.testPlanModel.find(id); //操作定时任务 if (data.is_plan_open) { this.schedule.addTestJob(id, plan); } else { this.schedule.deleteTestJob(id); } ctx.body = yapi.commons.resReturn(plan); } catch (e) { ctx.body = yapi.commons.resReturn(null, 401, e.message); } } /** * 删除测试计划 * @param {*} ctx */ async delTestPlan (ctx) { try { const id = ctx.params.id; if (!id) { return (ctx.body = yapi.commons.resReturn(null, 400, 'id不能为空')); } const result = await this.testPlanModel.del(id) this.schedule.deleteTestJob(id); ctx.body = yapi.commons.resReturn(result); } catch (e) { ctx.body = yapi.commons.resReturn(null, 402, e.message); } } } module.exports = testPlanController;