aigcspace_test_plan.jmx 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.3">
  3. <hashTree>
  4. <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="AIGCSpace 压力测试" enabled="true">
  5. <stringProp name="TestPlan.comments">AIGCSpace 稳定性 + 压力测试计划
  6. 覆盖:登录、模型列表、用户信息、余额查询、非流式对话
  7. 运行参数通过命令行 -J 传入</stringProp>
  8. <boolProp name="TestPlan.functional_mode">false</boolProp>
  9. <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
  10. <elementProp name="TestPlan.user_defined_variables" elementType="Arguments">
  11. <collectionProp name="Arguments.arguments">
  12. <!-- 基础配置 -->
  13. <elementProp name="base_url" elementType="Argument">
  14. <stringProp name="Argument.name">base_url</stringProp>
  15. <stringProp name="Argument.value">${__P(base_url,https://aigc-api.wangxunai.com)}</stringProp>
  16. </elementProp>
  17. <elementProp name="thread_count" elementType="Argument">
  18. <stringProp name="Argument.name">thread_count</stringProp>
  19. <stringProp name="Argument.value">${__P(thread_count,20)}</stringProp>
  20. </elementProp>
  21. <elementProp name="ramp_up" elementType="Argument">
  22. <stringProp name="Argument.name">ramp_up</stringProp>
  23. <stringProp name="Argument.value">${__P(ramp_up,60)}</stringProp>
  24. </elementProp>
  25. <elementProp name="duration" elementType="Argument">
  26. <stringProp name="Argument.name">duration</stringProp>
  27. <stringProp name="Argument.value">${__P(duration,1800)}</stringProp>
  28. </elementProp>
  29. <!-- 对话测试用的模型名,改成你们实际有的模型 -->
  30. <elementProp name="test_model" elementType="Argument">
  31. <stringProp name="Argument.name">test_model</stringProp>
  32. <stringProp name="Argument.value">${__P(test_model,qwen-turbo)}</stringProp>
  33. </elementProp>
  34. </collectionProp>
  35. </elementProp>
  36. </TestPlan>
  37. <hashTree>
  38. <!-- ============================================================ -->
  39. <!-- HTTP 默认配置 -->
  40. <!-- ============================================================ -->
  41. <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP 默认配置" enabled="true">
  42. <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
  43. <collectionProp name="Arguments.arguments"/>
  44. </elementProp>
  45. <stringProp name="HTTPSampler.domain">${__regexExtract(${base_url},https?://([^/]+),1,1,localhost)}</stringProp>
  46. <stringProp name="HTTPSampler.port"></stringProp>
  47. <stringProp name="HTTPSampler.protocol">${__regexExtract(${base_url},(https?),1,1,https)}</stringProp>
  48. <stringProp name="HTTPSampler.contentEncoding">UTF-8</stringProp>
  49. <boolProp name="HTTPSampler.image_parser">false</boolProp>
  50. <boolProp name="HTTPSampler.concurrentDwn">false</boolProp>
  51. </ConfigTestElement>
  52. <hashTree/>
  53. <!-- HTTP Header 管理器(全局) -->
  54. <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="全局 Header" enabled="true">
  55. <collectionProp name="HeaderManager.headers">
  56. <elementProp name="Content-Type" elementType="Header">
  57. <stringProp name="Header.name">Content-Type</stringProp>
  58. <stringProp name="Header.value">application/json</stringProp>
  59. </elementProp>
  60. <elementProp name="Accept" elementType="Header">
  61. <stringProp name="Header.name">Accept</stringProp>
  62. <stringProp name="Header.value">application/json</stringProp>
  63. </elementProp>
  64. </collectionProp>
  65. </HeaderManager>
  66. <hashTree/>
  67. <!-- ============================================================ -->
  68. <!-- CSV 用户数据 -->
  69. <!-- ============================================================ -->
  70. <CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="用户数据" enabled="true">
  71. <stringProp name="filename">../../backend/test_users.csv</stringProp>
  72. <stringProp name="fileEncoding">UTF-8</stringProp>
  73. <stringProp name="variableNames">username,password,email,apikey,user_id</stringProp>
  74. <boolProp name="ignoreFirstLine">true</boolProp>
  75. <stringProp name="delimiter">,</stringProp>
  76. <boolProp name="quotedData">false</boolProp>
  77. <boolProp name="recycle">true</boolProp>
  78. <boolProp name="stopThread">false</boolProp>
  79. <stringProp name="shareMode">shareMode.all</stringProp>
  80. </CSVDataSet>
  81. <hashTree/>
  82. <!-- ============================================================ -->
  83. <!-- 场景一:纯读接口(无需认证)- 模型列表 -->
  84. <!-- 目的:测试无认证接口的基础吞吐量 -->
  85. <!-- ============================================================ -->
  86. <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="场景1 - 模型列表(无认证)" enabled="true">
  87. <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
  88. <elementProp name="ThreadGroup.main_controller" elementType="LoopController">
  89. <boolProp name="LoopController.continue_forever">true</boolProp>
  90. <intProp name="LoopController.loops">-1</intProp>
  91. </elementProp>
  92. <stringProp name="ThreadGroup.num_threads">${thread_count}</stringProp>
  93. <stringProp name="ThreadGroup.ramp_time">${ramp_up}</stringProp>
  94. <boolProp name="ThreadGroup.scheduler">true</boolProp>
  95. <stringProp name="ThreadGroup.duration">${duration}</stringProp>
  96. <stringProp name="ThreadGroup.delay">0</stringProp>
  97. </ThreadGroup>
  98. <hashTree>
  99. <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="GET 模型列表" enabled="true">
  100. <stringProp name="HTTPSampler.path">/api/models?page=1&amp;page_size=20</stringProp>
  101. <stringProp name="HTTPSampler.method">GET</stringProp>
  102. <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
  103. <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
  104. </HTTPSamplerProxy>
  105. <hashTree>
  106. <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="断言-状态码200" enabled="true">
  107. <collectionProp name="Asserion.test_strings">
  108. <stringProp name="49586">200</stringProp>
  109. </collectionProp>
  110. <stringProp name="Assertion.custom_message">模型列表接口返回非200</stringProp>
  111. <stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
  112. <boolProp name="Assertion.assume_success">false</boolProp>
  113. <intProp name="Assertion.test_type">8</intProp>
  114. </ResponseAssertion>
  115. <hashTree/>
  116. <JSONPathAssertion guiclass="JSONPathAssertionGui" testclass="JSONPathAssertion" testname="断言-业务code=200" enabled="true">
  117. <stringProp name="JSON_PATH">$.code</stringProp>
  118. <stringProp name="EXPECTED_VALUE">200</stringProp>
  119. <boolProp name="JSONVALIDATION">true</boolProp>
  120. <boolProp name="EXPECT_NULL">false</boolProp>
  121. <boolProp name="INVERT">false</boolProp>
  122. <boolProp name="ISREGEX">false</boolProp>
  123. </JSONPathAssertion>
  124. <hashTree/>
  125. </hashTree>
  126. <!-- 思考时间:模拟真实用户,避免打爆服务器 -->
  127. <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="思考时间 500ms" enabled="true">
  128. <stringProp name="ConstantTimer.delay">500</stringProp>
  129. </ConstantTimer>
  130. <hashTree/>
  131. </hashTree>
  132. <!-- ============================================================ -->
  133. <!-- 场景二:认证接口 - 登录 + 用户信息 + 余额查询 -->
  134. <!-- 目的:测试认证链路和高频读接口,重点验证 check_balance 优化效果 -->
  135. <!-- ============================================================ -->
  136. <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="场景2 - 认证链路(登录+用户信息+余额)" enabled="true">
  137. <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
  138. <elementProp name="ThreadGroup.main_controller" elementType="LoopController">
  139. <boolProp name="LoopController.continue_forever">true</boolProp>
  140. <intProp name="LoopController.loops">-1</intProp>
  141. </elementProp>
  142. <stringProp name="ThreadGroup.num_threads">${thread_count}</stringProp>
  143. <stringProp name="ThreadGroup.ramp_time">${ramp_up}</stringProp>
  144. <boolProp name="ThreadGroup.scheduler">true</boolProp>
  145. <stringProp name="ThreadGroup.duration">${duration}</stringProp>
  146. <stringProp name="ThreadGroup.delay">5</stringProp>
  147. </ThreadGroup>
  148. <hashTree>
  149. <!-- 步骤1:登录,提取 Token -->
  150. <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="POST 登录" enabled="true">
  151. <stringProp name="HTTPSampler.path">/api/auth/login</stringProp>
  152. <stringProp name="HTTPSampler.method">POST</stringProp>
  153. <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
  154. <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
  155. <collectionProp name="Arguments.arguments">
  156. <elementProp name="" elementType="HTTPArgument">
  157. <boolProp name="HTTPArgument.always_encode">false</boolProp>
  158. <stringProp name="Argument.value">{"username":"${username}","password":"${password}","encrypted":false}</stringProp>
  159. <stringProp name="Argument.metadata">=</stringProp>
  160. </elementProp>
  161. </collectionProp>
  162. </elementProp>
  163. <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
  164. <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
  165. </HTTPSamplerProxy>
  166. <hashTree>
  167. <!-- 提取 access_token -->
  168. <JSONPathExtractor guiclass="JSONPathExtractorGui" testclass="JSONPathExtractor" testname="提取 Token" enabled="true">
  169. <stringProp name="JSONPathExtractor.referenceName">access_token</stringProp>
  170. <stringProp name="JSONPathExtractor.jsonPathExpr">$.data.access_token</stringProp>
  171. <stringProp name="JSONPathExtractor.defaultValue">TOKEN_NOT_FOUND</stringProp>
  172. </JSONPathExtractor>
  173. <hashTree/>
  174. <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="断言-登录成功" enabled="true">
  175. <collectionProp name="Asserion.test_strings">
  176. <stringProp name="49586">200</stringProp>
  177. </collectionProp>
  178. <stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
  179. <boolProp name="Assertion.assume_success">false</boolProp>
  180. <intProp name="Assertion.test_type">8</intProp>
  181. </ResponseAssertion>
  182. <hashTree/>
  183. </hashTree>
  184. <!-- 步骤2:用户信息(需要 Token) -->
  185. <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="GET 用户信息" enabled="true">
  186. <stringProp name="HTTPSampler.path">/api/user/profile</stringProp>
  187. <stringProp name="HTTPSampler.method">GET</stringProp>
  188. <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
  189. <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
  190. </HTTPSamplerProxy>
  191. <hashTree>
  192. <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="Authorization Header" enabled="true">
  193. <collectionProp name="HeaderManager.headers">
  194. <elementProp name="Authorization" elementType="Header">
  195. <stringProp name="Header.name">Authorization</stringProp>
  196. <stringProp name="Header.value">Bearer ${access_token}</stringProp>
  197. </elementProp>
  198. </collectionProp>
  199. </HeaderManager>
  200. <hashTree/>
  201. <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="断言-用户信息200" enabled="true">
  202. <collectionProp name="Asserion.test_strings">
  203. <stringProp name="49586">200</stringProp>
  204. </collectionProp>
  205. <stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
  206. <boolProp name="Assertion.assume_success">false</boolProp>
  207. <intProp name="Assertion.test_type">8</intProp>
  208. </ResponseAssertion>
  209. <hashTree/>
  210. </hashTree>
  211. <!-- 步骤3:余额查询(高频,重点测 check_balance 优化) -->
  212. <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="GET 余额查询" enabled="true">
  213. <stringProp name="HTTPSampler.path">/api/billing/balance</stringProp>
  214. <stringProp name="HTTPSampler.method">GET</stringProp>
  215. <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
  216. <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
  217. </HTTPSamplerProxy>
  218. <hashTree>
  219. <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="Authorization Header" enabled="true">
  220. <collectionProp name="HeaderManager.headers">
  221. <elementProp name="Authorization" elementType="Header">
  222. <stringProp name="Header.name">Authorization</stringProp>
  223. <stringProp name="Header.value">Bearer ${access_token}</stringProp>
  224. </elementProp>
  225. </collectionProp>
  226. </HeaderManager>
  227. <hashTree/>
  228. <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="断言-余额查询200" enabled="true">
  229. <collectionProp name="Asserion.test_strings">
  230. <stringProp name="49586">200</stringProp>
  231. </collectionProp>
  232. <stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
  233. <boolProp name="Assertion.assume_success">false</boolProp>
  234. <intProp name="Assertion.test_type">8</intProp>
  235. </ResponseAssertion>
  236. <hashTree/>
  237. </hashTree>
  238. <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="思考时间 1s" enabled="true">
  239. <stringProp name="ConstantTimer.delay">1000</stringProp>
  240. </ConstantTimer>
  241. <hashTree/>
  242. </hashTree>
  243. <!-- ============================================================ -->
  244. <!-- 场景三:非流式对话(重点测 db 连接池优化效果) -->
  245. <!-- 注意:此场景会消耗用户余额,并发不要太高 -->
  246. <!-- ============================================================ -->
  247. <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="场景3 - 非流式对话" enabled="true">
  248. <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
  249. <elementProp name="ThreadGroup.main_controller" elementType="LoopController">
  250. <boolProp name="LoopController.continue_forever">true</boolProp>
  251. <intProp name="LoopController.loops">-1</intProp>
  252. </elementProp>
  253. <!-- 对话场景并发数设低一些,避免余额耗尽 -->
  254. <stringProp name="ThreadGroup.num_threads">5</stringProp>
  255. <stringProp name="ThreadGroup.ramp_time">30</stringProp>
  256. <boolProp name="ThreadGroup.scheduler">true</boolProp>
  257. <stringProp name="ThreadGroup.duration">${duration}</stringProp>
  258. <stringProp name="ThreadGroup.delay">10</stringProp>
  259. </ThreadGroup>
  260. <hashTree>
  261. <!-- 先登录获取 Token -->
  262. <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="POST 登录(对话前)" enabled="true">
  263. <stringProp name="HTTPSampler.path">/api/auth/login</stringProp>
  264. <stringProp name="HTTPSampler.method">POST</stringProp>
  265. <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
  266. <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
  267. <collectionProp name="Arguments.arguments">
  268. <elementProp name="" elementType="HTTPArgument">
  269. <boolProp name="HTTPArgument.always_encode">false</boolProp>
  270. <stringProp name="Argument.value">{"username":"${username}","password":"${password}","encrypted":false}</stringProp>
  271. <stringProp name="Argument.metadata">=</stringProp>
  272. </elementProp>
  273. </collectionProp>
  274. </elementProp>
  275. <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
  276. <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
  277. </HTTPSamplerProxy>
  278. <hashTree>
  279. <JSONPathExtractor guiclass="JSONPathExtractorGui" testclass="JSONPathExtractor" testname="提取 Token" enabled="true">
  280. <stringProp name="JSONPathExtractor.referenceName">chat_token</stringProp>
  281. <stringProp name="JSONPathExtractor.jsonPathExpr">$.data.access_token</stringProp>
  282. <stringProp name="JSONPathExtractor.defaultValue">TOKEN_NOT_FOUND</stringProp>
  283. </JSONPathExtractor>
  284. <hashTree/>
  285. </hashTree>
  286. <!-- 非流式对话 -->
  287. <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="POST 非流式对话" enabled="true">
  288. <stringProp name="HTTPSampler.path">/api/llm/chat</stringProp>
  289. <stringProp name="HTTPSampler.method">POST</stringProp>
  290. <boolProp name="HTTPSampler.postBodyRaw">true</boolProp>
  291. <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
  292. <collectionProp name="Arguments.arguments">
  293. <elementProp name="" elementType="HTTPArgument">
  294. <boolProp name="HTTPArgument.always_encode">false</boolProp>
  295. <stringProp name="Argument.value">{"model":"${test_model}","messages":[{"role":"user","content":"你好,请用一句话介绍自己"}],"stream":false}</stringProp>
  296. <stringProp name="Argument.metadata">=</stringProp>
  297. </elementProp>
  298. </collectionProp>
  299. </elementProp>
  300. <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
  301. <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
  302. <!-- 对话接口超时设长一些 -->
  303. <stringProp name="HTTPSampler.connect_timeout">10000</stringProp>
  304. <stringProp name="HTTPSampler.response_timeout">30000</stringProp>
  305. </HTTPSamplerProxy>
  306. <hashTree>
  307. <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="Authorization Header" enabled="true">
  308. <collectionProp name="HeaderManager.headers">
  309. <elementProp name="Authorization" elementType="Header">
  310. <stringProp name="Header.name">Authorization</stringProp>
  311. <stringProp name="Header.value">Bearer ${chat_token}</stringProp>
  312. </elementProp>
  313. </collectionProp>
  314. </HeaderManager>
  315. <hashTree/>
  316. <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="断言-对话返回200" enabled="true">
  317. <collectionProp name="Asserion.test_strings">
  318. <stringProp name="49586">200</stringProp>
  319. </collectionProp>
  320. <stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
  321. <boolProp name="Assertion.assume_success">false</boolProp>
  322. <intProp name="Assertion.test_type">8</intProp>
  323. </ResponseAssertion>
  324. <hashTree/>
  325. </hashTree>
  326. <!-- 对话间隔 5 秒,避免余额耗尽太快 -->
  327. <ConstantTimer guiclass="ConstantTimerGui" testclass="ConstantTimer" testname="对话间隔 5s" enabled="true">
  328. <stringProp name="ConstantTimer.delay">5000</stringProp>
  329. </ConstantTimer>
  330. <hashTree/>
  331. </hashTree>
  332. <!-- ============================================================ -->
  333. <!-- 监听器:聚合报告 -->
  334. <!-- ============================================================ -->
  335. <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
  336. <boolProp name="ResultCollector.error_logging">false</boolProp>
  337. <objProp>
  338. <name>saveConfig</name>
  339. <value class="SampleSaveConfiguration">
  340. <time>true</time>
  341. <latency>true</latency>
  342. <timestamp>true</timestamp>
  343. <success>true</success>
  344. <label>true</label>
  345. <code>true</code>
  346. <message>true</message>
  347. <threadName>true</threadName>
  348. <dataType>true</dataType>
  349. <encoding>false</encoding>
  350. <assertions>true</assertions>
  351. <subresults>true</subresults>
  352. <responseData>false</responseData>
  353. <samplerData>false</samplerData>
  354. <xml>false</xml>
  355. <fieldNames>true</fieldNames>
  356. <responseHeaders>false</responseHeaders>
  357. <requestHeaders>false</requestHeaders>
  358. <responseDataOnError>true</responseDataOnError>
  359. <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
  360. <assertionsResultsToSave>0</assertionsResultsToSave>
  361. <bytes>true</bytes>
  362. <sentBytes>true</sentBytes>
  363. <url>true</url>
  364. <threadCounts>true</threadCounts>
  365. <idleTime>true</idleTime>
  366. <connectTime>true</connectTime>
  367. </value>
  368. </objProp>
  369. <stringProp name="filename">results/test_results.jtl</stringProp>
  370. </ResultCollector>
  371. <hashTree/>
  372. <!-- 响应时间图 -->
  373. <ResultCollector guiclass="RespTimeGraphVisualizer" testclass="ResultCollector" testname="响应时间图" enabled="true">
  374. <boolProp name="ResultCollector.error_logging">false</boolProp>
  375. <objProp>
  376. <name>saveConfig</name>
  377. <value class="SampleSaveConfiguration">
  378. <time>true</time>
  379. <latency>true</latency>
  380. <timestamp>true</timestamp>
  381. <success>true</success>
  382. <label>true</label>
  383. </value>
  384. </objProp>
  385. <stringProp name="filename"></stringProp>
  386. </ResultCollector>
  387. <hashTree/>
  388. <!-- 错误日志(只记录失败请求) -->
  389. <ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="错误日志" enabled="true">
  390. <boolProp name="ResultCollector.error_logging">true</boolProp>
  391. <objProp>
  392. <name>saveConfig</name>
  393. <value class="SampleSaveConfiguration">
  394. <time>true</time>
  395. <latency>true</latency>
  396. <timestamp>true</timestamp>
  397. <success>true</success>
  398. <label>true</label>
  399. <code>true</code>
  400. <message>true</message>
  401. <responseData>true</responseData>
  402. <responseDataOnError>true</responseDataOnError>
  403. <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
  404. </value>
  405. </objProp>
  406. <stringProp name="filename">results/errors.jtl</stringProp>
  407. </ResultCollector>
  408. <hashTree/>
  409. </hashTree>
  410. </hashTree>
  411. </jmeterTestPlan>