Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MeterSphere
metersphere
提交
2bed94ef
M
metersphere
项目概览
MeterSphere
/
metersphere
上一次同步 大约 3 年
通知
25
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
metersphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2bed94ef
编写于
5月 06, 2020
作者:
Q
q4speed
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
NaN
上级
69586479
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
82 addition
and
22 deletion
+82
-22
backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java
...a/io/metersphere/api/jmeter/APIBackendListenerClient.java
+26
-2
backend/src/main/java/io/metersphere/api/service/ApiTestService.java
.../main/java/io/metersphere/api/service/ApiTestService.java
+15
-9
frontend/src/business/components/api/test/ApiTestConfig.vue
frontend/src/business/components/api/test/ApiTestConfig.vue
+1
-0
frontend/src/business/components/api/test/model/JMX.js
frontend/src/business/components/api/test/model/JMX.js
+28
-0
frontend/src/business/components/api/test/model/ScenarioModel.js
...d/src/business/components/api/test/model/ScenarioModel.js
+12
-11
未找到文件。
backend/src/main/java/io/metersphere/api/jmeter/APIBackendListenerClient.java
浏览文件 @
2bed94ef
package
io.metersphere.api.jmeter
;
import
org.apache.jmeter.assertions.AssertionResult
;
import
org.apache.jmeter.samplers.SampleResult
;
import
org.apache.jmeter.visualizers.backend.AbstractBackendListenerClient
;
import
org.apache.jmeter.visualizers.backend.BackendListenerContext
;
...
...
@@ -14,8 +15,31 @@ public class APIBackendListenerClient extends AbstractBackendListenerClient impl
@Override
public
void
handleSampleResults
(
List
<
SampleResult
>
sampleResults
,
BackendListenerContext
context
)
{
System
.
out
.
println
(
context
);
System
.
out
.
println
(
sampleResults
.
get
(
0
).
getAssertionResults
());
System
.
out
.
println
(
context
.
getParameter
(
"id"
));
sampleResults
.
forEach
(
result
->
{
for
(
AssertionResult
assertionResult
:
result
.
getAssertionResults
())
{
System
.
out
.
println
(
assertionResult
.
getName
()
+
": "
+
assertionResult
.
isError
());
System
.
out
.
println
(
assertionResult
.
getName
()
+
": "
+
assertionResult
.
isFailure
());
System
.
out
.
println
(
assertionResult
.
getName
()
+
": "
+
assertionResult
.
getFailureMessage
());
}
println
(
"getSampleLabel"
,
result
.
getSampleLabel
());
println
(
"getErrorCount"
,
result
.
getErrorCount
());
println
(
"getRequestHeaders"
,
result
.
getRequestHeaders
());
println
(
"getResponseHeaders"
,
result
.
getResponseHeaders
());
println
(
"getSampleLabel"
,
result
.
getSampleLabel
());
println
(
"getSampleLabel"
,
result
.
getSampleLabel
());
println
(
"getResponseCode"
,
result
.
getResponseCode
());
println
(
"getResponseCode size"
,
result
.
getResponseData
().
length
);
println
(
"getLatency"
,
result
.
getLatency
());
println
(
"end - start"
,
result
.
getEndTime
()
-
result
.
getStartTime
());
println
(
"getTimeStamp"
,
result
.
getTimeStamp
());
println
(
"getTime"
,
result
.
getTime
());
});
System
.
err
.
println
(
count
.
addAndGet
(
sampleResults
.
size
()));
}
private
void
println
(
String
name
,
Object
value
)
{
System
.
out
.
println
(
name
+
": "
+
value
);
}
}
backend/src/main/java/io/metersphere/api/service/ApiTestService.java
浏览文件 @
2bed94ef
...
...
@@ -14,17 +14,11 @@ import io.metersphere.commons.exception.MSException;
import
io.metersphere.i18n.Translator
;
import
io.metersphere.service.FileService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.jmeter.save.SaveService
;
import
org.apache.jmeter.services.FileServer
;
import
org.apache.jorphan.collections.HashTree
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.FileCopyUtils
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.util.List
;
import
java.util.UUID
;
...
...
@@ -89,14 +83,15 @@ public class ApiTestService {
apiTestMapper
.
deleteByPrimaryKey
(
request
.
getId
());
}
public
void
run
(
SaveAPITestRequest
request
,
List
<
MultipartFile
>
files
)
{
save
(
request
,
files
);
public
String
run
(
SaveAPITestRequest
request
,
List
<
MultipartFile
>
files
)
{
String
id
=
save
(
request
,
files
);
try
{
changeStatus
(
request
.
getId
(),
APITestStatus
.
Running
);
jMeterService
.
run
(
files
.
get
(
0
).
getInputStream
());
}
catch
(
IOException
e
)
{
MSException
.
throwException
(
Translator
.
get
(
"api_load_script_error"
));
}
return
id
;
}
public
void
changeStatus
(
String
id
,
APITestStatus
status
)
{
...
...
@@ -145,9 +140,20 @@ public class ApiTestService {
if
(!
CollectionUtils
.
isEmpty
(
ApiTestFiles
))
{
final
List
<
String
>
fileIds
=
ApiTestFiles
.
stream
().
map
(
ApiTestFile:
:
getFileId
).
collect
(
Collectors
.
toList
());
fileService
.
deleteFileByIds
(
fileIds
);
}
}
private
ApiTestFile
getFileByTestId
(
String
testId
)
{
ApiTestFileExample
ApiTestFileExample
=
new
ApiTestFileExample
();
ApiTestFileExample
.
createCriteria
().
andTestIdEqualTo
(
testId
);
final
List
<
ApiTestFile
>
ApiTestFiles
=
apiTestFileMapper
.
selectByExample
(
ApiTestFileExample
);
apiTestFileMapper
.
selectByExample
(
ApiTestFileExample
);
if
(!
CollectionUtils
.
isEmpty
(
ApiTestFiles
))
{
return
ApiTestFiles
.
get
(
0
);
}
else
{
return
null
;
}
}
}
frontend/src/business/components/api/test/ApiTestConfig.vue
浏览文件 @
2bed94ef
...
...
@@ -123,6 +123,7 @@
let
jmx
=
this
.
test
.
toJMX
();
let
blob
=
new
Blob
([
jmx
.
xml
],
{
type
:
"
application/octet-stream
"
});
formData
.
append
(
"
files
"
,
new
File
([
blob
],
jmx
.
name
));
console
.
log
(
jmx
.
xml
)
return
{
method
:
'
POST
'
,
...
...
frontend/src/business/components/api/test/model/JMX.js
浏览文件 @
2bed94ef
...
...
@@ -369,3 +369,31 @@ export class Arguments extends DefaultTestElement {
}
}
export
class
BackendListener
extends
DefaultTestElement
{
constructor
(
testName
,
className
,
args
)
{
super
(
'
BackendListener
'
,
'
BackendListenerGui
'
,
'
BackendListener
'
,
testName
||
'
Backend Listener
'
);
this
.
stringProp
(
'
classname
'
,
className
);
this
.
add
(
new
ElementArguments
(
args
));
}
}
export
class
ElementArguments
extends
Element
{
constructor
(
args
)
{
super
(
'
elementProp
'
,
{
name
:
"
arguments
"
,
elementType
:
"
Arguments
"
,
guiclass
:
"
ArgumentsPanel
"
,
testclass
:
"
Arguments
"
,
enabled
:
"
true
"
});
let
collectionProp
=
this
.
collectionProp
(
'
Arguments.arguments
'
);
args
.
forEach
(
arg
=>
{
let
elementProp
=
collectionProp
.
elementProp
(
arg
.
name
,
'
Argument
'
);
elementProp
.
stringProp
(
'
Argument.name
'
,
arg
.
name
);
elementProp
.
stringProp
(
'
Argument.value
'
,
arg
.
value
);
elementProp
.
stringProp
(
'
Argument.metadata
'
,
"
=
"
);
});
}
}
frontend/src/business/components/api/test/model/ScenarioModel.js
浏览文件 @
2bed94ef
...
...
@@ -9,7 +9,8 @@ import {
HTTPSamplerArguments
,
ResponseCodeAssertion
,
ResponseDataAssertion
,
ResponseHeadersAssertion
,
DefaultTestElement
ResponseHeadersAssertion
,
BackendListener
}
from
"
./JMX
"
;
export
const
generateId
=
function
()
{
...
...
@@ -259,7 +260,7 @@ export class ResponseTime extends AssertionType {
}
}
/** ------------------------------------ **/
/** ------------------------------------
------------------------------------
**/
const
JMX_ASSERTION_CONDITION
=
{
MATCH
:
1
,
CONTAINS
:
1
<<
1
,
...
...
@@ -301,16 +302,9 @@ class JMeterTestPlan extends Element {
}
}
class
APIBackendListener
extends
DefaultTestElement
{
constructor
()
{
super
(
'
BackendListener
'
,
'
BackendListenerGui
'
,
'
BackendListener
'
,
'
API Backend Listener
'
);
this
.
stringProp
(
'
classname
'
,
'
io.metersphere.api.jmeter.APIBackendListenerClient
'
);
}
}
class
JMXGenerator
{
constructor
(
test
)
{
if
(
!
test
||
!
(
test
instanceof
Test
))
return
;
if
(
!
test
||
!
test
.
id
||
!
(
test
instanceof
Test
))
return
;
let
testPlan
=
new
TestPlan
(
test
.
name
);
test
.
scenarioDefinition
.
forEach
(
scenario
=>
{
...
...
@@ -332,7 +326,7 @@ class JMXGenerator {
threadGroup
.
put
(
httpSamplerProxy
);
})
th
readGroup
.
put
(
new
APIBackendListener
()
);
th
is
.
addBackendListener
(
threadGroup
,
test
.
id
);
testPlan
.
put
(
threadGroup
);
})
...
...
@@ -393,6 +387,13 @@ class JMXGenerator {
}
}
addBackendListener
(
threadGroup
,
testId
)
{
let
testName
=
'
API Backend Listener
'
;
let
className
=
'
io.metersphere.api.jmeter.APIBackendListenerClient
'
;
let
args
=
[{
name
:
'
id
'
,
value
:
testId
}];
threadGroup
.
put
(
new
BackendListener
(
testName
,
className
,
args
));
}
filter
(
config
)
{
return
config
.
isValid
();
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录