Skip to content

Commit 54f79f5

Browse files
committed
#36 Completed, Add QA Testing Process Codes
1 parent 559d8c7 commit 54f79f5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3122
-7
lines changed

fluent-apps/qam/qtm/upload/package-info.java

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package io.fluent.qtm;
2+
3+
4+
import io.fluent.qtm.api.model.*;
5+
import org.springframework.boot.autoconfigure.domain.EntityScan;
6+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
7+
import org.springframework.context.annotation.ComponentScan;
8+
import org.springframework.context.annotation.Configuration;
9+
import xyz.erupt.core.annotation.EruptScan;
10+
import xyz.erupt.core.constant.MenuTypeEnum;
11+
import xyz.erupt.core.module.EruptModule;
12+
import xyz.erupt.core.module.EruptModuleInvoke;
13+
import xyz.erupt.core.module.MetaMenu;
14+
import xyz.erupt.core.module.ModuleInfo;
15+
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
19+
20+
@Configuration
21+
@ComponentScan
22+
@EntityScan
23+
@EruptScan
24+
@EnableConfigurationProperties
25+
public class FluentQAApiModule implements EruptModule {
26+
public FluentQAApiModule() {
27+
}
28+
29+
@Override
30+
public ModuleInfo info() {
31+
return ModuleInfo.builder().name("fluent-api").build();
32+
}
33+
34+
@Override
35+
public void run() {
36+
EruptModule.super.run();
37+
}
38+
39+
/**
40+
* API管理:
41+
* <p>
42+
* 1. API 仓库管理
43+
* 2. API 接口定义
44+
* 3. API 接口录制记录
45+
* 4. API 接口测试
46+
*
47+
* @return
48+
*/
49+
@Override
50+
public List<MetaMenu> initMenus() {
51+
List<MetaMenu> menus = new ArrayList<>();
52+
menus.add(MetaMenu.createRootMenu("$APIMgr", "接口管理", "fa fa-exchange", 1));
53+
54+
MetaMenu menuForAdded = MetaMenu.createEruptClassMenu(RemoteApi.class,
55+
menus.get(0), 1, MenuTypeEnum.TABLE);
56+
menuForAdded.setIcon("fa fa-scissors");
57+
menuForAdded.setName("API清单");
58+
menuForAdded.setCode("$API-List");
59+
menus.add(menuForAdded);
60+
61+
MetaMenu rawApiTestCaseMenu = MetaMenu.createEruptClassMenu(RawApiTestCase.class,
62+
menus.get(0), 1, MenuTypeEnum.TABLE);
63+
rawApiTestCaseMenu.setIcon("fa fa-scissors");
64+
rawApiTestCaseMenu.setName("API生成原始测试用例");
65+
rawApiTestCaseMenu.setCode("$API-TC-GEN");
66+
menus.add(rawApiTestCaseMenu);
67+
68+
MetaMenu apiMonitorRecordMenu = MetaMenu.createEruptClassMenu(ApiMonitorRecord.class,
69+
menus.get(0), 2, MenuTypeEnum.TABLE);
70+
apiMonitorRecordMenu.setIcon("fa fa-repeat");
71+
apiMonitorRecordMenu.setName("API录制记录");
72+
apiMonitorRecordMenu.setCode("$API-Record");
73+
menus.add(apiMonitorRecordMenu);
74+
75+
MetaMenu apiTestRecord = MetaMenu.createEruptClassMenu(
76+
ApiTestRecord
77+
.class,
78+
menus.get(0), 3, MenuTypeEnum.TABLE);
79+
apiTestRecord.setIcon("fa fa-thumbs-up");
80+
apiTestRecord.setName("API测试结果记录");
81+
apiTestRecord.setCode("$API-TestResult");
82+
menus.add(apiTestRecord);
83+
84+
MetaMenu apiTestScenarioMenu = MetaMenu.createEruptClassMenu(
85+
ApiTestScenario
86+
.class,
87+
menus.get(0), 4, MenuTypeEnum.TABLE);
88+
apiTestScenarioMenu.setIcon("fa fa-folder");
89+
apiTestScenarioMenu.setName("API测试场景");
90+
apiTestScenarioMenu.setCode("$API-TestScenario");
91+
menus.add(apiTestScenarioMenu);
92+
93+
MetaMenu apiStepMenu = MetaMenu.createEruptClassMenu(
94+
ApiStep
95+
.class,
96+
menus.get(0), 5, MenuTypeEnum.TABLE);
97+
apiStepMenu.setIcon("fa fa-folder");
98+
apiStepMenu.setName("API用例步骤");
99+
apiStepMenu.setCode("$API-Step");
100+
menus.add(apiStepMenu);
101+
// MetaMenu apiDefMenu = MetaMenu.createSimpleMenu("$API-def", "接口定义", "fa fa-check-square-o",
102+
// menus.get(0), 1, "");
103+
// menus.add(apiDefMenu);
104+
// addNewMenu(
105+
// menus,"$API-Spec-Git","API定义仓库", "fa fa-meetup", ApiSpecGitRepoModel.class,
106+
// MenuTypeEnum.TABLE,1,0
107+
// );
108+
// addNewMenu(
109+
// menus,"$API-Spec","API最新版本", "fa fa-gitlab", ApiSpecVersionModel.class,
110+
// MenuTypeEnum.TABLE,1,1
111+
// );
112+
113+
return menus;
114+
}
115+
116+
117+
static {
118+
EruptModuleInvoke.addEruptModule(FluentQAApiModule.class);
119+
}
120+
121+
@Override
122+
public void initFun() {
123+
EruptModule.super.initFun();
124+
}
125+
}

