yapi-plugin-pl-auto-test
Version:
YAPI自动化测试插件,支持在YAPI设置测试计划,历史测试结果存入ES,界面显示测试结果,自定义通知。
248 lines (216 loc) • 7.32 kB
JavaScript
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;