## 新增功能 - **月度健康数据测试脚本** (`health-monthly-data-test.jmx`) - 模拟真实用户过去30天健康数据场景 - 支持日常数据批量导入测试 (50并发用户,10分钟) - 高频数据流测试 (100并发用户,30分钟) - 历史数据大批量导入测试 (20并发用户,200循环) - **数据库压力测试脚本** (`database-stress-test.jmx`) - 数据库连接池压力测试 (800并发用户,15分钟) - 极限并发测试 (1500并发用户,20分钟) - 事务完整性压力测试 (300并发用户,200循环) ## 测试结果 - **月度数据测试**: 10.9 TPS, 0% 错误率, 平均响应时间 3.9ms - **数据库压力测试**: 2400+ TPS, 0% 错误率, 系统稳定运行 ## 技术特性 - 动态数据生成 (心率、血氧、体温、步数等) - 真实时间戳模拟 (过去1-3个月历史数据) - 复杂JSON数据结构 (睡眠、运动、锻炼数据) - 并发用户渐进式增加策略 - 完整的性能监控和报告生成 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
420 lines
25 KiB
XML
420 lines
25 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
|
|
<hashTree>
|
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Database Stress Performance Test" enabled="true">
|
|
<stringProp name="TestPlan.comments">数据库压力测试 - 寻找系统性能边界</stringProp>
|
|
<boolProp name="TestPlan.functional_mode">false</boolProp>
|
|
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
|
|
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
|
|
<elementProp name="TestPlan.arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
|
<collectionProp name="Arguments.arguments"/>
|
|
</elementProp>
|
|
<stringProp name="TestPlan.user_define_classpath"></stringProp>
|
|
</TestPlan>
|
|
<hashTree>
|
|
|
|
<!-- 用户自定义变量 -->
|
|
<Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
|
<collectionProp name="Arguments.arguments">
|
|
<elementProp name="base_url" elementType="Argument">
|
|
<stringProp name="Argument.name">base_url</stringProp>
|
|
<stringProp name="Argument.value">localhost:9998</stringProp>
|
|
<stringProp name="Argument.metadata">=</stringProp>
|
|
</elementProp>
|
|
<elementProp name="max_threads" elementType="Argument">
|
|
<stringProp name="Argument.name">max_threads</stringProp>
|
|
<stringProp name="Argument.value">1000</stringProp>
|
|
<stringProp name="Argument.metadata">=</stringProp>
|
|
</elementProp>
|
|
</collectionProp>
|
|
</Arguments>
|
|
<hashTree/>
|
|
|
|
<!-- HTTP Request Defaults -->
|
|
<ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true">
|
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
|
|
<collectionProp name="Arguments.arguments"/>
|
|
</elementProp>
|
|
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
|
<stringProp name="HTTPSampler.port">9998</stringProp>
|
|
<stringProp name="HTTPSampler.protocol">http</stringProp>
|
|
<stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp>
|
|
<stringProp name="HTTPSampler.path"></stringProp>
|
|
<stringProp name="HTTPSampler.concurrentPool">10</stringProp>
|
|
<stringProp name="HTTPSampler.connect_timeout">10000</stringProp>
|
|
<stringProp name="HTTPSampler.response_timeout">30000</stringProp>
|
|
</ConfigTestElement>
|
|
<hashTree/>
|
|
|
|
<!-- HTTP Header Manager -->
|
|
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
|
|
<collectionProp name="HeaderManager.headers">
|
|
<elementProp name="" elementType="Header">
|
|
<stringProp name="Header.name">Content-Type</stringProp>
|
|
<stringProp name="Header.value">application/json</stringProp>
|
|
</elementProp>
|
|
<elementProp name="" elementType="Header">
|
|
<stringProp name="Header.name">User-Agent</stringProp>
|
|
<stringProp name="Header.value">DatabaseStressTest/1.0</stringProp>
|
|
</elementProp>
|
|
</collectionProp>
|
|
</HeaderManager>
|
|
<hashTree/>
|
|
|
|
<!-- 场景1:数据库连接池压力测试 -->
|
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="1. Database Connection Pool Stress" enabled="true">
|
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
|
<boolProp name="LoopController.continue_forever">true</boolProp>
|
|
<stringProp name="LoopController.loops">-1</stringProp>
|
|
</elementProp>
|
|
<stringProp name="ThreadGroup.num_threads">800</stringProp>
|
|
<stringProp name="ThreadGroup.ramp_time">120</stringProp>
|
|
<boolProp name="ThreadGroup.scheduler">true</boolProp>
|
|
<stringProp name="ThreadGroup.duration">900</stringProp>
|
|
<stringProp name="ThreadGroup.delay"></stringProp>
|
|
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
|
|
</ThreadGroup>
|
|
<hashTree>
|
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Database Intensive Health Upload" enabled="true">
|
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
|
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
|
|
<collectionProp name="Arguments.arguments">
|
|
<elementProp name="" elementType="HTTPArgument">
|
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
|
<stringProp name="Argument.value">{
|
|
"data": {
|
|
"deviceSn": "DBSTRESS${__threadNum}_${__Random(100000,999999)}",
|
|
"customerId": "1969767962803757058",
|
|
"orgId": "1969969505868005378",
|
|
"userId": "DBUSER${__threadNum}_${__Random(100000,999999)}",
|
|
"heart_rate": ${__Random(50,120)},
|
|
"blood_oxygen": ${__Random(90,100)},
|
|
"body_temperature": ${__Random(350,400,)}/10,
|
|
"step": ${__Random(0,25000)},
|
|
"distance": ${__Random(0,200,)}/10,
|
|
"calorie": ${__Random(50,1000,)}/10,
|
|
"latitude": ${__Random(22000,23000,)}/1000,
|
|
"longitude": ${__Random(113000,114000,)}/1000,
|
|
"altitude": ${__Random(0,300)},
|
|
"stress": ${__Random(10,100)},
|
|
"upload_method": "database_stress",
|
|
"blood_pressure_systolic": ${__Random(90,180)},
|
|
"blood_pressure_diastolic": ${__Random(50,110)},
|
|
"sleepData": "{\"code\":0,\"data\":[{\"endTimeStamp\":${__time(,)},\"startTimeStamp\":${__timeShift(,,-${__Random(25200000,32400000)},)},\"type\":2},{\"endTimeStamp\":${__timeShift(,,-${__Random(86400000,172800000)},)},\"startTimeStamp\":${__timeShift(,,-${__Random(111600000,198000000)},)},\"type\":1}],\"name\":\"sleep\",\"type\":\"history\"}",
|
|
"exerciseDailyData": "{\"data\":[{\"data\":${__Random(50,300)},\"timeStamp\":${__time(,)}},{\"data\":${__Random(50,300)},\"timeStamp\":${__timeShift(,,-3600000,)}},{\"data\":${__Random(50,300)},\"timeStamp\":${__timeShift(,,-7200000,)}},{\"data\":${__Random(50,300)},\"timeStamp\":${__timeShift(,,-10800000,)}},{\"data\":${__Random(50,300)},\"timeStamp\":${__timeShift(,,-14400000,)}}],\"name\":\"calorie\",\"type\":\"history\",\"code\":0}",
|
|
"exerciseWeekData": "{\"data\":[{\"timeStamps\":${__time(,)},\"totalSteps\":${__Random(50000,100000)},\"strengthTimes\":${__Random(3000,8000)},\"totalTime\":${__Random(100,300)}},{\"timeStamps\":${__timeShift(,,-604800000,)},\"totalSteps\":${__Random(50000,100000)},\"strengthTimes\":${__Random(3000,8000)},\"totalTime\":${__Random(100,300)}},{\"timeStamps\":${__timeShift(,,-1209600000,)},\"totalSteps\":${__Random(50000,100000)},\"strengthTimes\":${__Random(3000,8000)},\"totalTime\":${__Random(100,300)}},{\"timeStamps\":${__timeShift(,,-1814400000,)},\"totalSteps\":${__Random(50000,100000)},\"strengthTimes\":${__Random(3000,8000)},\"totalTime\":${__Random(100,300)}}],\"name\":\"daily\",\"type\":\"history\",\"code\":0}",
|
|
"scientificSleepData": "null",
|
|
"workoutData": "{\"code\":0,\"data\":[{\"calorie\":${__Random(300,800)},\"distance\":${__Random(8000,20000)},\"startTimeStamp\":${__timeShift(,,-${__Random(3600000,86400000)},)},\"endTimeStamp\":${__timeShift(,,-${__Random(1800000,82800000)},)},\"workoutType\":${__Random(10,50)},\"recordId\":${__Random(10000,99999)}},{\"calorie\":${__Random(300,800)},\"distance\":${__Random(8000,20000)},\"startTimeStamp\":${__timeShift(,,-${__Random(90000000,172800000)},)},\"endTimeStamp\":${__timeShift(,,-${__Random(88200000,171000000)},)},\"workoutType\":${__Random(10,50)},\"recordId\":${__Random(10000,99999)}}],\"name\":\"workout\",\"type\":\"history\"}",
|
|
"timestamp": "${__time(yyyy-MM-dd HH:mm:ss)}"
|
|
}
|
|
}</stringProp>
|
|
<stringProp name="Argument.metadata">=</stringProp>
|
|
</elementProp>
|
|
</collectionProp>
|
|
</elementProp>
|
|
<stringProp name="HTTPSampler.domain"></stringProp>
|
|
<stringProp name="HTTPSampler.port"></stringProp>
|
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
|
<stringProp name="HTTPSampler.path">/api/health/upload</stringProp>
|
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
|
|
<stringProp name="HTTPSampler.response_timeout"></stringProp>
|
|
</HTTPSamplerProxy>
|
|
<hashTree>
|
|
<!-- Response Assertion -->
|
|
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Status Check" enabled="true">
|
|
<collectionProp name="Asserion.test_strings">
|
|
<stringProp name="49586">200</stringProp>
|
|
</collectionProp>
|
|
<stringProp name="Assertion.custom_message"></stringProp>
|
|
<stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
|
|
<boolProp name="Assertion.assume_success">false</boolProp>
|
|
<intProp name="Assertion.test_type">1</intProp>
|
|
</ResponseAssertion>
|
|
<hashTree/>
|
|
|
|
<!-- Constant Timer for database stress -->
|
|
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Database Stress Timer" enabled="true">
|
|
<stringProp name="ConstantTimer.delay">100</stringProp>
|
|
</ConstantTimer>
|
|
<hashTree/>
|
|
</hashTree>
|
|
</hashTree>
|
|
|
|
<!-- 场景2:极限并发测试 -->
|
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="2. Maximum Concurrency Test" enabled="false">
|
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
|
<boolProp name="LoopController.continue_forever">true</boolProp>
|
|
<stringProp name="LoopController.loops">-1</stringProp>
|
|
</elementProp>
|
|
<stringProp name="ThreadGroup.num_threads">1500</stringProp>
|
|
<stringProp name="ThreadGroup.ramp_time">180</stringProp>
|
|
<boolProp name="ThreadGroup.scheduler">true</boolProp>
|
|
<stringProp name="ThreadGroup.duration">1200</stringProp>
|
|
<stringProp name="ThreadGroup.delay"></stringProp>
|
|
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
|
|
</ThreadGroup>
|
|
<hashTree>
|
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Maximum Concurrency Upload" enabled="true">
|
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
|
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
|
|
<collectionProp name="Arguments.arguments">
|
|
<elementProp name="" elementType="HTTPArgument">
|
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
|
<stringProp name="Argument.value">{
|
|
"data": {
|
|
"deviceSn": "MAXCON${__threadNum}_${__Random(1000000,9999999)}",
|
|
"customerId": "1969767962803757058",
|
|
"orgId": "1969969505868005378",
|
|
"userId": "MAXUSER${__threadNum}_${__Random(1000000,9999999)}",
|
|
"heart_rate": ${__Random(60,100)},
|
|
"blood_oxygen": ${__Random(95,100)},
|
|
"body_temperature": ${__Random(360,375,)}/10,
|
|
"step": ${__Random(5000,15000)},
|
|
"distance": ${__Random(30,100,)}/10,
|
|
"calorie": ${__Random(200,600,)}/10,
|
|
"latitude": ${__Random(22000,23000,)}/1000,
|
|
"longitude": ${__Random(113000,114000,)}/1000,
|
|
"altitude": ${__Random(0,100)},
|
|
"stress": ${__Random(30,80)},
|
|
"upload_method": "max_concurrency",
|
|
"blood_pressure_systolic": ${__Random(110,140)},
|
|
"blood_pressure_diastolic": ${__Random(70,90)},
|
|
"sleepData": "null",
|
|
"exerciseDailyData": "null",
|
|
"exerciseWeekData": "null",
|
|
"scientificSleepData": "null",
|
|
"workoutData": "null",
|
|
"timestamp": "${__time(yyyy-MM-dd HH:mm:ss)}"
|
|
}
|
|
}</stringProp>
|
|
<stringProp name="Argument.metadata">=</stringProp>
|
|
</elementProp>
|
|
</collectionProp>
|
|
</elementProp>
|
|
<stringProp name="HTTPSampler.domain"></stringProp>
|
|
<stringProp name="HTTPSampler.port"></stringProp>
|
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
|
<stringProp name="HTTPSampler.path">/api/health/upload</stringProp>
|
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
|
|
<stringProp name="HTTPSampler.response_timeout"></stringProp>
|
|
</HTTPSamplerProxy>
|
|
<hashTree>
|
|
<!-- Constant Timer for rapid fire -->
|
|
<ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="Rapid Fire Timer" enabled="true">
|
|
<stringProp name="ConstantTimer.delay">50</stringProp>
|
|
</ConstantTimer>
|
|
<hashTree/>
|
|
</hashTree>
|
|
</hashTree>
|
|
|
|
<!-- 场景3:事务完整性压力测试 -->
|
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="3. Transaction Integrity Stress" enabled="false">
|
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
|
|
<boolProp name="LoopController.continue_forever">false</boolProp>
|
|
<stringProp name="LoopController.loops">200</stringProp>
|
|
</elementProp>
|
|
<stringProp name="ThreadGroup.num_threads">300</stringProp>
|
|
<stringProp name="ThreadGroup.ramp_time">60</stringProp>
|
|
<boolProp name="ThreadGroup.scheduler">false</boolProp>
|
|
<stringProp name="ThreadGroup.duration"></stringProp>
|
|
<stringProp name="ThreadGroup.delay"></stringProp>
|
|
</ThreadGroup>
|
|
<hashTree>
|
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Complex Transaction Upload" enabled="true">
|
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
|
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments">
|
|
<collectionProp name="Arguments.arguments">
|
|
<elementProp name="" elementType="HTTPArgument">
|
|
<boolProp name="HTTPArgument.always_encode">false</boolProp>
|
|
<stringProp name="Argument.value">{
|
|
"data": {
|
|
"deviceSn": "TXNSTRESS${__threadNum}_${__Random(100000,999999)}_${__time(yyyyMMddHHmmss)}",
|
|
"customerId": "1969767962803757058",
|
|
"orgId": "1969969505868005378",
|
|
"userId": "TXNUSER${__threadNum}_${__Random(100000,999999)}",
|
|
"heart_rate": ${__Random(40,150)},
|
|
"blood_oxygen": ${__Random(85,100)},
|
|
"body_temperature": ${__Random(350,420,)}/10,
|
|
"step": ${__Random(0,50000)},
|
|
"distance": ${__Random(0,500,)}/10,
|
|
"calorie": ${__Random(0,2000,)}/10,
|
|
"latitude": ${__Random(20000,25000,)}/1000,
|
|
"longitude": ${__Random(110000,120000,)}/1000,
|
|
"altitude": ${__Random(-100,1000)},
|
|
"stress": ${__Random(0,100)},
|
|
"upload_method": "transaction_stress",
|
|
"blood_pressure_systolic": ${__Random(80,200)},
|
|
"blood_pressure_diastolic": ${__Random(40,120)},
|
|
"sleepData": "{\"code\":0,\"data\":[{\"endTimeStamp\":${__time(,)},\"startTimeStamp\":${__timeShift(,,-${__Random(21600000,43200000)},)},\"type\":${__Random(1,3)}},{\"endTimeStamp\":${__timeShift(,,-${__Random(86400000,259200000)},)},\"startTimeStamp\":${__timeShift(,,-${__Random(108000000,281200000)},)},\"type\":${__Random(1,3)}},{\"endTimeStamp\":${__timeShift(,,-${__Random(345600000,604800000)},)},\"startTimeStamp\":${__timeShift(,,-${__Random(367200000,626800000)},)},\"type\":${__Random(1,3)}}],\"name\":\"sleep\",\"type\":\"history\"}",
|
|
"exerciseDailyData": "{\"data\":[{\"data\":${__Random(0,500)},\"timeStamp\":${__time(,)}},{\"data\":${__Random(0,500)},\"timeStamp\":${__timeShift(,,-3600000,)}},{\"data\":${__Random(0,500)},\"timeStamp\":${__timeShift(,,-7200000,)}},{\"data\":${__Random(0,500)},\"timeStamp\":${__timeShift(,,-10800000,)}},{\"data\":${__Random(0,500)},\"timeStamp\":${__timeShift(,,-14400000,)}},{\"data\":${__Random(0,500)},\"timeStamp\":${__timeShift(,,-18000000,)}},{\"data\":${__Random(0,500)},\"timeStamp\":${__timeShift(,,-21600000,)}}],\"name\":\"calorie\",\"type\":\"history\",\"code\":0}",
|
|
"exerciseWeekData": "{\"data\":[{\"timeStamps\":${__time(,)},\"totalSteps\":${__Random(0,150000)},\"strengthTimes\":${__Random(0,10000)},\"totalTime\":${__Random(0,500)}},{\"timeStamps\":${__timeShift(,,-604800000,)},\"totalSteps\":${__Random(0,150000)},\"strengthTimes\":${__Random(0,10000)},\"totalTime\":${__Random(0,500)}},{\"timeStamps\":${__timeShift(,,-1209600000,)},\"totalSteps\":${__Random(0,150000)},\"strengthTimes\":${__Random(0,10000)},\"totalTime\":${__Random(0,500)}},{\"timeStamps\":${__timeShift(,,-1814400000,)},\"totalSteps\":${__Random(0,150000)},\"strengthTimes\":${__Random(0,10000)},\"totalTime\":${__Random(0,500)}},{\"timeStamps\":${__timeShift(,,-2419200000,)},\"totalSteps\":${__Random(0,150000)},\"strengthTimes\":${__Random(0,10000)},\"totalTime\":${__Random(0,500)}}],\"name\":\"daily\",\"type\":\"history\",\"code\":0}",
|
|
"scientificSleepData": "null",
|
|
"workoutData": "{\"code\":0,\"data\":[{\"calorie\":${__Random(0,1000)},\"distance\":${__Random(0,30000)},\"startTimeStamp\":${__timeShift(,,-${__Random(3600000,172800000)},)},\"endTimeStamp\":${__timeShift(,,-${__Random(1800000,171000000)},)},\"workoutType\":${__Random(1,100)},\"recordId\":${__Random(1,999999)}},{\"calorie\":${__Random(0,1000)},\"distance\":${__Random(0,30000)},\"startTimeStamp\":${__timeShift(,,-${__Random(172800000,345600000)},)},\"endTimeStamp\":${__timeShift(,,-${__Random(171000000,344000000)},)},\"workoutType\":${__Random(1,100)},\"recordId\":${__Random(1,999999)}},{\"calorie\":${__Random(0,1000)},\"distance\":${__Random(0,30000)},\"startTimeStamp\":${__timeShift(,,-${__Random(345600000,518400000)},)},\"endTimeStamp\":${__timeShift(,,-${__Random(344000000,517000000)},)},\"workoutType\":${__Random(1,100)},\"recordId\":${__Random(1,999999)}}],\"name\":\"workout\",\"type\":\"history\"}",
|
|
"timestamp": "${__time(yyyy-MM-dd HH:mm:ss)}"
|
|
}
|
|
}</stringProp>
|
|
<stringProp name="Argument.metadata">=</stringProp>
|
|
</elementProp>
|
|
</collectionProp>
|
|
</elementProp>
|
|
<stringProp name="HTTPSampler.domain"></stringProp>
|
|
<stringProp name="HTTPSampler.port"></stringProp>
|
|
<stringProp name="HTTPSampler.protocol"></stringProp>
|
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
|
<stringProp name="HTTPSampler.path">/api/health/upload</stringProp>
|
|
<stringProp name="HTTPSampler.method">POST</stringProp>
|
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
|
|
<stringProp name="HTTPSampler.response_timeout"></stringProp>
|
|
</HTTPSamplerProxy>
|
|
<hashTree>
|
|
<!-- Random Timer for transaction complexity -->
|
|
<UniformRandomTimer guiclass="UniformRandomTimerGui" testclass="UniformRandomTimer" testname="Transaction Timer" enabled="true">
|
|
<stringProp name="ConstantTimer.delay">500</stringProp>
|
|
<stringProp name="RandomTimer.range">2000</stringProp>
|
|
</UniformRandomTimer>
|
|
<hashTree/>
|
|
</hashTree>
|
|
</hashTree>
|
|
|
|
<!-- 结果监听器 -->
|
|
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
|
|
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
|
<objProp>
|
|
<name>saveConfig</name>
|
|
<value class="SampleSaveConfiguration">
|
|
<time>true</time>
|
|
<latency>true</latency>
|
|
<timestamp>true</timestamp>
|
|
<success>true</success>
|
|
<label>true</label>
|
|
<code>true</code>
|
|
<message>true</message>
|
|
<threadName>true</threadName>
|
|
<dataType>true</dataType>
|
|
<encoding>false</encoding>
|
|
<assertions>true</assertions>
|
|
<subresults>true</subresults>
|
|
<responseData>false</responseData>
|
|
<samplerData>false</samplerData>
|
|
<xml>false</xml>
|
|
<fieldNames>true</fieldNames>
|
|
<responseHeaders>false</responseHeaders>
|
|
<requestHeaders>false</requestHeaders>
|
|
<responseDataOnError>false</responseDataOnError>
|
|
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
|
<assertionsResultsToSave>0</assertionsResultsToSave>
|
|
<bytes>true</bytes>
|
|
<sentBytes>true</sentBytes>
|
|
<url>true</url>
|
|
<threadCounts>true</threadCounts>
|
|
<idleTime>true</idleTime>
|
|
<connectTime>true</connectTime>
|
|
</value>
|
|
</objProp>
|
|
<stringProp name="filename">database-stress-results.jtl</stringProp>
|
|
</ResultCollector>
|
|
<hashTree/>
|
|
|
|
<!-- Summary Report -->
|
|
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true">
|
|
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
|
<objProp>
|
|
<name>saveConfig</name>
|
|
<value class="SampleSaveConfiguration">
|
|
<time>true</time>
|
|
<latency>true</latency>
|
|
<timestamp>true</timestamp>
|
|
<success>true</success>
|
|
<label>true</label>
|
|
<code>true</code>
|
|
<message>true</message>
|
|
<threadName>true</threadName>
|
|
<dataType>true</dataType>
|
|
<encoding>false</encoding>
|
|
<assertions>true</assertions>
|
|
<subresults>true</subresults>
|
|
<responseData>false</responseData>
|
|
<samplerData>false</samplerData>
|
|
<xml>false</xml>
|
|
<fieldNames>true</fieldNames>
|
|
<responseHeaders>false</responseHeaders>
|
|
<requestHeaders>false</requestHeaders>
|
|
<responseDataOnError>false</responseDataOnError>
|
|
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
|
<assertionsResultsToSave>0</assertionsResultsToSave>
|
|
<bytes>true</bytes>
|
|
<sentBytes>true</sentBytes>
|
|
<url>true</url>
|
|
<threadCounts>true</threadCounts>
|
|
<idleTime>true</idleTime>
|
|
<connectTime>true</connectTime>
|
|
</value>
|
|
</objProp>
|
|
<stringProp name="filename"></stringProp>
|
|
</ResultCollector>
|
|
<hashTree/>
|
|
|
|
<!-- Aggregate Report -->
|
|
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report" enabled="true">
|
|
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
|
<objProp>
|
|
<name>saveConfig</name>
|
|
<value class="SampleSaveConfiguration">
|
|
<time>true</time>
|
|
<latency>true</latency>
|
|
<timestamp>true</timestamp>
|
|
<success>true</success>
|
|
<label>true</label>
|
|
<code>true</code>
|
|
<message>true</message>
|
|
<threadName>true</threadName>
|
|
<dataType>true</dataType>
|
|
<encoding>false</encoding>
|
|
<assertions>true</assertions>
|
|
<subresults>true</subresults>
|
|
<responseData>false</responseData>
|
|
<samplerData>false</samplerData>
|
|
<xml>false</xml>
|
|
<fieldNames>true</fieldNames>
|
|
<responseHeaders>false</responseHeaders>
|
|
<requestHeaders>false</requestHeaders>
|
|
<responseDataOnError>false</responseDataOnError>
|
|
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
|
<assertionsResultsToSave>0</assertionsResultsToSave>
|
|
<bytes>true</bytes>
|
|
<sentBytes>true</sentBytes>
|
|
<url>true</url>
|
|
<threadCounts>true</threadCounts>
|
|
<idleTime>true</idleTime>
|
|
<connectTime>true</connectTime>
|
|
</value>
|
|
</objProp>
|
|
<stringProp name="filename"></stringProp>
|
|
</ResultCollector>
|
|
<hashTree/>
|
|
|
|
</hashTree>
|
|
</hashTree>
|
|
</jmeterTestPlan> |