fluent-apps/qam/qtm/FluentUploadTCModule.java renamed to fluent-apps/workspace/src/main/java/io/fluent/qtm/FluentUploadTCModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package io.fluent.base;
1+
package io.fluent.qtm;
22

3-
import io.fluent.base.upload.model.UploadFileModel;
3+
import io.fluent.qtm.upload.model.UploadFileModel;
44
import org.springframework.boot.autoconfigure.domain.EntityScan;
55
import org.springframework.boot.context.properties.EnableConfigurationProperties;
66
import org.springframework.context.annotation.ComponentScan;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.fluent.qtm.api.handler;
2+
3+
import io.fluent.qtm.api.model.ApiMonitorRecord;
4+
import io.fluent.qtm.api.service.ApiTestCaseService;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.stereotype.Service;
7+
import xyz.erupt.annotation.fun.OperationHandler;
8+
9+
import javax.annotation.Resource;
10+
import java.util.List;
11+
12+
@Service
13+
@Slf4j
14+
public class GenerateApiCaseByCaptureDataHandler implements OperationHandler<ApiMonitorRecord, Void> {
15+
16+
@Resource
17+
private ApiTestCaseService apiService;
18+
@Override
19+
public String exec(List<ApiMonitorRecord> data, Void unused, String[] param) {
20+
log.info("start convert api capture data");
21+
apiService.convertApiMonitorRecordToTestCase(data);
22+
return null;
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.fluent.qtm.api.handler;
2+
3+
import io.fluent.qtm.api.model.ApiTestRecord;
4+
import io.fluent.qtm.api.service.ApiTestCaseService;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.stereotype.Service;
7+
import xyz.erupt.annotation.fun.OperationHandler;
8+
9+
import javax.annotation.Resource;
10+
import java.util.List;
11+
12+
@Service
13+
@Slf4j
14+
public class GenerateApiTestStepByApiTestRecord implements OperationHandler<ApiTestRecord, Void> {
15+
16+
@Resource
17+
private ApiTestCaseService apiService;
18+
@Override
19+
public String exec(List<ApiTestRecord> data, Void unused, String[] param) {
20+
log.info("start convert api capture data");
21+
apiService.convertApiTestResultToApiTestStep(data);
22+
return null;
23+
}
24+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.fluent.qtm.api.handler;
2+
3+
import io.fluent.qtm.api.model.RemoteApi;
4+
import io.fluent.qtm.api.service.ApiTestCaseService;
5+
import org.springframework.stereotype.Service;
6+
import xyz.erupt.annotation.fun.OperationHandler;
7+
8+
import javax.annotation.Resource;
9+
import java.util.List;
10+
11+
@Service
12+
public class GenerateRawApiCaseHandler implements OperationHandler<RemoteApi, Void> {
13+
14+
@Resource
15+
private ApiTestCaseService apiService;
16+
@Override
17+
public String exec(List<RemoteApi> data, Void unused, String[] param) {
18+
System.out.println("this is tests");
19+
apiService.convertToRawTestCase(data);
20+
return null;
21+
}
22+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package io.fluent.qtm.api.model;
2+
3+
4+
import io.fluent.qtm.api.handler.GenerateApiCaseByCaptureDataHandler;
5+
import io.fluent.base.handlers.SqlTagFetchHandler;
6+
import lombok.Data;
7+
import org.hibernate.annotations.DynamicInsert;
8+
import org.hibernate.annotations.DynamicUpdate;
9+
import xyz.erupt.annotation.Erupt;
10+
import xyz.erupt.annotation.EruptField;
11+
import xyz.erupt.annotation.sub_erupt.Layout;
12+
import xyz.erupt.annotation.sub_erupt.Power;
13+
import xyz.erupt.annotation.sub_erupt.RowOperation;
14+
import xyz.erupt.annotation.sub_field.Edit;
15+
import xyz.erupt.annotation.sub_field.EditType;
16+
import xyz.erupt.annotation.sub_field.View;
17+
import xyz.erupt.annotation.sub_field.ViewType;
18+
import xyz.erupt.annotation.sub_field.sub_edit.CodeEditorType;
19+
import xyz.erupt.annotation.sub_field.sub_edit.Search;
20+
import xyz.erupt.annotation.sub_field.sub_edit.TagsType;
21+
import xyz.erupt.jpa.model.MetaModel;
22+
23+
import javax.persistence.Entity;
24+
import javax.persistence.Table;
25+
26+
@DynamicUpdate
27+
@DynamicInsert
28+
@Entity
29+
@Table(name = "api_monitor_record")
30+
@Erupt(
31+
name = "接口访问记录",
32+
layout = @Layout(
33+
tableLeftFixed = 3,
34+
pageSize = 30),
35+
power = @Power(importable = true, export = true),
36+
rowOperation = {@RowOperation(
37+
title = "生成接口用例数据",
38+
operationHandler = GenerateApiCaseByCaptureDataHandler.class)},
39+
orderBy = "ApiMonitorRecord.id desc"
40+
41+
)
42+
@Data
43+
public class ApiMonitorRecord extends MetaModel {
44+
45+
@EruptField(
46+
views = @View(title = "app"),
47+
edit = @Edit(
48+
title = "app应用名",
49+
type = EditType.TAGS, search = @Search(vague = true), notNull = true,
50+
tagsType = @TagsType(
51+
fetchHandler = SqlTagFetchHandler.class,
52+
fetchHandlerParams = "select distinct app from api_monitor_record"
53+
)
54+
))
55+
private String app;
56+
@EruptField(
57+
views = @View(title = "录制名称"),
58+
edit = @Edit(title = "录制名称", notNull = true, search = @Search)
59+
)
60+
private String recordName;
61+
@EruptField(
62+
views = @View(title = "请求地址"),
63+
edit = @Edit(title = "请求地址", notNull = true, search = @Search)
64+
)
65+
private String requestUrl;
66+
67+
@EruptField(
68+
views = @View(title = "服务"),
69+
edit = @Edit(
70+
title = "服务",
71+
type = EditType.TAGS, search = @Search(vague = true), notNull = true,
72+
tagsType = @TagsType(
73+
fetchHandler = SqlTagFetchHandler.class,
74+
fetchHandlerParams = "select distinct service from api_monitor_record"
75+
)
76+
)
77+
)
78+
79+
private String service;
80+
@EruptField(
81+
views = @View(title = "接口名称"),
82+
edit = @Edit(title = "接口名称", notNull = true, search = @Search)
83+
)
84+
private String api;
85+
86+
@EruptField(
87+
views = @View(title = "服务URL"),
88+
edit = @Edit(title = "服务URL", notNull = true, search = @Search)
89+
)
90+
private String path;
91+
92+
@EruptField(
93+
views = @View(title = "请求头"),
94+
edit = @Edit(title = "请求报文", type = EditType.CODE_EDITOR, codeEditType = @CodeEditorType(language = "json"))
95+
)
96+
private String requestHeaders;
97+
98+
@EruptField(
99+
views = @View(title = "HTTP方法"),
100+
edit = @Edit(title = "HTTP方法", notNull = true, search = @Search)
101+
)
102+
private String method;
103+
104+
@EruptField(
105+
views = @View(title = "请求报文", type = ViewType.CODE),
106+
edit = @Edit(title = "请求报文", type = EditType.CODE_EDITOR, codeEditType = @CodeEditorType(language = "json"))
107+
)
108+
private String requestBody;
109+
110+
111+
@EruptField(
112+
views = @View(title = "response_headers"),
113+
edit = @Edit(title = "responseHeaders", type = EditType.CODE_EDITOR, codeEditType = @CodeEditorType(language = "json"))
114+
)
115+
private String responseHeaders;
116+
117+
@EruptField(
118+
views = @View(title = "status_code"),
119+
edit = @Edit(title = "status_code", notNull = true, search = @Search)
120+
)
121+
private int statusCode;
122+
123+
@EruptField(
124+
views = @View(title = "返回报文", type = ViewType.CODE),
125+
edit = @Edit(title = "返回报文", type = EditType.CODE_EDITOR, codeEditType = @CodeEditorType(language = "json"))
126+
)
127+
private String responseBody;
128+
129+
130+
131+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.fluent.qtm.api.model;
2+
3+
import lombok.Data;
4+
import org.hibernate.annotations.DynamicInsert;
5+
import org.hibernate.annotations.DynamicUpdate;
6+
import xyz.erupt.annotation.Erupt;
7+
import xyz.erupt.annotation.EruptField;
8+
import xyz.erupt.annotation.sub_erupt.Layout;
9+
import xyz.erupt.annotation.sub_erupt.Power;
10+
import xyz.erupt.annotation.sub_field.View;
11+
import xyz.erupt.jpa.model.BaseModel;
12+
13+
import javax.persistence.Entity;
14+
import javax.persistence.Table;
15+
import java.time.LocalDateTime;
16+
17+
@DynamicUpdate
18+
@DynamicInsert
19+
@Entity
20+
@Table(name = "api_spec_change")
21+
@Erupt(
22+
layout = @Layout(
23+
tableLeftFixed = 3,
24+
pageSize = 30),
25+
name = "api spec 变化记录", power = @Power(export = true)
26+
)
27+
@Data
28+
public class ApiSpecChangeModel extends BaseModel {
29+
@EruptField(
30+
views = @View(title = "应用名-appName")
31+
)
32+
private String name;
33+
@EruptField(
34+
views = @View(title = "GIT URL")
35+
)
36+
private String gitUrl;
37+
@EruptField(
38+
views = @View(title = "GIT分支")
39+
)
40+
private String branch;
41+
42+
@EruptField(
43+
views = @View(title = "创建时间")
44+
)
45+
private LocalDateTime createdTime;
46+
47+
@EruptField(
48+
views = @View(title = "appVersion")
49+
)
50+
private String appVersion;
51+
52+
}

0 commit comments

Comments
 (0)