mirror of
https://gitee.com/270580156/weiyu.git
synced 2025-12-30 10:52:26 +00:00
update
This commit is contained in:
@@ -1,41 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import xml.etree.ElementTree as ET
|
|
||||||
import sys
|
|
||||||
|
|
||||||
def validate_jmx(file_path):
|
|
||||||
try:
|
|
||||||
tree = ET.parse(file_path)
|
|
||||||
root = tree.getroot()
|
|
||||||
|
|
||||||
# 检查TestPlan
|
|
||||||
test_plan = root.find('.//TestPlan')
|
|
||||||
if test_plan is None:
|
|
||||||
print("❌ 找不到TestPlan元素")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# 检查用户定义变量
|
|
||||||
user_vars = test_plan.find('.//elementProp[@name="TestPlan.user_defined_variables"]')
|
|
||||||
if user_vars is None:
|
|
||||||
print("❌ 找不到用户定义变量配置")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# 检查是否有空的name属性
|
|
||||||
empty_names = root.findall('.//elementProp[@name=""]')
|
|
||||||
if empty_names:
|
|
||||||
print(f"❌ 找到 {len(empty_names)} 个空的name属性")
|
|
||||||
return False
|
|
||||||
|
|
||||||
print("✅ 文件验证通过")
|
|
||||||
return True
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"❌ 验证失败: {e}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if len(sys.argv) != 2:
|
|
||||||
print("用法: python validate_fix.py <jmx_file>")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
success = validate_jmx(sys.argv[1])
|
|
||||||
sys.exit(0 if success else 1)
|
|
||||||
@@ -3,9 +3,7 @@
|
|||||||
<hashTree>
|
<hashTree>
|
||||||
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="微语登录性能测试">
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="微语登录性能测试">
|
||||||
<stringProp name="TestPlan.comments">微语登录性能测试计划</stringProp>
|
<stringProp name="TestPlan.comments">微语登录性能测试计划</stringProp>
|
||||||
<boolProp name="TestPlan.functional_mode">false</boolProp>
|
|
||||||
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
|
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
|
||||||
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
|
|
||||||
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments">
|
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="host" elementType="Argument">
|
<elementProp name="host" elementType="Argument">
|
||||||
@@ -30,7 +28,6 @@
|
|||||||
</elementProp>
|
</elementProp>
|
||||||
</collectionProp>
|
</collectionProp>
|
||||||
</elementProp>
|
</elementProp>
|
||||||
<stringProp name="TestPlan.user_define_classpath"></stringProp>
|
|
||||||
</TestPlan>
|
</TestPlan>
|
||||||
<hashTree>
|
<hashTree>
|
||||||
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP请求默认值">
|
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP请求默认值">
|
||||||
@@ -40,13 +37,13 @@
|
|||||||
<stringProp name="HTTPSampler.port">${port}</stringProp>
|
<stringProp name="HTTPSampler.port">${port}</stringProp>
|
||||||
<stringProp name="HTTPSampler.protocol">${protocol}</stringProp>
|
<stringProp name="HTTPSampler.protocol">${protocol}</stringProp>
|
||||||
<stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp>
|
<stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments"/>
|
<collectionProp name="Arguments.arguments"/>
|
||||||
</elementProp>
|
</elementProp>
|
||||||
<stringProp name="HTTPSampler.implementation"></stringProp>
|
<stringProp name="HTTPSampler.implementation"></stringProp>
|
||||||
</ConfigTestElement>
|
</ConfigTestElement>
|
||||||
<hashTree/>
|
<hashTree/>
|
||||||
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP头管理器">
|
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP头管理器" enabled="true">
|
||||||
<collectionProp name="HeaderManager.headers">
|
<collectionProp name="HeaderManager.headers">
|
||||||
<elementProp name="Content-Type" elementType="Header">
|
<elementProp name="Content-Type" elementType="Header">
|
||||||
<stringProp name="Header.name">Content-Type</stringProp>
|
<stringProp name="Header.name">Content-Type</stringProp>
|
||||||
@@ -63,36 +60,7 @@
|
|||||||
</collectionProp>
|
</collectionProp>
|
||||||
</HeaderManager>
|
</HeaderManager>
|
||||||
<hashTree/>
|
<hashTree/>
|
||||||
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="获取验证码" enabled="true">
|
|
||||||
<intProp name="ThreadGroup.num_threads">100</intProp>
|
|
||||||
<intProp name="ThreadGroup.ramp_time">10</intProp>
|
|
||||||
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
|
|
||||||
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
|
||||||
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器">
|
|
||||||
<stringProp name="LoopController.loops">1</stringProp>
|
|
||||||
<boolProp name="LoopController.continue_forever">false</boolProp>
|
|
||||||
</elementProp>
|
|
||||||
</ThreadGroup>
|
|
||||||
<hashTree>
|
|
||||||
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="获取验证码" enabled="true">
|
|
||||||
<stringProp name="HTTPSampler.path">/kaptcha/api/v1/get</stringProp>
|
|
||||||
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
|
||||||
<stringProp name="HTTPSampler.method">GET</stringProp>
|
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
|
||||||
<collectionProp name="Arguments.arguments"/>
|
|
||||||
</elementProp>
|
|
||||||
</HTTPSamplerProxy>
|
|
||||||
<hashTree>
|
|
||||||
<JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="提取验证码信息" enabled="true">
|
|
||||||
<stringProp name="JSONPostProcessor.referenceNames">captchaUid,captchaImage</stringProp>
|
|
||||||
<stringProp name="JSONPostProcessor.jsonPathExprs">$.data.captchaUid,$.data.captchaImage</stringProp>
|
|
||||||
<stringProp name="JSONPostProcessor.match_numbers"></stringProp>
|
|
||||||
</JSONPostProcessor>
|
|
||||||
<hashTree/>
|
|
||||||
</hashTree>
|
|
||||||
</hashTree>
|
|
||||||
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="用户名密码登录" enabled="true">
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="用户名密码登录" enabled="true">
|
||||||
<intProp name="ThreadGroup.num_threads">500</intProp>
|
<intProp name="ThreadGroup.num_threads">500</intProp>
|
||||||
<intProp name="ThreadGroup.ramp_time">30</intProp>
|
<intProp name="ThreadGroup.ramp_time">30</intProp>
|
||||||
@@ -125,15 +93,13 @@
|
|||||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="body" elementType="HTTPArgument">
|
<elementProp name="body" elementType="HTTPArgument">
|
||||||
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
||||||
<stringProp name="Argument.value">{
|
<stringProp name="Argument.value">{
|
||||||
"username": "${username}",
|
"username": "${username}",
|
||||||
"password": "${password}",
|
"password": "${password}",
|
||||||
"captchaUid": "${captchaUid}",
|
|
||||||
"captchaCode": "1234",
|
|
||||||
"platform": "BYTEDESK",
|
"platform": "BYTEDESK",
|
||||||
"channel": "WEB",
|
"channel": "WEB",
|
||||||
"device": "JMeter Test"
|
"device": "JMeter Test"
|
||||||
@@ -174,14 +140,12 @@
|
|||||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="body" elementType="HTTPArgument">
|
<elementProp name="body" elementType="HTTPArgument">
|
||||||
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
||||||
<stringProp name="Argument.value">{
|
<stringProp name="Argument.value">{
|
||||||
"mobile": "${mobile}",
|
"mobile": "${mobile}",
|
||||||
"captchaUid": "${captchaUid}",
|
|
||||||
"captchaCode": "1234",
|
|
||||||
"platform": "BYTEDESK",
|
"platform": "BYTEDESK",
|
||||||
"channel": "WEB",
|
"channel": "WEB",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
@@ -200,15 +164,13 @@
|
|||||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="body" elementType="HTTPArgument">
|
<elementProp name="body" elementType="HTTPArgument">
|
||||||
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
||||||
<stringProp name="Argument.value">{
|
<stringProp name="Argument.value">{
|
||||||
"mobile": "${mobile}",
|
"mobile": "${mobile}",
|
||||||
"code": "123456",
|
"code": "123456",
|
||||||
"captchaUid": "${captchaUid}",
|
|
||||||
"captchaCode": "1234",
|
|
||||||
"platform": "BYTEDESK",
|
"platform": "BYTEDESK",
|
||||||
"channel": "WEB",
|
"channel": "WEB",
|
||||||
"device": "JMeter Test"
|
"device": "JMeter Test"
|
||||||
@@ -242,14 +204,12 @@
|
|||||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="body" elementType="HTTPArgument">
|
<elementProp name="body" elementType="HTTPArgument">
|
||||||
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
||||||
<stringProp name="Argument.value">{
|
<stringProp name="Argument.value">{
|
||||||
"email": "${email}",
|
"email": "${email}",
|
||||||
"captchaUid": "${captchaUid}",
|
|
||||||
"captchaCode": "1234",
|
|
||||||
"platform": "BYTEDESK",
|
"platform": "BYTEDESK",
|
||||||
"channel": "WEB",
|
"channel": "WEB",
|
||||||
"type": "email"
|
"type": "email"
|
||||||
@@ -268,7 +228,7 @@
|
|||||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="body" elementType="HTTPArgument">
|
<elementProp name="body" elementType="HTTPArgument">
|
||||||
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
||||||
@@ -308,7 +268,7 @@
|
|||||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||||
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
|
||||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments">
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
|
||||||
<collectionProp name="Arguments.arguments">
|
<collectionProp name="Arguments.arguments">
|
||||||
<elementProp name="body" elementType="HTTPArgument">
|
<elementProp name="body" elementType="HTTPArgument">
|
||||||
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
||||||
@@ -326,7 +286,7 @@
|
|||||||
</HTTPSamplerProxy>
|
</HTTPSamplerProxy>
|
||||||
<hashTree/>
|
<hashTree/>
|
||||||
</hashTree>
|
</hashTree>
|
||||||
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true">
|
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树">
|
||||||
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
||||||
<objProp>
|
<objProp>
|
||||||
<name>saveConfig</name>
|
<name>saveConfig</name>
|
||||||
@@ -363,7 +323,7 @@
|
|||||||
<stringProp name="filename"></stringProp>
|
<stringProp name="filename"></stringProp>
|
||||||
</ResultCollector>
|
</ResultCollector>
|
||||||
<hashTree/>
|
<hashTree/>
|
||||||
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
|
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告">
|
||||||
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
||||||
<objProp>
|
<objProp>
|
||||||
<name>saveConfig</name>
|
<name>saveConfig</name>
|
||||||
|
|||||||
@@ -2,20 +2,7 @@
|
|||||||
* @Author: jackning 270580156@qq.com
|
* @Author: jackning 270580156@qq.com
|
||||||
* @Date: 2024-01-29 16:21:24
|
* @Date: 2024-01-29 16:21:24
|
||||||
* @LastEditors: jackning 270580156@qq.com
|
* @LastEditors: jackning 270580156@qq.com
|
||||||
* @LastEditTime: 2025-08-03 18:41:49
|
* @LastEditTime: 2025-08-03 19:23:26
|
||||||
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
|
|
||||||
* Please be aware of the BSL license restrictions before installing Bytedesk IM –
|
|
||||||
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
|
|
||||||
* Business Source License 1.1: https://github.com/Bytedesk/bytedesk/blob/main/LICENSE
|
|
||||||
* contact: 270580156@qq.com
|
|
||||||
*
|
|
||||||
* Copyright (c) 2025 by bytedesk.com, All Rights Reserved.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
* @Author: jackning 270580156@qq.com
|
|
||||||
* @Date: 2024-01-29 16:21:24
|
|
||||||
* @LastEditors: jackning 270580156@qq.com
|
|
||||||
* @LastEditTime: 2025-07-17 12:16:23
|
|
||||||
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
|
* @Description: bytedesk.com https://github.com/Bytedesk/bytedesk
|
||||||
* Please be aware of the BSL license restrictions before installing Bytedesk IM –
|
* Please be aware of the BSL license restrictions before installing Bytedesk IM –
|
||||||
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
|
* selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license.
|
||||||
|
|||||||
Reference in New Issue
Block a user