Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
holmes
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
QA
holmes
Commits
40055ffd
Commit
40055ffd
authored
Apr 21, 2021
by
黎博
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into jira
parents
5e68af09
18dbe672
Changes
53
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
53 changed files
with
2095 additions
and
286 deletions
+2095
-286
InterceptorConfig.java
src/main/java/cn/qg/holmes/config/InterceptorConfig.java
+1
-1
AutoModuleController.java
...va/cn/qg/holmes/controller/auto/AutoModuleController.java
+94
-0
AutoProjectController.java
...a/cn/qg/holmes/controller/auto/AutoProjectController.java
+86
-0
InterfaceController.java
...ava/cn/qg/holmes/controller/auto/InterfaceController.java
+102
-0
SceneController.java
...in/java/cn/qg/holmes/controller/auto/SceneController.java
+103
-0
SceneTestcaseController.java
...cn/qg/holmes/controller/auto/SceneTestcaseController.java
+94
-0
TestExecutionController.java
...cn/qg/holmes/controller/auto/TestExecutionController.java
+87
-0
TestReportController.java
...va/cn/qg/holmes/controller/auto/TestReportController.java
+124
-0
TestcaseController.java
...java/cn/qg/holmes/controller/auto/TestcaseController.java
+95
-0
MockController.java
...ain/java/cn/qg/holmes/controller/mock/MockController.java
+4
-0
AutoModule.java
src/main/java/cn/qg/holmes/entity/auto/AutoModule.java
+31
-0
AutoProject.java
src/main/java/cn/qg/holmes/entity/auto/AutoProject.java
+25
-0
Interface.java
src/main/java/cn/qg/holmes/entity/auto/Interface.java
+30
-0
Scene.java
src/main/java/cn/qg/holmes/entity/auto/Scene.java
+26
-0
SceneTestcase.java
src/main/java/cn/qg/holmes/entity/auto/SceneTestcase.java
+34
-0
SceneTestcaseReport.java
...in/java/cn/qg/holmes/entity/auto/SceneTestcaseReport.java
+37
-0
Testcase.java
src/main/java/cn/qg/holmes/entity/auto/Testcase.java
+34
-0
TestcaseReport.java
src/main/java/cn/qg/holmes/entity/auto/TestcaseReport.java
+35
-0
RuleEngineInterceptor.java
.../java/cn/qg/holmes/interceptor/RuleEngineInterceptor.java
+29
-27
YeebaoInterceptor.java
...main/java/cn/qg/holmes/interceptor/YeebaoInterceptor.java
+11
-5
AutoModuleMapper.java
src/main/java/cn/qg/holmes/mapper/auto/AutoModuleMapper.java
+9
-0
AutoProjectMapper.java
...main/java/cn/qg/holmes/mapper/auto/AutoProjectMapper.java
+7
-0
InterfaceMapper.java
src/main/java/cn/qg/holmes/mapper/auto/InterfaceMapper.java
+7
-0
SceneMapper.java
src/main/java/cn/qg/holmes/mapper/auto/SceneMapper.java
+7
-0
SceneTestcaseMapper.java
...in/java/cn/qg/holmes/mapper/auto/SceneTestcaseMapper.java
+9
-0
SceneTestcaseReportMapper.java
...a/cn/qg/holmes/mapper/auto/SceneTestcaseReportMapper.java
+11
-0
TestcaseMapper.java
src/main/java/cn/qg/holmes/mapper/auto/TestcaseMapper.java
+7
-0
TestcaseReportMapper.java
...n/java/cn/qg/holmes/mapper/auto/TestcaseReportMapper.java
+12
-0
AutoModuleService.java
...ain/java/cn/qg/holmes/service/auto/AutoModuleService.java
+11
-0
AutoProjectService.java
...in/java/cn/qg/holmes/service/auto/AutoProjectService.java
+8
-0
AutoUtilsService.java
...main/java/cn/qg/holmes/service/auto/AutoUtilsService.java
+16
-0
InterfaceService.java
...main/java/cn/qg/holmes/service/auto/InterfaceService.java
+7
-0
SceneService.java
src/main/java/cn/qg/holmes/service/auto/SceneService.java
+7
-0
SceneTestcaseReportService.java
...cn/qg/holmes/service/auto/SceneTestcaseReportService.java
+14
-0
SceneTestcaseService.java
.../java/cn/qg/holmes/service/auto/SceneTestcaseService.java
+12
-0
TestcaseReportService.java
...java/cn/qg/holmes/service/auto/TestcaseReportService.java
+14
-0
TestcaseService.java
src/main/java/cn/qg/holmes/service/auto/TestcaseService.java
+11
-0
AutoModuleServiceImpl.java
...cn/qg/holmes/service/auto/impl/AutoModuleServiceImpl.java
+23
-0
AutoProjectServiceImpl.java
...n/qg/holmes/service/auto/impl/AutoProjectServiceImpl.java
+12
-0
AutoUtilsServiceImpl.java
.../cn/qg/holmes/service/auto/impl/AutoUtilsServiceImpl.java
+129
-0
InterfaceServiceImpl.java
.../cn/qg/holmes/service/auto/impl/InterfaceServiceImpl.java
+11
-0
SceneServiceImpl.java
...java/cn/qg/holmes/service/auto/impl/SceneServiceImpl.java
+12
-0
SceneTestcaseReportServiceImpl.java
...mes/service/auto/impl/SceneTestcaseReportServiceImpl.java
+47
-0
SceneTestcaseServiceImpl.java
...qg/holmes/service/auto/impl/SceneTestcaseServiceImpl.java
+173
-0
TestcaseReportServiceImpl.java
...g/holmes/service/auto/impl/TestcaseReportServiceImpl.java
+47
-0
TestcaseServiceImpl.java
...a/cn/qg/holmes/service/auto/impl/TestcaseServiceImpl.java
+162
-0
BankCardUtils.java
src/main/java/cn/qg/holmes/utils/BankCardUtils.java
+3
-2
DingdingUtils.java
src/main/java/cn/qg/holmes/utils/DingdingUtils.java
+9
-4
HttpClientUtils.java
src/main/java/cn/qg/holmes/utils/HttpClientUtils.java
+159
-247
AutoModuleMapper.xml
src/main/resources/mapper/auto/AutoModuleMapper.xml
+11
-0
SceneTestcaseMapper.xml
src/main/resources/mapper/auto/SceneTestcaseMapper.xml
+12
-0
SceneTestcaseReportMapper.xml
src/main/resources/mapper/auto/SceneTestcaseReportMapper.xml
+17
-0
TestcaseReportMapper.xml
src/main/resources/mapper/auto/TestcaseReportMapper.xml
+17
-0
No files found.
src/main/java/cn/qg/holmes/config/InterceptorConfig.java
View file @
40055ffd
...
...
@@ -25,7 +25,7 @@ public class InterceptorConfig implements WebMvcConfigurer {
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
registry
.
addInterceptor
(
yeebaoInterceptor
()).
addPathPatterns
(
"/
mock/tzt-api/**"
,
"/mock
/balance-board/**"
);
registry
.
addInterceptor
(
yeebaoInterceptor
()).
addPathPatterns
(
"/
tzt-api/**"
,
"
/balance-board/**"
);
registry
.
addInterceptor
(
ruleEngineInterceptor
()).
addPathPatterns
(
"/rule_engine/**"
);
}
}
src/main/java/cn/qg/holmes/controller/auto/AutoModuleController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
cn.qg.holmes.service.auto.AutoModuleService
;
import
cn.qg.holmes.service.auto.AutoProjectService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 接口自动化模块controller
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/module"
)
public
class
AutoModuleController
{
@Autowired
AutoModuleService
autoModuleService
;
@Autowired
AutoProjectService
autoProjectService
;
/**
* 获取接口自动化模块列表
* @param pageNum 第几页
* @param pageSize 每页第几个
* @return
*/
@GetMapping
(
"/list"
)
public
JsonResult
getAutoModuleList
(
Integer
pageNum
,
Integer
pageSize
)
{
IPage
<
AutoModule
>
autoModuleIPage
=
autoModuleService
.
getAutoModuleList
(
pageNum
,
pageSize
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
autoModuleIPage
.
getTotal
());
map
.
put
(
"list"
,
autoModuleIPage
.
getRecords
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 新增模块
* @param autoModule AutoModule实体类
* @return
*/
@PostMapping
(
"/add"
)
public
JsonResult
addAutoModule
(
@RequestBody
AutoModule
autoModule
)
{
QueryWrapper
<
AutoModule
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"name"
,
autoModule
.
getName
());
if
(
autoProjectService
.
getById
(
autoModule
.
getProjectId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"所选项目不存在!"
,
false
);
}
else
if
(
autoModuleService
.
getOne
(
queryWrapper
)
!=
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"模块已存在!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
autoModuleService
.
save
(
autoModule
));
}
}
/**
* 修改模块
* @param autoModule AutoModule实体类
* @return
*/
@PostMapping
(
"/modify"
)
public
JsonResult
editAutoModule
(
@RequestBody
AutoModule
autoModule
)
{
QueryWrapper
<
AutoModule
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"name"
,
autoModule
.
getName
());
queryWrapper
.
ne
(
"id"
,
autoModule
.
getId
());
if
(
autoModuleService
.
getById
(
autoModule
.
getId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"模块不存在!"
,
false
);
}
else
if
(
autoModuleService
.
getOne
(
queryWrapper
)
!=
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"该模块名已存在!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
autoModuleService
.
updateById
(
autoModule
));
}
}
/**
* 删除模块
* @param moduleId 模块id
*/
@GetMapping
(
"/delete"
)
public
JsonResult
deleteAutoModule
(
@RequestParam
Integer
moduleId
)
{
if
(
autoModuleService
.
getById
(
moduleId
)
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"模块不存在"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
autoModuleService
.
removeById
(
moduleId
));
}
}
}
src/main/java/cn/qg/holmes/controller/auto/AutoProjectController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.AutoProject
;
import
cn.qg.holmes.service.auto.AutoProjectService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 接口自动化项目相关controller
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/project"
)
public
class
AutoProjectController
{
@Autowired
AutoProjectService
autoProjectService
;
/**
* 获取项目列表
* @param pageNum 第几页
* @param pageSize 每页数量
* @return
*/
@GetMapping
(
"/list"
)
public
JsonResult
getAutoProjectList
(
@RequestParam
Integer
pageNum
,
@RequestParam
Integer
pageSize
)
{
IPage
<
AutoProject
>
projectIPage
=
new
Page
<>(
pageNum
,
pageSize
);
IPage
<
AutoProject
>
projectPageEntity
=
autoProjectService
.
page
(
projectIPage
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"list"
,
projectPageEntity
.
getRecords
());
map
.
put
(
"total"
,
projectPageEntity
.
getTotal
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 新增项目
* @param autoProject 项目实体
* @return
*/
@PostMapping
(
"/add"
)
public
JsonResult
autoProjectAdd
(
@RequestBody
AutoProject
autoProject
)
{
// 判断项目是否已存在
QueryWrapper
<
AutoProject
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"name"
,
autoProject
.
getName
());
if
(
autoProjectService
.
getOne
(
queryWrapper
)
!=
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"该名称项目已存在!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
autoProjectService
.
save
(
autoProject
));
}
}
/**
* 修改项目
* @param autoProject 项目实体
* @return
*/
@PostMapping
(
"/modify"
)
public
JsonResult
autoProjectModify
(
@RequestBody
AutoProject
autoProject
)
{
if
(
autoProjectService
.
getById
(
autoProject
.
getId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"项目不存在"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
autoProjectService
.
updateById
(
autoProject
));
}
}
/**
* 删除项目
* @param projectId 项目id
*/
@GetMapping
(
"/delete"
)
public
JsonResult
autoProjectDelete
(
@RequestParam
Integer
projectId
)
{
if
(
autoProjectService
.
getById
(
projectId
)
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"该项目不存在!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
autoProjectService
.
removeById
(
projectId
));
}
}
}
src/main/java/cn/qg/holmes/controller/auto/InterfaceController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.Interface
;
import
cn.qg.holmes.service.auto.AutoModuleService
;
import
cn.qg.holmes.service.auto.InterfaceService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 接口相关controller
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/interface"
)
public
class
InterfaceController
{
@Autowired
InterfaceService
interfaceService
;
@Autowired
AutoModuleService
autoModuleService
;
/**
* 获取接口列表
* @param moduleId 非必传
* @param pageNum 第几页
* @param pageSize 每页数量
* @return
*/
@GetMapping
(
"/list"
)
public
JsonResult
getInterfaceList
(
Integer
moduleId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
pageNum
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
IPage
<
Interface
>
interfaceIPage
=
new
Page
<>(
pageNum
,
pageSize
);
IPage
<
Interface
>
interfaceIPageEntity
;
if
(
moduleId
!=
null
)
{
QueryWrapper
<
Interface
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"module_id"
,
moduleId
);
interfaceIPageEntity
=
interfaceService
.
page
(
interfaceIPage
,
queryWrapper
);
}
else
{
interfaceIPageEntity
=
interfaceService
.
page
(
interfaceIPage
);
}
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
interfaceIPageEntity
.
getTotal
());
map
.
put
(
"list"
,
interfaceIPageEntity
.
getRecords
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 新增接口
* @param interfaceEntity 接口类实体
* @return
*/
@PostMapping
(
"/add"
)
public
JsonResult
addInterface
(
@RequestBody
Interface
interfaceEntity
)
{
QueryWrapper
<
Interface
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"module_id"
,
interfaceEntity
.
getModuleId
());
queryWrapper
.
eq
(
"url"
,
interfaceEntity
.
getUrl
());
if
(
autoModuleService
.
getById
(
interfaceEntity
.
getModuleId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"模块不存在!"
,
false
);
}
if
(
interfaceService
.
getOne
(
queryWrapper
)
!=
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"接口已存在!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
interfaceService
.
save
(
interfaceEntity
));
}
}
/**
* 编辑接口
* @param interfaceEntity 接口实体类
* @return
*/
@PostMapping
(
"/modify"
)
public
JsonResult
modifyInterface
(
@RequestBody
Interface
interfaceEntity
)
{
if
(
interfaceService
.
getById
(
interfaceEntity
.
getId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"接口不存在!"
,
false
);
}
return
JsonResult
.
buildSuccessResult
(
interfaceService
.
updateById
(
interfaceEntity
));
}
/**
* 删除接口
* @param interfaceId 接口id
* @return
*/
@GetMapping
(
"/delete"
)
public
JsonResult
deleteInterface
(
@RequestParam
Integer
interfaceId
)
{
if
(
interfaceService
.
getById
(
interfaceId
)
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"接口不存在!"
,
false
);
}
return
JsonResult
.
buildSuccessResult
(
interfaceService
.
removeById
(
interfaceId
));
}
}
src/main/java/cn/qg/holmes/controller/auto/SceneController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.Scene
;
import
cn.qg.holmes.service.auto.AutoProjectService
;
import
cn.qg.holmes.service.auto.SceneService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 场景相关接口
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/scene"
)
public
class
SceneController
{
@Autowired
SceneService
sceneService
;
@Autowired
AutoProjectService
autoProjectService
;
/**
* 获取场景列表
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping
(
"/list"
)
public
JsonResult
getSceneList
(
Integer
projectId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
pageNum
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
IPage
<
Scene
>
page
=
new
Page
<>(
pageNum
,
pageSize
);
IPage
<
Scene
>
sceneIPage
;
if
(
projectId
==
null
)
{
sceneIPage
=
sceneService
.
page
(
page
);
}
else
{
QueryWrapper
<
Scene
>
sceneQueryWrapper
=
new
QueryWrapper
<>();
sceneQueryWrapper
.
eq
(
"project_id"
,
projectId
);
sceneIPage
=
sceneService
.
page
(
page
,
sceneQueryWrapper
);
}
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"list"
,
sceneIPage
.
getRecords
());
map
.
put
(
"total"
,
sceneIPage
.
getTotal
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 新增场景
* @param scene 场景实体
* @return
*/
@PostMapping
(
"/add"
)
public
JsonResult
addScene
(
@RequestBody
Scene
scene
)
{
if
(
scene
.
getProjectId
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"项目不允许为空!"
,
false
);
}
if
(
scene
.
getName
()
==
null
)
{
JsonResult
.
buildErrorStateResult
(
"场景名不允许为空!"
,
false
);
}
if
(
autoProjectService
.
getById
(
scene
.
getProjectId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"项目不存在!"
,
false
);
}
return
JsonResult
.
buildSuccessResult
(
sceneService
.
save
(
scene
));
}
/**
* 修改场景
* @param scene 场景实体
* @return
*/
@PostMapping
(
"/modify"
)
public
JsonResult
modifyScene
(
@RequestBody
Scene
scene
)
{
if
(
scene
.
getId
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"场景id不能为空!"
,
false
);
}
if
(
autoProjectService
.
getById
(
scene
.
getProjectId
())
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"项目不存在!"
,
false
);
}
return
JsonResult
.
buildSuccessResult
(
sceneService
.
updateById
(
scene
));
}
/**
* 删除场景
* @param sceneId 场景id
* @return
*/
@GetMapping
(
"/delete"
)
public
JsonResult
deleteScene
(
Integer
sceneId
)
{
if
(
sceneService
.
getById
(
sceneId
)
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"场景不存在!"
,
false
);
}
return
JsonResult
.
buildSuccessResult
(
sceneService
.
removeById
(
sceneId
));
}
}
src/main/java/cn/qg/holmes/controller/auto/SceneTestcaseController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.SceneTestcase
;
import
cn.qg.holmes.service.auto.SceneTestcaseService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/sceneTestcase"
)
public
class
SceneTestcaseController
{
@Autowired
SceneTestcaseService
sceneTestcaseService
;
/**
* 获取场景用例列表
* @param projectId 项目id,不传表示获取所有项目场景用例
* @param pageNum 第几页
* @param pageSize 每页展示多少个
* @return
*/
@GetMapping
(
"/list"
)
public
JsonResult
getSceneTestcaseList
(
Integer
projectId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
pageNum
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
IPage
<
SceneTestcase
>
sceneTestcaseIPage
=
sceneTestcaseService
.
getSceneTestcaseList
(
projectId
,
pageNum
,
pageSize
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
sceneTestcaseIPage
.
getTotal
());
map
.
put
(
"list"
,
sceneTestcaseIPage
.
getRecords
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 新增场景用例
* @param sceneTestcaseList 场景用例列表
* @return
*/
@PostMapping
(
"/add"
)
public
JsonResult
addSceneTestcase
(
@RequestBody
List
<
SceneTestcase
>
sceneTestcaseList
)
{
// 首先查询表里是否已有相应的数据
for
(
SceneTestcase
sceneTestcase:
sceneTestcaseList
)
{
if
(
sceneTestcase
.
getSceneId
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"场景id不能为空!"
,
false
);
}
if
(
sceneTestcase
.
getSequence
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"用例顺序不能为空!"
,
false
);
}
if
(
sceneTestcase
.
getInterfaceId
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"接口id不能为空!"
,
false
);
}
QueryWrapper
<
SceneTestcase
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"scene_id"
,
sceneTestcase
.
getSceneId
());
queryWrapper
.
eq
(
"sequence"
,
sceneTestcase
.
getSequence
());
if
(
sceneTestcaseService
.
getOne
(
queryWrapper
)
!=
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"场景用例已存在!"
,
false
);
}
}
for
(
SceneTestcase
sceneTestcase:
sceneTestcaseList
)
{
sceneTestcaseService
.
save
(
sceneTestcase
);
}
return
JsonResult
.
buildSuccessResult
(
true
);
}
/**
* 批量修改场景用例列表
* @param sceneTestcaseList 场景用例列表
* @return
*/
@PostMapping
(
"/modify"
)
public
JsonResult
modifySceneTestcase
(
@RequestBody
List
<
SceneTestcase
>
sceneTestcaseList
)
{
return
JsonResult
.
buildSuccessResult
(
sceneTestcaseService
.
updateBatchById
(
sceneTestcaseList
));
}
/**
* 删除单个场景用例
* @param sceneTestcaseId 单个场景用例id
* @return
*/
@GetMapping
(
"/delete"
)
public
JsonResult
deleteSceneTestcase
(
@RequestParam
Integer
sceneTestcaseId
)
{
if
(
sceneTestcaseService
.
getById
(
sceneTestcaseId
)
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"场景用例不存在!"
,
false
);
}
return
JsonResult
.
buildSuccessResult
(
sceneTestcaseService
.
removeById
(
sceneTestcaseId
));
}
}
src/main/java/cn/qg/holmes/controller/auto/TestExecutionController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
cn.qg.holmes.entity.auto.Scene
;
import
cn.qg.holmes.entity.auto.Testcase
;
import
cn.qg.holmes.service.auto.AutoModuleService
;
import
cn.qg.holmes.service.auto.SceneService
;
import
cn.qg.holmes.service.auto.SceneTestcaseService
;
import
cn.qg.holmes.service.auto.TestcaseService
;
import
com.alibaba.fastjson.JSON
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.text.DateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
import
java.util.Map
;
/**
* 测试用例执行controller
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/execute"
)
public
class
TestExecutionController
{
@Autowired
TestcaseService
testcaseService
;
@Autowired
SceneTestcaseService
sceneTestcaseService
;
@Autowired
SceneService
sceneService
;
@Autowired
AutoModuleService
autoModuleService
;
/**
* 执行单个用例
* @param namespace 环境
* @param testcaseId 用例id
* @return
*/
@GetMapping
(
"/testcase"
)
public
JsonResult
executeSingleTestcase
(
@RequestParam
String
namespace
,
@RequestParam
Integer
testcaseId
)
{
Testcase
testcase
=
testcaseService
.
getById
(
testcaseId
);
String
testcaseName
=
testcase
.
getName
();
Date
date
=
new
Date
();
DateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd-HH-mm-ss-SS"
);
String
batch
=
dateFormat
.
format
(
date
)
+
"_"
+
testcaseName
;
return
JsonResult
.
buildSuccessResult
(
JSON
.
parseObject
(
testcaseService
.
singleTestcaseExecutor
(
namespace
,
testcaseId
,
batch
),
Map
.
class
));
}
/**
* 执行一个模块下所有用例
* @param namespace 环境
* @param moduleId 模块id
* @return
*/
@GetMapping
(
"/module"
)
public
JsonResult
executeTestcaseByModule
(
@RequestParam
String
namespace
,
@RequestParam
Integer
moduleId
)
{
Date
date
=
new
Date
();
DateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd-HH-mm-ss-SS"
);
AutoModule
autoModule
=
autoModuleService
.
getById
(
moduleId
);
String
moduleName
=
autoModule
.
getName
();
String
batch
=
dateFormat
.
format
(
date
)
+
"_"
+
moduleName
;
return
JsonResult
.
buildSuccessResult
(
JSON
.
parseArray
(
testcaseService
.
executeTestcaseByModuleId
(
namespace
,
moduleId
,
batch
)));
}
/**
* 执行场景用例
* @param namespace 环境
* @param sceneId 场景id
* @return
*/
@GetMapping
(
"/scene"
)
public
JsonResult
executeSceneTestcase
(
String
namespace
,
Integer
sceneId
)
{
Date
date
=
new
Date
();
DateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd-HH-mm-ss-SS"
);
Scene
scene
=
sceneService
.
getById
(
sceneId
);
String
batch
=
dateFormat
.
format
(
date
)
+
"_"
+
scene
.
getName
();
return
JsonResult
.
buildSuccessResult
(
JSON
.
parseArray
(
sceneTestcaseService
.
executeSceneTestcase
(
namespace
,
sceneId
,
batch
)));
}
}
src/main/java/cn/qg/holmes/controller/auto/TestReportController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.SceneTestcaseReport
;
import
cn.qg.holmes.entity.auto.TestcaseReport
;
import
cn.qg.holmes.service.auto.SceneTestcaseReportService
;
import
cn.qg.holmes.service.auto.TestcaseReportService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* 测试报告相关接口
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/report"
)
public
class
TestReportController
{
@Autowired
TestcaseReportService
testcaseReportService
;
@Autowired
SceneTestcaseReportService
sceneTestcaseReportService
;
/**
* 根据namespace和模块id获取单接口用例batch列表
* @param namespace 环境
* @param moduleId 模块id
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping
(
"/testcase/batch/list"
)
public
JsonResult
getTestcaseReportBatchList
(
String
namespace
,
Integer
moduleId
,
Integer
pageNum
,
Integer
pageSize
)
{
IPage
<
Map
<
String
,
Object
>>
mapIPage
=
testcaseReportService
.
getTestcaseReportGroupByBatch
(
namespace
,
moduleId
,
pageNum
,
pageSize
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
mapIPage
.
getTotal
());
map
.
put
(
"list"
,
mapIPage
.
getRecords
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 根据环境和项目id获取场景batch列表
* @param namespace 环境
* @param projectId 项目id
* @param pageNum 第几页
* @param pageSize 每页多少个
* @return
*/
@GetMapping
(
"/scene/batch/list"
)
public
JsonResult
getSceneTestcaseReportBatchList
(
String
namespace
,
Integer
projectId
,
@RequestParam
Integer
pageNum
,
@RequestParam
Integer
pageSize
)
{
IPage
<
Map
<
String
,
Object
>>
sceneTestcaseReportIPage
=
sceneTestcaseReportService
.
getSceneTestcaseReportGroupByBatch
(
namespace
,
projectId
,
pageNum
,
pageSize
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
sceneTestcaseReportIPage
.
getTotal
());
map
.
put
(
"list"
,
sceneTestcaseReportIPage
.
getRecords
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
@GetMapping
(
"/testcase/list"
)
public
JsonResult
getTestcaseReportListByNamespace
(
String
namespace
,
Integer
projectId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
pageNum
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
return
JsonResult
.
buildSuccessResult
(
testcaseReportService
.
getTestcaseReportByNamespace
(
namespace
,
projectId
,
pageNum
,
pageSize
));
}
@GetMapping
(
"/scene/list"
)
public
JsonResult
getSceneTestcaseReportListByNamespace
(
String
namespace
,
Integer
moduleId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
pageNum
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
return
JsonResult
.
buildSuccessResult
(
sceneTestcaseReportService
.
getSceneTestcaseReportListByNamespace
(
namespace
,
moduleId
,
pageNum
,
pageSize
));
}
/**
* 获取testcase batch详情列表
* @param namespace 环境
* @param batch batch名
* @return
*/
@GetMapping
(
"/testcase/batch/detail"
)
public
JsonResult
getTestcaseReportBatchDetail
(
String
namespace
,
String
batch
)
{
if
(
batch
==
null
||
batch
.
isEmpty
())
{
return
JsonResult
.
buildErrorStateResult
(
"batch不能为空!"
,
false
);
}
if
(
namespace
==
null
||
namespace
.
isEmpty
())
{
return
JsonResult
.
buildErrorStateResult
(
"namespace不能为空!"
,
false
);
}
QueryWrapper
<
TestcaseReport
>
testcaseReportQueryWrapper
=
new
QueryWrapper
<>();
testcaseReportQueryWrapper
.
eq
(
"namespace"
,
namespace
);
testcaseReportQueryWrapper
.
eq
(
"batch"
,
batch
);
List
<
TestcaseReport
>
testcaseReports
=
testcaseReportService
.
list
(
testcaseReportQueryWrapper
);
return
JsonResult
.
buildSuccessResult
(
testcaseReports
);
}
/**
* 获取场景batch详情列表
* @param namespace 环境
* @param batch batch名
* @return
*/
@GetMapping
(
"/scene/batch/detail"
)
public
JsonResult
getSceneReportBatchDetail
(
String
namespace
,
String
batch
)
{
if
(
batch
==
null
||
batch
.
isEmpty
())
{
return
JsonResult
.
buildErrorStateResult
(
"batch不能为空!"
,
false
);
}
if
(
namespace
==
null
||
namespace
.
isEmpty
())
{
return
JsonResult
.
buildErrorStateResult
(
"namespace不能为空!"
,
false
);
}
QueryWrapper
<
SceneTestcaseReport
>
sceneTestcaseReportQueryWrapper
=
new
QueryWrapper
<>();
sceneTestcaseReportQueryWrapper
.
eq
(
"namespace"
,
namespace
);
sceneTestcaseReportQueryWrapper
.
eq
(
"batch"
,
batch
);
List
<
SceneTestcaseReport
>
sceneTestcaseReports
=
sceneTestcaseReportService
.
list
(
sceneTestcaseReportQueryWrapper
);
return
JsonResult
.
buildSuccessResult
(
sceneTestcaseReports
);
}
}
src/main/java/cn/qg/holmes/controller/auto/TestcaseController.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
controller
.
auto
;
import
cn.qg.holmes.common.JsonResult
;
import
cn.qg.holmes.entity.auto.Testcase
;
import
cn.qg.holmes.service.auto.TestcaseService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* 用例相关接口
* @author libo
*/
@CrossOrigin
@RestController
@RequestMapping
(
"/auto/testcase"
)
public
class
TestcaseController
{
@Autowired
TestcaseService
testcaseService
;
/**
* 获取单接口用例列表
* @param moduleId 模块id
* @param pageNum 第几页
* @param pageSize 每页数量
* @return
*/
@GetMapping
(
"/list"
)
public
JsonResult
getTestcaseList
(
Integer
moduleId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
pageNum
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
IPage
<
Testcase
>
page
=
new
Page
<>(
pageNum
,
pageSize
);
IPage
<
Testcase
>
testcaseIPageEntity
;
if
(
moduleId
!=
null
)
{
QueryWrapper
<
Testcase
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"module_id"
,
moduleId
);
testcaseIPageEntity
=
testcaseService
.
page
(
page
,
queryWrapper
);
}
else
{
testcaseIPageEntity
=
testcaseService
.
page
(
page
);
}
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
testcaseIPageEntity
.
getTotal
());
map
.
put
(
"list"
,
testcaseIPageEntity
.
getRecords
());
return
JsonResult
.
buildSuccessResult
(
map
);
}
/**
* 新增单接口用例
* @param testcase
* @return
*/
@PostMapping
(
"/add"
)
public
JsonResult
addTestcase
(
@RequestBody
Testcase
testcase
)
{
if
(
testcase
.
getName
()
==
null
||
testcase
.
getInterfaceId
()
==
null
||
testcase
.
getModuleId
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"用例名称、接口、所属模块不能为空!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
testcaseService
.
save
(
testcase
));
}
}
/**
* 编辑单接口用例
* @param testcase 单接口用例实体
* @return
*/
@PostMapping
(
"/modify"
)
public
JsonResult
modifyTestcase
(
@RequestBody
Testcase
testcase
)
{
if
(
testcase
.
getId
()
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"用例id不能为空!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
testcaseService
.
updateById
(
testcase
));
}
}
/**
* 删除测试用例
* @param testcaseId 用例id
* @return
*/
@GetMapping
(
"/delete"
)
public
JsonResult
deleteTestcase
(
@RequestParam
Integer
testcaseId
)
{
if
(
testcaseService
.
getById
(
testcaseId
)
==
null
)
{
return
JsonResult
.
buildErrorStateResult
(
"用例不存在!"
,
false
);
}
else
{
return
JsonResult
.
buildSuccessResult
(
testcaseService
.
removeById
(
testcaseId
));
}
}
}
src/main/java/cn/qg/holmes/controller/mock/MockController.java
View file @
40055ffd
...
...
@@ -15,6 +15,10 @@ import org.springframework.web.bind.annotation.*;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* Mock相关controller
* @author libo
*/
@Slf4j
@CrossOrigin
@RestController
...
...
src/main/java/cn/qg/holmes/entity/auto/AutoModule.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 接口自动化-模块实体类
* @author libo
*/
@TableName
(
value
=
"auto_module"
)
@Data
public
class
AutoModule
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
name
;
private
String
description
;
private
String
domain
;
private
Integer
projectId
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
@TableField
(
exist
=
false
)
private
String
projectName
;
}
src/main/java/cn/qg/holmes/entity/auto/AutoProject.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 项目实体类
* @author libo
*/
@Data
public
class
AutoProject
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
name
;
private
String
description
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/entity/auto/Interface.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 接口实体类
* @author libo
*/
@Data
public
class
Interface
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
name
;
private
String
url
;
private
String
method
;
private
String
headers
;
private
String
paramType
;
private
String
paramTemplate
;
private
String
responseTemplate
;
private
Integer
moduleId
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/entity/auto/Scene.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 场景实体类
* @author libo
*/
@Data
@TableName
(
"scene"
)
public
class
Scene
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
name
;
private
Integer
projectId
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/entity/auto/SceneTestcase.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 场景用例实体类
* @author libo
*/
@Data
@TableName
(
"scene_testcase"
)
public
class
SceneTestcase
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
Integer
sceneId
;
private
Integer
interfaceId
;
private
String
preAction
;
private
String
postAction
;
private
String
headers
;
private
String
parameters
;
private
String
variables
;
private
String
extract
;
private
String
validate
;
private
Integer
sequence
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/entity/auto/SceneTestcaseReport.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 场景用例报告
* @author libo
*/
@TableName
(
value
=
"scene_testcase_report"
)
@Data
public
class
SceneTestcaseReport
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
Integer
sceneId
;
private
Integer
sceneTestcaseId
;
private
String
url
;
private
String
headers
;
private
String
parameters
;
private
String
response
;
private
String
validate
;
private
String
status
;
private
Long
elapsedTime
;
private
Integer
sequence
;
private
String
batch
;
private
Integer
projectId
;
private
String
namespace
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/entity/auto/Testcase.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 单接口用例实体类
* @author libo
*/
@TableName
(
"testcase"
)
@Data
public
class
Testcase
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
String
name
;
private
Integer
interfaceId
;
private
String
preAction
;
private
String
postAction
;
private
String
headers
;
private
String
parameters
;
private
String
variables
;
private
String
extract
;
private
String
validate
;
private
Integer
moduleId
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/entity/auto/TestcaseReport.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
entity
.
auto
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
lombok.Data
;
import
java.util.Date
;
/**
* 测试报告实体类
* @author libo
*/
@TableName
(
value
=
"testcase_report"
)
@Data
public
class
TestcaseReport
{
@TableId
(
type
=
IdType
.
AUTO
)
private
Integer
id
;
private
Integer
testcaseId
;
private
String
url
;
private
String
headers
;
private
String
parameters
;
private
String
response
;
private
String
validate
;
private
String
status
;
private
Long
elapsedTime
;
private
String
batch
;
private
Integer
moduleId
;
private
String
namespace
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
createTime
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
Date
updateTime
;
}
src/main/java/cn/qg/holmes/interceptor/RuleEngineInterceptor.java
View file @
40055ffd
...
...
@@ -56,14 +56,17 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
if
(
mock
.
getFlag
()
==
1
)
{
mockData
=
mock
.
getSuccess
();
}
log
.
info
(
"收到风控接口 {} 请求,请求参数:{}"
,
uri
,
requestMap
);
if
(
uri
.
equals
(
"/rule_engine/middle_office/audit"
))
{
Map
<
String
,
Object
>
auditMap
=
JSON
.
parseObject
(
mockData
,
Map
.
class
);
Map
<
String
,
Object
>
responseMap
=
handleRiskAudit
(
requestMap
,
auditMap
);
log
.
info
(
"/rule_engine/middle_office/audit的mock响应为:{}"
,
responseMap
);
InterceptorUtils
.
constructResponse
(
response
,
JSON
.
toJSONString
(
responseMap
),
"application/json; charset=utf-8"
);
return
false
;
}
log
.
info
(
"{}的mock响应为:{}"
,
uri
,
mockData
);
InterceptorUtils
.
constructResponse
(
response
,
mockData
,
"application/json; charset=utf-8"
);
return
tru
e
;
return
fals
e
;
}
/**
...
...
@@ -116,7 +119,7 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
// vcc
String
callbackUrl
=
requestMap
.
get
(
"callbackUrl"
).
toString
();
if
(
callbackUrl
.
contains
(
"talos"
))
{
vccRiskAuthAmountCompletion
(
callbackUrl
,
bizChannel
,
uuid
,
bizNo
,
(
Integer
)
auditData
.
get
(
"vccAuditAmount"
),
(
Boolean
)
auditData
.
get
(
"vccAuditResult"
));
vccRiskAuthAmountCompletion
(
callbackUrl
,
bizChannel
,
uuid
,
bizNo
,
auditData
.
get
(
"vccAuditAmount"
).
toString
(),
auditData
.
get
(
"vccAuditResult"
).
toString
(
));
}
// 一单一审现金贷
if
(
bizType
.
equals
(
"0"
))
{
...
...
@@ -135,7 +138,7 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
}
// vcc账单分期审核, sceneId=11
if
(
bizType
.
equals
(
"8"
)
&&
sceneId
.
equals
(
"11"
))
{
bodyMap
.
put
(
"allowInstalment"
,
1
);
bodyMap
.
put
(
"allowInstalment"
,
"1"
);
bodyMap
.
put
(
"allowInstalmentTerms"
,
"3,6,9,12"
);
}
// vcc支付限额审核, sceneId=12
...
...
@@ -156,13 +159,12 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
@Nullable
ModelAndView
modelAndView
)
throws
Exception
{
log
.
info
(
"本次请求返回响应:{}"
,
response
);
@Nullable
ModelAndView
modelAndView
)
{
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
@Nullable
Exception
ex
)
throws
Exception
{
@Nullable
Exception
ex
)
{
}
/**
...
...
@@ -174,41 +176,41 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
* @param amount 授信金额
* @param auditResult 授信结果,true/false
*/
public
static
void
vccRiskAuthAmountCompletion
(
String
callbackUrl
,
String
bizChannel
,
String
uuid
,
String
riskNo
,
Integer
amount
,
boolean
auditResult
)
{
public
static
void
vccRiskAuthAmountCompletion
(
String
callbackUrl
,
String
bizChannel
,
String
uuid
,
String
riskNo
,
String
amount
,
String
auditResult
)
{
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
Calendar
.
DAY_OF_YEAR
,
calendar
.
get
(
Calendar
.
DAY_OF_YEAR
)
+
15
);
l
ong
openingDeadLine
=
calendar
.
getTimeInMillis
();
L
ong
openingDeadLine
=
calendar
.
getTimeInMillis
();
Calendar
calendar2
=
Calendar
.
getInstance
();
calendar2
.
add
(
Calendar
.
YEAR
,
1
);
Long
deadLine
=
calendar2
.
getTimeInMillis
();
Map
<
String
,
Object
>
params
=
new
HashMap
<>();
Map
<
String
,
String
>
params
=
new
HashMap
<>();
params
.
put
(
"amount"
,
amount
);
params
.
put
(
"auditResult"
,
auditResult
);
params
.
put
(
"bizChannel"
,
bizChannel
);
params
.
put
(
"bizNo"
,
riskNo
);
params
.
put
(
"code"
,
0
);
params
.
put
(
"deadLine"
,
deadLine
);
params
.
put
(
"openingDeadLine"
,
openingDeadLine
);
// 开户失败有效期
params
.
put
(
"success"
,
true
);
params
.
put
(
"code"
,
"0"
);
params
.
put
(
"deadLine"
,
deadLine
.
toString
()
);
params
.
put
(
"openingDeadLine"
,
String
.
valueOf
(
openingDeadLine
)
);
// 开户失败有效期
params
.
put
(
"success"
,
"true"
);
params
.
put
(
"uuid"
,
uuid
);
params
.
put
(
"sceneId"
,
0
);
params
.
put
(
"allowInstalment"
,
1
);
// 1-允许分期,0-不允许分期
params
.
put
(
"sceneId"
,
"0"
);
params
.
put
(
"allowInstalment"
,
"1"
);
// 1-允许分期,0-不允许分期
params
.
put
(
"allowInstalmentTerms"
,
"3,6,9,12"
);
// 允许分期的期数
Map
<
String
,
Object
>
headers
=
new
HashMap
<>();
Map
<
String
,
String
>
headers
=
new
HashMap
<>();
headers
.
put
(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
JSONObject
result
=
HttpClientUtils
.
doPost
(
callbackUrl
,
params
,
header
s
);
String
result
=
HttpClientUtils
.
doPost
(
callbackUrl
,
headers
,
param
s
);
log
.
info
(
"vcc风控授信回调参数:{}"
,
params
);
log
.
info
(
"vcc风控授信回调结果:{}"
,
result
);
}
public
static
void
quotaAuthAmountAuditNotify
(
String
callbackUrl
,
String
uuid
,
Integer
bizChannel
,
Integer
fundId
,
String
bizNo
,
Integer
bizType
,
Integer
creditAmount
,
Integer
term
,
boolean
auditResult
)
{
public
static
void
quotaAuthAmountAuditNotify
(
String
callbackUrl
,
String
uuid
,
String
bizChannel
,
String
fundId
,
String
bizNo
,
String
bizType
,
String
creditAmount
,
String
term
,
String
auditResult
)
{
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
set
(
Calendar
.
DAY_OF_YEAR
,
calendar
.
get
(
Calendar
.
DAY_OF_YEAR
)
+
30
);
Long
deadLine
=
calendar
.
getTimeInMillis
();
Map
<
String
,
Object
>
headers
=
new
HashMap
<>();
Map
<
String
,
String
>
headers
=
new
HashMap
<>();
headers
.
put
(
"Content-Type"
,
"application/x-www-form-urlencoded"
);
Map
<
String
,
Object
>
params
=
new
HashMap
<>();
params
.
put
(
"code"
,
0
);
Map
<
String
,
String
>
params
=
new
HashMap
<>();
params
.
put
(
"code"
,
"0"
);
params
.
put
(
"msg"
,
"success"
);
params
.
put
(
"bizChannel"
,
bizChannel
);
// 渠道号
params
.
put
(
"uuid"
,
uuid
);
...
...
@@ -216,16 +218,16 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
params
.
put
(
"bizType"
,
bizType
);
// 业务类型: 0-现金分期一单一审,……
params
.
put
(
"auditResult"
,
auditResult
);
params
.
put
(
"amount"
,
creditAmount
);
params
.
put
(
"deadLine"
,
deadLine
);
params
.
put
(
"deadLine"
,
String
.
valueOf
(
deadLine
)
);
params
.
put
(
"extData"
,
""
);
params
.
put
(
"otherInformation"
,
""
);
JSONArray
financeProducts
=
createFinanceProducts
(
fundId
,
term
);
params
.
put
(
"financeProducts"
,
financeProducts
);
HttpClientUtils
.
doPost
(
callbackUrl
,
params
,
header
s
);
params
.
put
(
"financeProducts"
,
JSONArray
.
toJSONString
(
financeProducts
)
);
HttpClientUtils
.
doPost
(
callbackUrl
,
headers
,
param
s
);
log
.
info
(
"现金分期风控授信回调:{}"
,
params
);
}
public
static
JSONArray
createFinanceProducts
(
Integer
fundId
,
Integer
term
)
{
public
static
JSONArray
createFinanceProducts
(
String
fundId
,
String
term
)
{
JSONArray
financeProducts
=
new
JSONArray
();
JSONObject
financeProductsObject
=
new
JSONObject
();
JSONArray
terms
=
new
JSONArray
();
...
...
@@ -241,11 +243,11 @@ public class RuleEngineInterceptor implements HandlerInterceptor {
fundInfoObject
.
put
(
"priority"
,
1
);
fundInfoObject
.
put
(
"feeType"
,
1
);
// 如果是云南信托,需要该参数
if
(
fundId
==
1040
)
{
if
(
fundId
.
equals
(
"1040"
)
)
{
fundInfoObject
.
put
(
"fundProductId"
,
1061
);
}
// 平顶山银行
if
(
fundId
==
1030
)
{
if
(
fundId
.
equals
(
"1030"
)
)
{
fundInfoObject
.
put
(
"fundProductId"
,
1060
);
}
fundInfoList
.
add
(
fundInfoObject
);
...
...
src/main/java/cn/qg/holmes/interceptor/YeebaoInterceptor.java
View file @
40055ffd
...
...
@@ -39,7 +39,7 @@ public class YeebaoInterceptor implements HandlerInterceptor {
@Override
public
boolean
preHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
)
throws
Exception
{
String
uri
=
request
.
getRequestURI
()
.
substring
(
5
)
;
String
uri
=
request
.
getRequestURI
();
Map
<
String
,
String
[]>
parameterMap
=
request
.
getParameterMap
();
QueryWrapper
<
Mock
>
queryWrapper
=
new
QueryWrapper
<>();
queryWrapper
.
eq
(
"url"
,
uri
);
...
...
@@ -63,6 +63,7 @@ public class YeebaoInterceptor implements HandlerInterceptor {
if
(
mock
.
getEncrypt
()
==
1
)
{
EncryptConvertor
encryptConvertor
=
EncryptFactory
.
produce
(
"yeebao"
);
requestMap
=
JSON
.
parseObject
(
encryptConvertor
.
decrypt
(
JSON
.
toJSONString
(
convertParameterMap
(
parameterMap
))),
Map
.
class
);
log
.
info
(
"收到{}接口请求,解密后的请求参数为:{}"
,
request
.
getRequestURI
(),
requestMap
);
// 判断返回是字符串还是json,1-json,2-字符串
if
(
mock
.
getType
()
==
1
)
{
responseMap
=
disposeResponseMap
(
requestMap
,
responseMap
);
...
...
@@ -76,37 +77,42 @@ public class YeebaoInterceptor implements HandlerInterceptor {
if
(
uri
.
equals
(
"/tzt-api/api/bindcard/confirm"
)
&&
mock
.
getFlag
()
==
1
)
{
responseMap
=
handleBindCardConfirm
(
requestMap
,
responseMap
);
}
log
.
info
(
"{}接口返回的响应为:{}"
,
request
.
getRequestURI
(),
responseMap
);
constructResponse
(
response
,
encryptConvertor
.
encrypt
(
JSON
.
toJSONString
(
responseMap
)),
"application/json; charset=utf-8"
);
}
else
if
(
mock
.
getType
()
==
2
)
{
log
.
info
(
"{}接口返回的响应为:{}"
,
request
.
getRequestURI
(),
responseStr
);
constructResponse
(
response
,
encryptConvertor
.
encrypt
(
responseStr
));
}
}
else
if
(
mock
.
getEncrypt
()
==
0
)
{
requestMap
=
convertParameterMap
(
parameterMap
);
log
.
info
(
"收到{}接口请求,请求参数为:{}"
,
request
.
getRequestURI
(),
requestMap
);
if
(
mock
.
getType
()
==
1
)
{
responseMap
=
disposeResponseMap
(
requestMap
,
responseMap
);
log
.
info
(
"{}接口返回的响应为:{}"
,
request
.
getRequestURI
(),
responseMap
);
constructResponse
(
response
,
JSON
.
toJSONString
(
responseMap
),
"application/json; charset=utf-8"
);
}
else
if
(
mock
.
getType
()
==
2
)
{
// 针对 /balance-board/transfer 接口特殊处理
if
(
uri
.
equals
(
"/balance-board/transfer"
))
{
responseStr
=
handleBalanceBoardTransfer
(
request
);
log
.
info
(
"{}接口返回的响应为:{}"
,
request
.
getRequestURI
(),
responseStr
);
constructResponse
(
response
,
responseStr
);
return
false
;
}
log
.
info
(
"{}接口返回的响应为:{}"
,
request
.
getRequestURI
(),
responseStr
);
constructResponse
(
response
,
responseStr
);
}
}
return
tru
e
;
return
fals
e
;
}
@Override
public
void
postHandle
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
@Nullable
ModelAndView
modelAndView
)
throws
Exception
{
log
.
info
(
"本次请求返回响应:{}"
,
response
);
@Nullable
ModelAndView
modelAndView
)
{
}
@Override
public
void
afterCompletion
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
,
@Nullable
Exception
ex
)
throws
Exception
{
@Nullable
Exception
ex
)
{
}
/**
...
...
src/main/java/cn/qg/holmes/mapper/auto/AutoModuleMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
public
interface
AutoModuleMapper
extends
BaseMapper
<
AutoModule
>
{
IPage
<
AutoModule
>
getAutoModuleList
(
IPage
<
AutoModule
>
page
);
}
src/main/java/cn/qg/holmes/mapper/auto/AutoProjectMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.AutoProject
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
public
interface
AutoProjectMapper
extends
BaseMapper
<
AutoProject
>
{
}
src/main/java/cn/qg/holmes/mapper/auto/InterfaceMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.Interface
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
public
interface
InterfaceMapper
extends
BaseMapper
<
Interface
>
{
}
src/main/java/cn/qg/holmes/mapper/auto/SceneMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.Scene
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
public
interface
SceneMapper
extends
BaseMapper
<
Scene
>
{
}
src/main/java/cn/qg/holmes/mapper/auto/SceneTestcaseMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.SceneTestcase
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
public
interface
SceneTestcaseMapper
extends
BaseMapper
<
SceneTestcase
>
{
IPage
<
SceneTestcase
>
getSceneTestcaseList
(
Integer
projectId
,
IPage
<
SceneTestcase
>
page
);
}
src/main/java/cn/qg/holmes/mapper/auto/SceneTestcaseReportMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.SceneTestcaseReport
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
java.util.Map
;
public
interface
SceneTestcaseReportMapper
extends
BaseMapper
<
SceneTestcaseReport
>
{
IPage
<
Map
<
String
,
Object
>>
getSceneTestcaseReportGroupByBatch
(
String
namespace
,
Integer
projectId
,
IPage
<
Map
<
String
,
Object
>>
page
);
}
src/main/java/cn/qg/holmes/mapper/auto/TestcaseMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.Testcase
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
public
interface
TestcaseMapper
extends
BaseMapper
<
Testcase
>
{
}
src/main/java/cn/qg/holmes/mapper/auto/TestcaseReportMapper.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
mapper
.
auto
;
import
cn.qg.holmes.entity.auto.TestcaseReport
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
java.util.Map
;
public
interface
TestcaseReportMapper
extends
BaseMapper
<
TestcaseReport
>
{
IPage
<
Map
<
String
,
Object
>>
getTestcaseReportGroupByBatch
(
String
namespace
,
Integer
moduleId
,
IPage
<
Map
<
String
,
Object
>>
page
);
}
src/main/java/cn/qg/holmes/service/auto/AutoModuleService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.service.IService
;
public
interface
AutoModuleService
extends
IService
<
AutoModule
>
{
IPage
<
AutoModule
>
getAutoModuleList
(
Integer
pageNum
,
Integer
pageSize
);
}
src/main/java/cn/qg/holmes/service/auto/AutoProjectService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.AutoProject
;
import
com.baomidou.mybatisplus.extension.service.IService
;
public
interface
AutoProjectService
extends
IService
<
AutoProject
>
{
}
src/main/java/cn/qg/holmes/service/auto/AutoUtilsService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.UUID
;
public
interface
AutoUtilsService
{
Map
<
String
,
String
>
replaceHeaders
(
String
headers
,
String
variables
,
UUID
uuid
);
Map
<
String
,
String
>
replaceParameters
(
String
parameters
,
String
variables
,
UUID
uuid
);
boolean
extractResponse
(
String
response
,
String
extract
,
UUID
uuid
);
boolean
assertResponse
(
String
response
,
List
<
Map
>
validateList
);
}
src/main/java/cn/qg/holmes/service/auto/InterfaceService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.Interface
;
import
com.baomidou.mybatisplus.extension.service.IService
;
public
interface
InterfaceService
extends
IService
<
Interface
>
{
}
src/main/java/cn/qg/holmes/service/auto/SceneService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.Scene
;
import
com.baomidou.mybatisplus.extension.service.IService
;
public
interface
SceneService
extends
IService
<
Scene
>
{
}
src/main/java/cn/qg/holmes/service/auto/SceneTestcaseReportService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.SceneTestcaseReport
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
java.util.Map
;
public
interface
SceneTestcaseReportService
extends
IService
<
SceneTestcaseReport
>
{
Map
<
String
,
Object
>
getSceneTestcaseReportListByNamespace
(
String
namespace
,
Integer
moduleId
,
Integer
pageNum
,
Integer
pageSize
);
IPage
<
Map
<
String
,
Object
>>
getSceneTestcaseReportGroupByBatch
(
String
namespace
,
Integer
projectId
,
Integer
pageNum
,
Integer
pageSize
);
}
src/main/java/cn/qg/holmes/service/auto/SceneTestcaseService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.SceneTestcase
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.service.IService
;
public
interface
SceneTestcaseService
extends
IService
<
SceneTestcase
>
{
String
executeSceneTestcase
(
String
namespace
,
Integer
sceneId
,
String
batch
);
IPage
<
SceneTestcase
>
getSceneTestcaseList
(
Integer
projectId
,
Integer
pageNum
,
Integer
pageSize
);
}
src/main/java/cn/qg/holmes/service/auto/TestcaseReportService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.TestcaseReport
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.service.IService
;
import
java.util.Map
;
public
interface
TestcaseReportService
extends
IService
<
TestcaseReport
>
{
Map
<
String
,
Object
>
getTestcaseReportByNamespace
(
String
namespace
,
Integer
projectId
,
Integer
pageNum
,
Integer
pageSize
);
IPage
<
Map
<
String
,
Object
>>
getTestcaseReportGroupByBatch
(
String
namespace
,
Integer
moduleId
,
Integer
pageNum
,
Integer
pageSize
);
}
src/main/java/cn/qg/holmes/service/auto/TestcaseService.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
;
import
cn.qg.holmes.entity.auto.Testcase
;
import
com.baomidou.mybatisplus.extension.service.IService
;
public
interface
TestcaseService
extends
IService
<
Testcase
>
{
String
singleTestcaseExecutor
(
String
namespace
,
Integer
testcaseId
,
String
batch
);
String
executeTestcaseByModuleId
(
String
namespace
,
Integer
moduleId
,
String
batch
);
}
src/main/java/cn/qg/holmes/service/auto/impl/AutoModuleServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
cn.qg.holmes.mapper.auto.AutoModuleMapper
;
import
cn.qg.holmes.service.auto.AutoModuleService
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
@Service
public
class
AutoModuleServiceImpl
extends
ServiceImpl
<
AutoModuleMapper
,
AutoModule
>
implements
AutoModuleService
{
@Autowired
AutoModuleMapper
autoModuleMapper
;
@Override
public
IPage
<
AutoModule
>
getAutoModuleList
(
Integer
pageNum
,
Integer
pageSize
)
{
IPage
<
AutoModule
>
page
=
new
Page
<>(
pageNum
,
pageSize
);
return
autoModuleMapper
.
getAutoModuleList
(
page
);
}
}
src/main/java/cn/qg/holmes/service/auto/impl/AutoProjectServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.AutoProject
;
import
cn.qg.holmes.mapper.auto.AutoProjectMapper
;
import
cn.qg.holmes.service.auto.AutoProjectService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.stereotype.Service
;
@Service
public
class
AutoProjectServiceImpl
extends
ServiceImpl
<
AutoProjectMapper
,
AutoProject
>
implements
AutoProjectService
{
}
src/main/java/cn/qg/holmes/service/auto/impl/AutoUtilsServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.service.auto.AutoUtilsService
;
import
cn.qg.holmes.utils.RedisUtils
;
import
com.alibaba.fastjson.JSON
;
import
com.jayway.jsonpath.JsonPath
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.UUID
;
/**
* @author libo
* created at 2021-03-30
*/
@Service
@Slf4j
public
class
AutoUtilsServiceImpl
implements
AutoUtilsService
{
@Autowired
RedisUtils
redisUtils
;
/**
* 将请求headers中的变量替换成对应的值
* @param headers 请求头json
* @param variables 参数json
* @return
*/
public
Map
<
String
,
String
>
replaceHeaders
(
String
headers
,
String
variables
,
UUID
uuid
)
{
log
.
info
(
"开始执行请求头替换!"
);
Map
<
String
,
String
>
headersMap
=
JSON
.
parseObject
(
headers
,
Map
.
class
);
Map
<
String
,
String
>
varMap
=
JSON
.
parseObject
(
variables
,
Map
.
class
);
log
.
info
(
"替换之前的headers:{}"
,
headersMap
);
log
.
info
(
"参数列表:{}"
,
varMap
);
for
(
String
key:
varMap
.
keySet
())
{
String
value
=
varMap
.
get
(
key
);
headersMap
.
put
(
key
,
redisUtils
.
get
(
uuid
+
"_"
+
value
.
substring
(
1
)).
toString
());
}
log
.
info
(
"替换之后的headers:{}"
,
headersMap
);
return
headersMap
;
}
/**
* 将请求体中的变量替换成对应的值
* @param parameters 请求参数json
* @param variables 变量json
* @return 替换后的参数Map
*/
public
Map
<
String
,
String
>
replaceParameters
(
String
parameters
,
String
variables
,
UUID
uuid
)
{
log
.
info
(
"开始执行请求参数替换!"
);
Map
<
String
,
String
>
parameterMap
=
JSON
.
parseObject
(
parameters
,
Map
.
class
);
Map
<
String
,
String
>
varMap
=
JSON
.
parseObject
(
variables
,
Map
.
class
);
log
.
info
(
"替换之前的参数:{}"
,
parameterMap
);
log
.
info
(
"参数列表:{}"
,
varMap
);
for
(
String
key:
varMap
.
keySet
())
{
String
value
=
varMap
.
get
(
key
);
parameterMap
.
put
(
key
,
redisUtils
.
get
(
uuid
+
"_"
+
value
.
substring
(
1
)).
toString
());
}
log
.
info
(
"替换之后的参数:{}"
,
parameterMap
);
return
parameterMap
;
}
/**
* 将响应中的值解析出来并存储到redis值
* @param response 响应json
* @param extract 解析的字段及保存到redis的key
* @return true-解析成功,false-解析失败
*/
public
boolean
extractResponse
(
String
response
,
String
extract
,
UUID
uuid
)
{
Map
<
String
,
String
>
extractMap
=
JSON
.
parseObject
(
extract
,
Map
.
class
);
try
{
for
(
String
key:
extractMap
.
keySet
())
{
String
value
=
extractMap
.
get
(
key
);
String
redisKey
=
uuid
+
"_"
+
key
;
redisUtils
.
set
(
redisKey
,
JsonPath
.
read
(
response
,
value
));
redisUtils
.
expire
(
redisKey
,
120
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
false
;
}
return
true
;
}
/**
* 响应断言
* @return
*/
public
boolean
assertResponse
(
String
response
,
List
<
Map
>
validateList
)
{
for
(
Map
<
String
,
String
>
map:
validateList
)
{
String
comparator
=
map
.
get
(
"comparator"
);
String
checkpoint
=
JsonPath
.
read
(
response
,
map
.
get
(
"check"
)).
toString
();
String
expectValue
=
map
.
get
(
"expect"
);
boolean
result
=
singleAssertResponse
(
response
,
comparator
,
checkpoint
,
expectValue
);
if
(!
result
)
{
return
false
;
}
}
return
true
;
}
/**
*
* @param response
* @param comparator
* @param checkpoint
* @param expectValue
* @return
*/
public
boolean
singleAssertResponse
(
String
response
,
String
comparator
,
String
checkpoint
,
String
expectValue
)
{
switch
(
comparator
)
{
case
"eq"
:
return
checkpoint
.
equals
(
expectValue
);
case
"gt"
:
return
Integer
.
parseInt
(
checkpoint
)
>
Integer
.
parseInt
(
expectValue
);
case
"lt"
:
return
Integer
.
parseInt
(
checkpoint
)
<
Integer
.
parseInt
(
expectValue
);
case
"neq"
:
return
!
checkpoint
.
equals
(
expectValue
);
default
:
log
.
info
(
"暂不支持该比较符号:{}"
,
comparator
);
break
;
}
return
false
;
}
}
src/main/java/cn/qg/holmes/service/auto/impl/InterfaceServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.Interface
;
import
cn.qg.holmes.mapper.auto.InterfaceMapper
;
import
cn.qg.holmes.service.auto.InterfaceService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.stereotype.Service
;
@Service
public
class
InterfaceServiceImpl
extends
ServiceImpl
<
InterfaceMapper
,
Interface
>
implements
InterfaceService
{
}
src/main/java/cn/qg/holmes/service/auto/impl/SceneServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.Scene
;
import
cn.qg.holmes.mapper.auto.SceneMapper
;
import
cn.qg.holmes.service.auto.SceneService
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.stereotype.Service
;
@Service
public
class
SceneServiceImpl
extends
ServiceImpl
<
SceneMapper
,
Scene
>
implements
SceneService
{
}
src/main/java/cn/qg/holmes/service/auto/impl/SceneTestcaseReportServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.SceneTestcaseReport
;
import
cn.qg.holmes.mapper.auto.SceneTestcaseReportMapper
;
import
cn.qg.holmes.service.auto.SceneTestcaseReportService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.HashMap
;
import
java.util.Map
;
@Service
public
class
SceneTestcaseReportServiceImpl
extends
ServiceImpl
<
SceneTestcaseReportMapper
,
SceneTestcaseReport
>
implements
SceneTestcaseReportService
{
@Autowired
SceneTestcaseReportMapper
sceneTestcaseReportMapper
;
@Override
public
Map
<
String
,
Object
>
getSceneTestcaseReportListByNamespace
(
String
namespace
,
Integer
moduleId
,
Integer
pageNum
,
Integer
pageSize
)
{
QueryWrapper
<
SceneTestcaseReport
>
queryWrapper
=
new
QueryWrapper
<>();
if
(
namespace
!=
null
&&
!
namespace
.
isEmpty
())
{
queryWrapper
.
eq
(
"namespace"
,
namespace
);
}
if
(
moduleId
!=
null
)
{
queryWrapper
.
eq
(
"module_id"
,
moduleId
);
}
queryWrapper
.
orderByDesc
(
"id"
);
Page
<
SceneTestcaseReport
>
page
=
new
Page
<>(
pageNum
,
pageSize
);
IPage
<
SceneTestcaseReport
>
iPage
=
sceneTestcaseReportMapper
.
selectPage
(
page
,
queryWrapper
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
iPage
.
getTotal
());
map
.
put
(
"list"
,
iPage
.
getRecords
());
return
map
;
}
@Override
public
IPage
<
Map
<
String
,
Object
>>
getSceneTestcaseReportGroupByBatch
(
String
namespace
,
Integer
projectId
,
Integer
pageNum
,
Integer
pageSize
)
{
IPage
<
Map
<
String
,
Object
>>
page
=
new
Page
<>(
pageNum
,
pageSize
);
return
sceneTestcaseReportMapper
.
getSceneTestcaseReportGroupByBatch
(
namespace
,
projectId
,
page
);
}
}
src/main/java/cn/qg/holmes/service/auto/impl/SceneTestcaseServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
cn.qg.holmes.entity.auto.Interface
;
import
cn.qg.holmes.entity.auto.SceneTestcase
;
import
cn.qg.holmes.entity.auto.SceneTestcaseReport
;
import
cn.qg.holmes.mapper.auto.SceneTestcaseMapper
;
import
cn.qg.holmes.service.auto.*
;
import
cn.qg.holmes.utils.HttpClientUtils
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.*
;
/**
* @author libo
* created at 2021-03-30
*/
@Service
@Slf4j
public
class
SceneTestcaseServiceImpl
extends
ServiceImpl
<
SceneTestcaseMapper
,
SceneTestcase
>
implements
SceneTestcaseService
{
@Autowired
SceneTestcaseMapper
sceneTestcaseMapper
;
@Autowired
TestcaseService
testcaseService
;
@Autowired
InterfaceService
interfaceService
;
@Autowired
AutoModuleService
autoModuleService
;
@Autowired
AutoUtilsService
autoUtilsService
;
@Autowired
SceneTestcaseReportService
sceneTestcaseReportService
;
@Autowired
SceneService
sceneService
;
@Override
public
String
executeSceneTestcase
(
String
namespace
,
Integer
sceneId
,
String
batch
)
{
UUID
uuid
=
UUID
.
randomUUID
();
QueryWrapper
queryWrapper
=
new
QueryWrapper
();
queryWrapper
.
eq
(
"scene_id"
,
sceneId
);
queryWrapper
.
orderByAsc
(
"sequence"
);
List
<
SceneTestcase
>
sceneTestcaseList
=
sceneTestcaseMapper
.
selectList
(
queryWrapper
);
List
<
Map
<
String
,
Object
>>
resultList
=
new
ArrayList
<>();
for
(
SceneTestcase
sceneTestcase:
sceneTestcaseList
)
{
resultList
.
add
(
JSON
.
parseObject
(
sceneTestcaseExecution
(
namespace
,
sceneId
,
sceneTestcase
.
getInterfaceId
(),
uuid
,
batch
),
Map
.
class
));
}
return
JSON
.
toJSONString
(
resultList
);
}
/**
* 获取场景用例列表
* @param projectId 项目id
* @param pageNum 第几页
* @param pageSize 每页多少条
* @return
*/
@Override
public
IPage
<
SceneTestcase
>
getSceneTestcaseList
(
Integer
projectId
,
Integer
pageNum
,
Integer
pageSize
)
{
IPage
<
SceneTestcase
>
page
=
new
Page
<>(
pageNum
,
pageSize
);
return
sceneTestcaseMapper
.
getSceneTestcaseList
(
projectId
,
page
);
}
public
String
sceneTestcaseExecution
(
String
namespace
,
Integer
sceneId
,
Integer
interfaceId
,
UUID
uuid
,
String
batch
)
{
QueryWrapper
queryWrapper
=
new
QueryWrapper
();
queryWrapper
.
eq
(
"scene_id"
,
sceneId
);
queryWrapper
.
eq
(
"interface_id"
,
interfaceId
);
SceneTestcase
sceneTestcase
=
sceneTestcaseMapper
.
selectOne
(
queryWrapper
);
Interface
anInterface
=
interfaceService
.
getById
(
interfaceId
);
AutoModule
autoModule
=
autoModuleService
.
getById
(
anInterface
.
getModuleId
());
String
domain
=
autoModule
.
getDomain
();
String
url
=
domain
.
replace
(
"${NAMESPACE}"
,
namespace
)
+
anInterface
.
getUrl
();
log
.
info
(
"开始执行接口:{}"
,
url
);
String
method
=
anInterface
.
getMethod
().
toUpperCase
();
String
paramType
=
anInterface
.
getParamType
();
String
interfaceName
=
anInterface
.
getName
();
String
headers
=
sceneTestcase
.
getHeaders
();
String
parameters
=
sceneTestcase
.
getParameters
();
String
variables
=
sceneTestcase
.
getVariables
();
String
extract
=
sceneTestcase
.
getExtract
();
String
validate
=
sceneTestcase
.
getValidate
();
Map
<
String
,
String
>
parameterMap
=
JSON
.
parseObject
(
parameters
,
Map
.
class
);
Map
<
String
,
String
>
headersMap
=
JSON
.
parseObject
(
headers
,
Map
.
class
);
// 使用变量替换headers
if
(
variables
!=
null
&&
!
variables
.
isEmpty
()
&&
headers
!=
null
&&
!
headers
.
isEmpty
())
{
headersMap
=
autoUtilsService
.
replaceHeaders
(
headers
,
variables
,
uuid
);
}
// 使用变量替换参数
if
(
variables
!=
null
&&
!
variables
.
isEmpty
()
&&
parameters
!=
null
&&
!
parameters
.
isEmpty
())
{
parameterMap
=
autoUtilsService
.
replaceParameters
(
parameters
,
variables
,
uuid
);
}
// 创建断言列表
List
<
Map
>
validateList
=
new
ArrayList
<>();
if
(
validate
!=
null
&&
!
validate
.
isEmpty
())
{
validateList
=
JSON
.
parseArray
(
validate
,
Map
.
class
);
}
String
response
=
""
;
Long
startTime
=
System
.
currentTimeMillis
();
switch
(
method
)
{
case
"GET"
:
response
=
HttpClientUtils
.
doGet
(
url
,
headersMap
,
parameterMap
);
break
;
case
"POST"
:
if
(
paramType
.
equals
(
"json"
))
{
response
=
HttpClientUtils
.
doPostJson
(
url
,
headersMap
,
JSON
.
toJSONString
(
parameterMap
));
}
else
if
(
paramType
.
equals
(
"form"
))
{
response
=
HttpClientUtils
.
doPost
(
url
,
headersMap
,
parameterMap
);
}
break
;
default
:
log
.
info
(
"暂不支持该请求方法:{}"
,
method
);
break
;
}
Long
endTime
=
System
.
currentTimeMillis
();
Long
elapsedTime
=
endTime
-
startTime
;
log
.
info
(
"本次接口的响应为:{}"
,
response
);
log
.
info
(
"本次接口执行时间:{}"
,
elapsedTime
);
// 进行断言
boolean
assertResult
=
true
;
if
(!
validateList
.
isEmpty
())
{
assertResult
=
autoUtilsService
.
assertResponse
(
response
,
validateList
);
}
// 解析响应
if
(
extract
!=
null
&&
!
extract
.
isEmpty
())
{
autoUtilsService
.
extractResponse
(
response
,
extract
,
uuid
);
}
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"url"
,
url
);
map
.
put
(
"name"
,
interfaceName
);
map
.
put
(
"headers"
,
headersMap
);
map
.
put
(
"parameters"
,
parameterMap
);
map
.
put
(
"assertResult"
,
assertResult
);
map
.
put
(
"response"
,
JSON
.
parseObject
(
response
,
Map
.
class
));
map
.
put
(
"elapsedTime"
,
elapsedTime
);
// 插入测试报告
SceneTestcaseReport
sceneTestcaseReport
=
new
SceneTestcaseReport
();
sceneTestcaseReport
.
setSceneId
(
sceneId
);
sceneTestcaseReport
.
setSceneTestcaseId
(
sceneTestcase
.
getId
());
sceneTestcaseReport
.
setSequence
(
sceneTestcase
.
getSequence
());
sceneTestcaseReport
.
setUrl
(
url
);
sceneTestcaseReport
.
setHeaders
(
JSON
.
toJSONString
(
headersMap
));
sceneTestcaseReport
.
setParameters
(
JSON
.
toJSONString
(
parameterMap
));
if
(
assertResult
)
{
sceneTestcaseReport
.
setStatus
(
"pass"
);
}
else
{
sceneTestcaseReport
.
setStatus
(
"fail"
);
}
sceneTestcaseReport
.
setElapsedTime
(
elapsedTime
);
sceneTestcaseReport
.
setResponse
(
response
);
sceneTestcaseReport
.
setValidate
(
validate
);
sceneTestcaseReport
.
setBatch
(
batch
);
sceneTestcaseReport
.
setProjectId
(
sceneService
.
getById
(
sceneId
).
getProjectId
());
sceneTestcaseReport
.
setNamespace
(
namespace
);
log
.
info
(
"保存测试报告:{}"
,
sceneTestcaseReport
);
sceneTestcaseReportService
.
save
(
sceneTestcaseReport
);
return
JSON
.
toJSONString
(
map
);
}
}
src/main/java/cn/qg/holmes/service/auto/impl/TestcaseReportServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.TestcaseReport
;
import
cn.qg.holmes.mapper.auto.TestcaseReportMapper
;
import
cn.qg.holmes.service.auto.TestcaseReportService
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.HashMap
;
import
java.util.Map
;
@Service
public
class
TestcaseReportServiceImpl
extends
ServiceImpl
<
TestcaseReportMapper
,
TestcaseReport
>
implements
TestcaseReportService
{
@Autowired
TestcaseReportMapper
testcaseReportMapper
;
@Override
public
Map
<
String
,
Object
>
getTestcaseReportByNamespace
(
String
namespace
,
Integer
projectId
,
Integer
pageNum
,
Integer
pageSize
)
{
QueryWrapper
<
TestcaseReport
>
testcaseReportQueryWrapper
=
new
QueryWrapper
<>();
if
(
namespace
!=
null
&&
!
namespace
.
isEmpty
())
{
testcaseReportQueryWrapper
.
eq
(
"namespace"
,
namespace
);
}
if
(
projectId
!=
null
)
{
testcaseReportQueryWrapper
.
eq
(
"project_id"
,
projectId
);
}
testcaseReportQueryWrapper
.
orderByDesc
(
"id"
);
Page
<
TestcaseReport
>
page
=
new
Page
<>(
pageNum
,
pageSize
);
IPage
<
TestcaseReport
>
iPage
=
testcaseReportMapper
.
selectPage
(
page
,
testcaseReportQueryWrapper
);
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"total"
,
iPage
.
getTotal
());
map
.
put
(
"list"
,
iPage
.
getRecords
());
return
map
;
}
@Override
public
IPage
<
Map
<
String
,
Object
>>
getTestcaseReportGroupByBatch
(
String
namespace
,
Integer
moduleId
,
Integer
pageNum
,
Integer
pageSize
)
{
IPage
<
Map
<
String
,
Object
>>
page
=
new
Page
<>(
pageNum
,
pageSize
);
return
testcaseReportMapper
.
getTestcaseReportGroupByBatch
(
namespace
,
moduleId
,
page
);
}
}
src/main/java/cn/qg/holmes/service/auto/impl/TestcaseServiceImpl.java
0 → 100644
View file @
40055ffd
package
cn
.
qg
.
holmes
.
service
.
auto
.
impl
;
import
cn.qg.holmes.entity.auto.AutoModule
;
import
cn.qg.holmes.entity.auto.Interface
;
import
cn.qg.holmes.entity.auto.Testcase
;
import
cn.qg.holmes.entity.auto.TestcaseReport
;
import
cn.qg.holmes.mapper.auto.TestcaseMapper
;
import
cn.qg.holmes.service.auto.*
;
import
cn.qg.holmes.utils.HttpClientUtils
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author libo
* created at 2021-03-30
*/
@Service
@Slf4j
public
class
TestcaseServiceImpl
extends
ServiceImpl
<
TestcaseMapper
,
Testcase
>
implements
TestcaseService
{
@Autowired
TestcaseMapper
testcaseMapper
;
@Autowired
InterfaceService
interfaceService
;
@Autowired
AutoModuleService
autoModuleService
;
@Autowired
AutoUtilsService
autoUtilsService
;
@Autowired
TestcaseReportService
testcaseReportService
;
/**
* 执行单接口用例
* @param namespace 环境
* @param testcaseId 用例id
* @return
*/
@Override
public
String
singleTestcaseExecutor
(
String
namespace
,
Integer
testcaseId
,
String
batch
)
{
Testcase
testcase
=
testcaseMapper
.
selectById
(
testcaseId
);
Interface
anInterface
=
interfaceService
.
getById
(
testcase
.
getInterfaceId
());
AutoModule
autoModule
=
autoModuleService
.
getById
(
anInterface
.
getModuleId
());
String
domain
=
autoModule
.
getDomain
();
String
url
=
domain
.
replace
(
"${NAMESPACE}"
,
namespace
)
+
anInterface
.
getUrl
();
String
method
=
anInterface
.
getMethod
().
toUpperCase
();
String
paramType
=
anInterface
.
getParamType
();
String
headers
=
testcase
.
getHeaders
();
String
parameters
=
testcase
.
getParameters
();
String
testcaseName
=
testcase
.
getName
();
String
variables
=
testcase
.
getVariables
();
String
extract
=
testcase
.
getExtract
();
String
validate
=
testcase
.
getValidate
();
// 参数准备
Map
<
String
,
String
>
headersMap
=
JSON
.
parseObject
(
headers
,
Map
.
class
);
Map
<
String
,
String
>
parameterMap
=
JSON
.
parseObject
(
parameters
,
Map
.
class
);
// 使用变量替换headers
// if (variables != null && !variables.isEmpty() && headers != null && !headers.isEmpty()) {
// headersMap = autoUtilsService.replaceHeaders(headers, variables);
// }
// // 使用变量替换参数
// if (variables != null && !variables.isEmpty() && parameters != null && !parameters.isEmpty()) {
// parameterMap = autoUtilsService.replaceParameters(parameters, variables);
// }
// 创建断言列表
List
<
Map
>
validateList
=
new
ArrayList
<>();
if
(
validate
!=
null
&&
!
validate
.
isEmpty
())
{
validateList
=
JSON
.
parseArray
(
validate
,
Map
.
class
);
}
String
response
=
""
;
Long
startTime
=
System
.
currentTimeMillis
();
// 发起http请求
switch
(
method
)
{
case
"GET"
:
response
=
HttpClientUtils
.
doGet
(
url
,
headersMap
,
parameterMap
);
break
;
case
"POST"
:
if
(
paramType
.
equals
(
"json"
))
{
response
=
HttpClientUtils
.
doPostJson
(
url
,
headersMap
,
JSON
.
toJSONString
(
parameterMap
));
}
else
if
(
paramType
.
equals
(
"form"
))
{
response
=
HttpClientUtils
.
doPost
(
url
,
headersMap
,
parameterMap
);
}
break
;
default
:
log
.
info
(
"暂不支持该请求方法:{}"
,
method
);
break
;
}
Long
endTime
=
System
.
currentTimeMillis
();
Long
elapsedTime
=
endTime
-
startTime
;
log
.
info
(
"用例:{}, 返回为:{}"
,
testcaseName
,
response
);
log
.
info
(
"本次接口执行时间:{}"
,
elapsedTime
);
// 进行断言
boolean
assertResult
=
true
;
if
(!
validateList
.
isEmpty
())
{
assertResult
=
autoUtilsService
.
assertResponse
(
response
,
validateList
);
}
// 解析响应
// if (extract != null && !extract.isEmpty()) {
// autoUtilsService.extractResponse(response, extract);
// }
Map
<
String
,
Object
>
map
=
new
HashMap
<>();
map
.
put
(
"url"
,
url
);
map
.
put
(
"name"
,
testcaseName
);
map
.
put
(
"headers"
,
headersMap
);
map
.
put
(
"parameters"
,
parameterMap
);
map
.
put
(
"assertResult"
,
assertResult
);
map
.
put
(
"response"
,
JSON
.
parseObject
(
response
,
Map
.
class
));
map
.
put
(
"elapsedTime"
,
elapsedTime
);
// 插入测试报告
TestcaseReport
testcaseReport
=
new
TestcaseReport
();
testcaseReport
.
setTestcaseId
(
testcaseId
);
testcaseReport
.
setHeaders
(
JSON
.
toJSONString
(
headersMap
));
testcaseReport
.
setParameters
(
JSON
.
toJSONString
(
parameterMap
));
testcaseReport
.
setResponse
(
response
);
testcaseReport
.
setValidate
(
validate
);
if
(
assertResult
)
{
testcaseReport
.
setStatus
(
"pass"
);
}
else
{
testcaseReport
.
setStatus
(
"fail"
);
}
testcaseReport
.
setElapsedTime
(
elapsedTime
);
testcaseReport
.
setBatch
(
batch
);
testcaseReport
.
setModuleId
(
testcase
.
getModuleId
());
testcaseReport
.
setNamespace
(
namespace
);
testcaseReport
.
setUrl
(
url
);
testcaseReportService
.
save
(
testcaseReport
);
return
JSON
.
toJSONString
(
map
);
}
/**
* 执行某个模块下所有用例
* @param namespace 环境
* @param moduleId 模块id
* @param batch 执行批次
* @return
*/
@Override
public
String
executeTestcaseByModuleId
(
String
namespace
,
Integer
moduleId
,
String
batch
)
{
QueryWrapper
queryWrapper
=
new
QueryWrapper
();
queryWrapper
.
eq
(
"module_id"
,
moduleId
);
List
<
Testcase
>
testcaseList
=
testcaseMapper
.
selectList
(
queryWrapper
);
List
<
Map
>
resultList
=
new
ArrayList
<>();
for
(
Testcase
testcase:
testcaseList
)
{
String
response
=
singleTestcaseExecutor
(
namespace
,
testcase
.
getId
(),
batch
);
resultList
.
add
(
JSON
.
parseObject
(
response
,
Map
.
class
));
}
return
JSON
.
toJSONString
(
resultList
);
}
}
src/main/java/cn/qg/holmes/utils/BankCardUtils.java
View file @
40055ffd
package
cn
.
qg
.
holmes
.
utils
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
/**
...
...
@@ -9,8 +10,8 @@ public class BankCardUtils {
public
static
String
getCardCode
(
String
cardNo
)
{
String
url
=
"https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo="
+
cardNo
+
"&cardBinCheck=true"
;
JSONObject
resposne
=
HttpClientUtils
.
doGetReturnJson
(
url
);
return
resposne
.
get
(
"bank"
).
toString
();
String
resposne
=
HttpClientUtils
.
doGet
(
url
);
return
JSON
.
parseObject
(
resposne
)
.
get
(
"bank"
).
toString
();
}
public
static
void
main
(
String
[]
args
)
{
...
...
src/main/java/cn/qg/holmes/utils/DingdingUtils.java
View file @
40055ffd
package
cn
.
qg
.
holmes
.
utils
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.HashMap
;
...
...
@@ -11,11 +10,12 @@ import java.util.Map;
public
class
DingdingUtils
{
public
static
boolean
sendToDingding
(
String
jsonString
,
String
webhook
)
{
Map
<
String
,
Object
>
headers
=
new
HashMap
<>();
Map
<
String
,
String
>
headers
=
new
HashMap
<>();
headers
.
put
(
"Content-Type"
,
"application/json; charset=utf-8"
);
JSONObject
result
=
HttpClientUtils
.
doPostJson
(
webhook
,
jsonString
,
headers
);
String
result
=
HttpClientUtils
.
doPostJson
(
webhook
,
headers
,
jsonString
);
log
.
info
(
"发送给钉钉: {}, 内容:{}, 钉钉返回结果:{}"
,
webhook
,
jsonString
,
result
);
return
result
.
get
(
"errmsg"
).
equals
(
"ok"
);
Map
<
String
,
String
>
resultMap
=
JSON
.
parseObject
(
result
,
Map
.
class
);
return
resultMap
.
get
(
"errmsg"
).
equals
(
"ok"
);
}
public
static
String
buildMarkdownMsg
(
String
key
,
String
summary
,
String
creator
,
String
assignee
,
String
priority
,
String
module
)
{
...
...
@@ -33,4 +33,9 @@ public class DingdingUtils {
markdown
.
put
(
"markdown"
,
content
);
return
JSON
.
toJSONString
(
markdown
);
}
public
static
void
main
(
String
[]
args
)
{
String
markdown
=
buildMarkdownMsg
(
"YXM-1499"
,
"【羊小咩v7.6.00】【VCC首次交易率提升专题】巴拉巴拉"
,
"黎博"
,
"于巧玲"
,
"p1"
,
"kddsp"
);
sendToDingding
(
markdown
,
"https://oapi.dingtalk.com/robot/send?access_token=835663338d638e40daaf3ab358af741ef0680a826a962c91bedc53b149d85ee1"
);
}
}
src/main/java/cn/qg/holmes/utils/HttpClientUtils.java
View file @
40055ffd
This diff is collapsed.
Click to expand it.
src/main/resources/mapper/auto/AutoModuleMapper.xml
0 → 100644
View file @
40055ffd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace=
"cn.qg.holmes.mapper.auto.AutoModuleMapper"
>
<select
id=
"getAutoModuleList"
resultType=
"cn.qg.holmes.entity.auto.AutoModule"
>
select a.*,
p.`name` as projectName
from `auto_module` a, auto_project p
where a.`project_id` = p.`id`
</select>
</mapper>
\ No newline at end of file
src/main/resources/mapper/auto/SceneTestcaseMapper.xml
0 → 100644
View file @
40055ffd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace=
"cn.qg.holmes.mapper.auto.SceneTestcaseMapper"
>
<select
id=
"getSceneTestcaseList"
resultType=
"cn.qg.holmes.entity.auto.SceneTestcase"
>
select stc.* from scene_testcase as stc
left join scene as sc ON stc.`scene_id`=sc.`id`
<if
test=
"projectId != null"
>
WHERE sc.`id`=#{projectId}
</if>
</select>
</mapper>
\ No newline at end of file
src/main/resources/mapper/auto/SceneTestcaseReportMapper.xml
0 → 100644
View file @
40055ffd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace=
"cn.qg.holmes.mapper.auto.SceneTestcaseReportMapper"
>
<select
id=
"getSceneTestcaseReportGroupByBatch"
resultType=
"java.util.Map"
>
SELECT st.`scene_id` as sceneId, st.`batch`, st.`namespace`, st.`project_id` as projectId, pro.`name` as projectName, st.`create_time` as createTime from `scene_testcase_report` st
left join `auto_project` pro on st.`project_id` = pro.`id` WHERE 1=1
<if
test=
"projectId != null and projectId !=''"
>
AND st.`project_id` = #{projectId}
</if>
<if
test=
"namespace != null and namespace != ''"
>
AND st.`namespace` = #{namespace}
</if>
GROUP BY st.`batch`
</select>
</mapper>
\ No newline at end of file
src/main/resources/mapper/auto/TestcaseReportMapper.xml
0 → 100644
View file @
40055ffd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper
namespace=
"cn.qg.holmes.mapper.auto.TestcaseReportMapper"
>
<select
id=
"getTestcaseReportGroupByBatch"
resultType=
"java.util.Map"
>
SELECT tr.`batch`,tr.`module_id` as moduleId, tr.`namespace`, tr.`create_time` as createTime, am.`name` as moduleName FROM `testcase_report` as tr
LEFT JOIN `auto_module` as am
ON tr.`module_id` = am.`id` WHERE 1=1
<if
test=
"namespace != null and namespace != ''"
>
AND tr.`namespace` = #{namespace}
</if>
<if
test=
"moduleId != null and moduleId != ''"
>
AND tr.`module_id` = #{moduleId}
</if>
</select>
</mapper>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment