导出模版
This commit is contained in:
parent
98379ac9e1
commit
d65c129f3a
|
@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RequestMapping("/test/case")
|
@RequestMapping("/test/case")
|
||||||
|
@ -76,5 +77,10 @@ public class TestCaseController {
|
||||||
return testCaseService.testCaseImport(file, projectId);
|
return testCaseService.testCaseImport(file, projectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/export/template")
|
||||||
|
public void testCaseTemplateExport(HttpServletResponse response){
|
||||||
|
testCaseService.testCaseTemplateExport(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,29 @@
|
||||||
package io.metersphere.excel.domain;
|
package io.metersphere.excel.domain;
|
||||||
|
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
import com.alibaba.excel.annotation.write.style.ColumnWidth;
|
||||||
|
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.validation.constraints.NotBlank;
|
||||||
import javax.validation.constraints.Pattern;
|
import javax.validation.constraints.Pattern;
|
||||||
|
|
||||||
|
@ColumnWidth(15)
|
||||||
public class TestCaseExcelData {
|
public class TestCaseExcelData {
|
||||||
|
|
||||||
@NotBlank
|
|
||||||
@Length(max=1000)
|
|
||||||
@ExcelProperty("所属模块")
|
|
||||||
@Pattern(regexp = "^(?!.*//).*$", message = "格式不正确")
|
|
||||||
private String nodePath;
|
|
||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
@Length(max=50)
|
@Length(max=50)
|
||||||
@ExcelProperty("用例名称")
|
@ExcelProperty("用例名称")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
@NotBlank
|
||||||
|
@Length(max=1000)
|
||||||
|
@ExcelProperty("所属模块")
|
||||||
|
@ColumnWidth(30)
|
||||||
|
@Pattern(regexp = "^(?!.*//).*$", message = "格式不正确")
|
||||||
|
private String nodePath;
|
||||||
|
|
||||||
|
|
||||||
@NotBlank
|
@NotBlank
|
||||||
@ExcelProperty("用例类型")
|
@ExcelProperty("用例类型")
|
||||||
@Pattern(regexp = "(^functional$)|(^performance$)|(^api$)", message = "必须为functional、performance、api")
|
@Pattern(regexp = "(^functional$)|(^performance$)|(^api$)", message = "必须为functional、performance、api")
|
||||||
|
@ -38,18 +43,22 @@ public class TestCaseExcelData {
|
||||||
@Pattern(regexp = "(^manual$)|(^auto$)", message = "必须为manual、auto")
|
@Pattern(regexp = "(^manual$)|(^auto$)", message = "必须为manual、auto")
|
||||||
private String method;
|
private String method;
|
||||||
|
|
||||||
|
@ColumnWidth(50)
|
||||||
@ExcelProperty("前置条件")
|
@ExcelProperty("前置条件")
|
||||||
@Length(min=0, max=1000)
|
@Length(min=0, max=1000)
|
||||||
private String prerequisite;
|
private String prerequisite;
|
||||||
|
|
||||||
|
@ColumnWidth(50)
|
||||||
@ExcelProperty("备注")
|
@ExcelProperty("备注")
|
||||||
@Length(max=1000)
|
@Length(max=1000)
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
@ColumnWidth(50)
|
||||||
@ExcelProperty("步骤描述")
|
@ExcelProperty("步骤描述")
|
||||||
@Length(max=1000)
|
@Length(max=1000)
|
||||||
private String stepDesc;
|
private String stepDesc;
|
||||||
|
|
||||||
|
@ColumnWidth(50)
|
||||||
@ExcelProperty("预期结果")
|
@ExcelProperty("预期结果")
|
||||||
@Length(max=1000)
|
@Length(max=1000)
|
||||||
private String stepResult;
|
private String stepResult;
|
||||||
|
|
|
@ -6,7 +6,7 @@ import com.alibaba.excel.event.AnalysisEventListener;
|
||||||
import com.alibaba.excel.exception.ExcelAnalysisException;
|
import com.alibaba.excel.exception.ExcelAnalysisException;
|
||||||
import com.alibaba.excel.util.StringUtils;
|
import com.alibaba.excel.util.StringUtils;
|
||||||
import io.metersphere.commons.utils.LogUtil;
|
import io.metersphere.commons.utils.LogUtil;
|
||||||
import io.metersphere.excel.util.ExcelValidateHelper;
|
import io.metersphere.excel.utils.ExcelValidateHelper;
|
||||||
import io.metersphere.excel.domain.ExcelErrData;
|
import io.metersphere.excel.domain.ExcelErrData;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package io.metersphere.excel.utils;
|
||||||
|
|
||||||
|
import com.alibaba.excel.EasyExcel;
|
||||||
|
import io.metersphere.commons.utils.LogUtil;
|
||||||
|
import io.metersphere.exception.ExcelException;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class EasyExcelUtil {
|
||||||
|
|
||||||
|
public static void export(HttpServletResponse response, Class clazz, List data, String fileName, String sheetName) {
|
||||||
|
response.setContentType("application/vnd.ms-excel");
|
||||||
|
response.setCharacterEncoding("utf-8");
|
||||||
|
try {
|
||||||
|
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
|
||||||
|
EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(data);
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
LogUtil.error(e.getMessage(), e);
|
||||||
|
throw new ExcelException("不支持UTF-8编码");
|
||||||
|
} catch (IOException e) {
|
||||||
|
LogUtil.error(e.getMessage(), e);
|
||||||
|
throw new ExcelException("IO异常");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package io.metersphere.excel.util;
|
package io.metersphere.excel.utils;
|
||||||
|
|
||||||
import com.alibaba.excel.annotation.ExcelProperty;
|
import com.alibaba.excel.annotation.ExcelProperty;
|
||||||
|
|
|
@ -3,15 +3,15 @@ package io.metersphere.exception;
|
||||||
/**
|
/**
|
||||||
* @author jianxing.chen
|
* @author jianxing.chen
|
||||||
*/
|
*/
|
||||||
public class ExcelImportException extends RuntimeException {
|
public class ExcelException extends RuntimeException {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
public ExcelImportException(String message, Exception e){
|
public ExcelException(String message, Exception e){
|
||||||
super(message, e);
|
super(message, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ExcelImportException(String message){
|
public ExcelException(String message){
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import io.metersphere.base.mapper.TestPlanTestCaseMapper;
|
||||||
import io.metersphere.commons.constants.TestCaseConstants;
|
import io.metersphere.commons.constants.TestCaseConstants;
|
||||||
import io.metersphere.commons.utils.BeanUtils;
|
import io.metersphere.commons.utils.BeanUtils;
|
||||||
import io.metersphere.dto.TestCaseNodeDTO;
|
import io.metersphere.dto.TestCaseNodeDTO;
|
||||||
import io.metersphere.exception.ExcelImportException;
|
import io.metersphere.exception.ExcelException;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
@ -213,7 +213,7 @@ public class TestCaseNodeService {
|
||||||
nodePaths.forEach(path -> {
|
nodePaths.forEach(path -> {
|
||||||
|
|
||||||
if (path == null) {
|
if (path == null) {
|
||||||
throw new ExcelImportException("所属模块不能为空!");
|
throw new ExcelException("所属模块不能为空!");
|
||||||
}
|
}
|
||||||
List<String> nodeNameList = new ArrayList<>(Arrays.asList(path.split("/")));
|
List<String> nodeNameList = new ArrayList<>(Arrays.asList(path.split("/")));
|
||||||
Iterator<String> pathIterator = nodeNameList.iterator();
|
Iterator<String> pathIterator = nodeNameList.iterator();
|
||||||
|
@ -222,7 +222,7 @@ public class TestCaseNodeService {
|
||||||
String rootNodeName = null;
|
String rootNodeName = null;
|
||||||
|
|
||||||
if (nodeNameList.size() <= 1) {
|
if (nodeNameList.size() <= 1) {
|
||||||
throw new ExcelImportException("创建模块失败:" + path);
|
throw new ExcelException("创建模块失败:" + path);
|
||||||
} else {
|
} else {
|
||||||
pathIterator.next();
|
pathIterator.next();
|
||||||
pathIterator.remove();
|
pathIterator.remove();
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package io.metersphere.service;
|
package io.metersphere.service;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.excel.EasyExcel;
|
||||||
import com.alibaba.excel.EasyExcelFactory;
|
import com.alibaba.excel.EasyExcelFactory;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import io.metersphere.base.domain.*;
|
import io.metersphere.base.domain.*;
|
||||||
import io.metersphere.base.mapper.*;
|
import io.metersphere.base.mapper.*;
|
||||||
|
@ -13,6 +15,7 @@ import io.metersphere.excel.domain.ExcelResponse;
|
||||||
import io.metersphere.excel.domain.TestCaseExcelData;
|
import io.metersphere.excel.domain.TestCaseExcelData;
|
||||||
import io.metersphere.excel.listener.EasyExcelListener;
|
import io.metersphere.excel.listener.EasyExcelListener;
|
||||||
import io.metersphere.excel.listener.TestCaseDataListener;
|
import io.metersphere.excel.listener.TestCaseDataListener;
|
||||||
|
import io.metersphere.excel.utils.EasyExcelUtil;
|
||||||
import io.metersphere.user.SessionUtils;
|
import io.metersphere.user.SessionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.ibatis.session.ExecutorType;
|
import org.apache.ibatis.session.ExecutorType;
|
||||||
|
@ -23,11 +26,10 @@ import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.net.URLEncoder;
|
||||||
import java.util.Map;
|
import java.util.*;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
@ -216,4 +218,42 @@ public class TestCaseService {
|
||||||
}
|
}
|
||||||
sqlSession.flushStatements();
|
sqlSession.flushStatements();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testCaseTemplateExport(HttpServletResponse response) {
|
||||||
|
EasyExcelUtil.export(response, TestCaseExcelData.class, generateExportTemplate(), "测试用例模版", "模版");
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<TestCaseExcelData> generateExportTemplate() {
|
||||||
|
List<TestCaseExcelData> list = new ArrayList<TestCaseExcelData>();
|
||||||
|
StringBuilder path = new StringBuilder("");
|
||||||
|
List<String> types = Arrays.asList("functional", "performance", "api");
|
||||||
|
List<String> methods = Arrays.asList("manual", "auto");
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
TestCaseExcelData data = new TestCaseExcelData();
|
||||||
|
data.setName("测试用例" + i);
|
||||||
|
path.append("/" + "模块" + i);
|
||||||
|
data.setNodePath(path.toString());
|
||||||
|
data.setPriority("P" + i%4);
|
||||||
|
data.setType(types.get(i%3));
|
||||||
|
data.setMethod(methods.get(i%2));
|
||||||
|
data.setPrerequisite("前置条件选填");
|
||||||
|
data.setStepDesc("1. 每个步骤以换行分隔\n2. 步骤前可标序号\n3. 测试步骤和结果选填");
|
||||||
|
data.setStepResult("1. 每条结果以换行分隔\n2. 结果前可标序号\n3. 测试步骤和结果选填");
|
||||||
|
data.setMaintainer("admin");
|
||||||
|
data.setRemark("备注选填");
|
||||||
|
list.add(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.add(new TestCaseExcelData());
|
||||||
|
TestCaseExcelData explain = new TestCaseExcelData();
|
||||||
|
explain.setName("同一项目下测试用例名称不能重复!");
|
||||||
|
explain.setNodePath("模块名称请按照'/模块1/模块2'的格式书写; 错误格式示例:('/', '/tes//test'); 若无该模块,则自动创建模块");
|
||||||
|
explain.setType("用例类型必须为:functional、performance、api");
|
||||||
|
explain.setMethod("测试方式必须为:manual、auto");
|
||||||
|
explain.setPriority("优先级必须为:P0、P1、P2、P3");
|
||||||
|
explain.setMaintainer("维护人必须为该工作空间相关人员");
|
||||||
|
|
||||||
|
list.add(explain);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
@close="init">
|
@close="init">
|
||||||
|
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-link type="primary" class="download-template">下载模版</el-link>
|
<el-link type="primary" class="download-template"
|
||||||
|
href="/test/case/export/template">下载模版</el-link>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row>
|
<el-row>
|
||||||
|
|
Loading…
Reference in New Issue