<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-05-28T18:04:07.336677" rpa="false" schemaversion="5">
<suite id="s1" name="BitRadeX_API测试_bitradex_test" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests">
<suite id="s1-s1" name="App" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app">
<suite id="s1-s1-s1" name="Ad List" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/ad_list.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.421680" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:07.421588" elapsed="0.000111"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.421879" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:07.421820" elapsed="0.000077"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:07.421740" elapsed="0.000171"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.421962" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:07.421921" elapsed="0.000060"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:07.421731" elapsed="0.000257"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.422249" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:07.422202" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422349" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422396" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422438" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422479" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422521" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:07.422290" elapsed="0.000249"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422604" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422648" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422695" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422736" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422777" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422818" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422860" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422901" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.422941" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:07.422546" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.423296" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.423001" elapsed="0.000312"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.423600" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.423355" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.423904" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.423658" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.424214" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.423961" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.424529" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.424271" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.424854" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.424585" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.425207" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.424960" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.425520" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.425264" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.425843" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:07.425577" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:07.422967" elapsed="0.002908"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:07.422284" elapsed="0.003599"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.425983" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:07.425922" elapsed="0.000077"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:07.426147" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:07.426039" elapsed="0.000181"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:07.422103" elapsed="0.004144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.426321" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:07.426288" elapsed="0.000048"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:07.421290" elapsed="0.005066"/>
</kw>
<test id="s1-s1-s1-t1" name="获取广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:07.427338" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:07.427056" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:07.427608" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:07.427403" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:07.427395" elapsed="0.000244"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:07.427653" elapsed="0.000014"/>
</return>
<msg time="2026-05-28T18:04:07.427735" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:07.426766" elapsed="0.000980"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:08.331794" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/ad/list 
 path_url=/v1/app/public/ad/list 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:08.332313" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/ad/list 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:08 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET, GET', 'api-path': '/public/ad/list, /public/ad/list', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '3eb8c7fdf11c928a450b1470deb2c74a', 'X-Transparent': '00-3eb8c7fdf11c928a450b1470deb2c74a-eecb64c0df97ea2f-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.017', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6ef6a8141095-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962648284} 
 </msg>
<msg time="2026-05-28T18:04:08.332510" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:08.332931" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/app/public/ad/list</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:07.427787" elapsed="0.905211"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.335052" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:08.333593" elapsed="0.001600"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.336814" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779962648284}</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:08.335615" elapsed="0.001257"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:08.337123" elapsed="0.000372"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.338764" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962648284
}</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:08.337785" elapsed="0.001039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.339469" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962648284
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.339090" elapsed="0.000541"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:08.341040" level="INFO">${data} = []</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:08.339883" elapsed="0.001210"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.341316" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证广告列表结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($ad_list, list)</arg>
<arg>广告数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.343289" elapsed="0.000321"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.343976" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T18:04:08.344089" level="INFO">${length} = 0</msg>
<var>${length}</var>
<arg>${ad_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:08.343792" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.344484" level="INFO">广告列表包含 0 个广告项</msg>
<arg>广告列表包含 ${length} 个广告项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.344285" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${length} &gt; 0</arg>
<arg>验证广告项结构</arg>
<arg>${ad_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.344722" elapsed="0.000206"/>
</kw>
<arg>${data}</arg>
<doc>验证广告列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:08.342745" elapsed="0.002296"/>
</kw>
<arg>isinstance($data, list)</arg>
<arg>验证广告列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.341955" elapsed="0.003171"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>验证广告字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.345306" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.346535" level="INFO">获取广告列表 /v1/app/public/ad/list status=200</msg>
<arg>获取广告列表 /v1/app/public/ad/list status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.345781" elapsed="0.000821"/>
</kw>
<doc>验证广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:07.426380" elapsed="0.920477"/>
</test>
<doc>广告列表接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:07.345794" elapsed="1.001870"/>
</suite>
<suite id="s1-s1-s2" name="App Share Info" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/app_share_info.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.354212" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:08.354015" elapsed="0.000226"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.356557" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.354585" elapsed="0.002025"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:08.354365" elapsed="0.002283"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.356792" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.356690" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:08.354322" elapsed="0.002543"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.357566" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.357446" elapsed="0.000168"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.357844" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.357955" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.358077" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.358184" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.358290" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.357678" elapsed="0.000786"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.358751" elapsed="0.000025"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.358895" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359030" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359155" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359281" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359408" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359529" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359651" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.359772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.358508" elapsed="0.001317"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.360229" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.359953" elapsed="0.000326"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.360628" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.360397" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.361012" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.360795" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.361396" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.361173" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.361773" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.361552" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.362162" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.361935" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.362564" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.362323" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.362960" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.362726" elapsed="0.000277"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.363356" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.363120" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:08.359850" elapsed="0.003589"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:08.357661" elapsed="0.005799"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.363750" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.363573" elapsed="0.000228"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:08.364242" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:08.363924" elapsed="0.000502"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:08.357197" elapsed="0.007312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.364725" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.364626" elapsed="0.000144"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:08.353751" elapsed="0.011081"/>
</kw>
<test id="s1-s1-s2-t1" name="获取应用分享信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.367710" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:08.367058" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.368393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.367893" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:08.367872" elapsed="0.000598"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:08.368502" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T18:04:08.368701" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:08.366214" elapsed="0.002511"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:08.681582" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/app/share/info 
 path_url=/v1/app/public/app/share/info 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:08.681894" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/app/share/info 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:08 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET, GET', 'api-path': '/public/app/share/info, /public/app/share/info', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '81f28de84a5aa70159dbe5e737ff588f', 'X-Transparent': '00-81f28de84a5aa70159dbe5e737ff588f-9adaa74f69a0363d-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.014', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6ef97cc49840-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"path":"/account/register","host":"https://www.bitradex-test.com"},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962648668} 
 </msg>
<msg time="2026-05-28T18:04:08.682103" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:08.682512" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:08.369515" elapsed="0.313048"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:08.682742" elapsed="0.000135"/>
</return>
<msg time="2026-05-28T18:04:08.683158" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/app/public/app/share/info</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:08.368864" elapsed="0.314320"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.685832" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:08.684562" elapsed="0.001420"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.687750" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:08.686231" elapsed="0.001576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.688351" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.688063" elapsed="0.000377"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:08.683682" elapsed="0.004874"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.690304" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779962648668}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:08.689480" elapsed="0.000867"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:08.690523" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.691177" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.690997" elapsed="0.000243"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:08.688871" elapsed="0.002449"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.692752" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779962648668}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:08.691978" elapsed="0.000815"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.693673" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962648668
}</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:08.692972" elapsed="0.000826"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.694161" level="INFO">{
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962648668
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.693942" elapsed="0.000317"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:08.691566" elapsed="0.002764"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:08.695102" level="INFO">${data} = {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:08.694473" elapsed="0.000661"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>响应数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.695286" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证分享信息结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>分享信息数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.696554" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.697079" level="INFO">分享信息数据结构: {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}</msg>
<arg>分享信息数据结构: ${data}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.696924" elapsed="0.000212"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:08.697495" level="INFO">${keys} = ['host', 'path']</msg>
<var>${keys}</var>
<arg>${data}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:08.697292" elapsed="0.000232"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.697801" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T18:04:08.697882" level="INFO">${count} = 2</msg>
<var>${count}</var>
<arg>${keys}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:08.697670" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.698156" level="INFO">分享信息数据包含 2 个字段</msg>
<arg>分享信息数据包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.698038" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:08.698731" level="FAIL">Dictionary does not contain key 'title'.</msg>
<arg>${data}</arg>
<arg>title</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:08.698478" elapsed="0.000380">Dictionary does not contain key 'title'.</status>
</kw>
<msg time="2026-05-28T18:04:08.698956" level="INFO">${has_title} = False</msg>
<var>${has_title}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${data}</arg>
<arg>title</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:08.698323" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_title}</arg>
<arg>Log</arg>
<arg>包含标题字段: ${data['title']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.699105" elapsed="0.000109"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:08.699635" level="FAIL">Dictionary does not contain key 'content'.</msg>
<arg>${data}</arg>
<arg>content</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:08.699477" elapsed="0.000213">Dictionary does not contain key 'content'.</status>
</kw>
<msg time="2026-05-28T18:04:08.699786" level="INFO">${has_content} = False</msg>
<var>${has_content}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${data}</arg>
<arg>content</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:08.699339" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_content}</arg>
<arg>Log</arg>
<arg>包含内容字段: ${data['content']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.699941" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:08.700627" level="FAIL">Dictionary does not contain key 'url'.</msg>
<arg>${data}</arg>
<arg>url</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:08.700467" elapsed="0.000217">Dictionary does not contain key 'url'.</status>
</kw>
<msg time="2026-05-28T18:04:08.700772" level="INFO">${has_url} = False</msg>
<var>${has_url}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${data}</arg>
<arg>url</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:08.700176" elapsed="0.000620"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_url}</arg>
<arg>Log</arg>
<arg>包含链接字段: ${data['url']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.700920" elapsed="0.000107"/>
</kw>
<arg>${data}</arg>
<doc>验证应用分享信息的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:08.696203" elapsed="0.004886"/>
</kw>
<arg>len($data) &gt; 0</arg>
<arg>验证分享信息结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:08.695752" elapsed="0.005382"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.702164" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:08.701661" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:08.702452" elapsed="0.000444"/>
</kw>
<msg time="2026-05-28T18:04:08.702974" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:08.702307" elapsed="0.000689"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.703307" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:08.703168" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.703627" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:08.703434" elapsed="0.000216"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.703910" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:08.703760" elapsed="0.000172"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.704681" level="INFO">${summary_content} = 🧪 测试过程: 获取应用分享信息 | 📡 请求接口: /v1/app/public/app/share/info | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:08.704033" elapsed="0.000674"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.704990" level="INFO">${final_summary} = 🧪 测试过程: 获取应用分享信息 | 📡 请求接口: /v1/app/public/app/share/info | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:08.704810" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.705216" level="INFO">🧪 测试过程: 获取应用分享信息 | 📡 请求接口: /v1/app/public/app/share/info | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.705113" elapsed="0.000153"/>
</kw>
<arg>获取应用分享信息</arg>
<arg>/v1/app/public/app/share/info</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:08.701348" elapsed="0.003967"/>
</kw>
<doc>验证应用分享信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:08.364904" elapsed="0.340588"/>
</test>
<doc>应用分享信息接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:08.349002" elapsed="0.356911"/>
</suite>
<suite id="s1-s1-s3" name="App Version Info" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/app_version_info.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.711705" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:08.711510" elapsed="0.000225"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.712141" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.712009" elapsed="0.000177"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:08.711820" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.712330" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.712239" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:08.711799" elapsed="0.000597"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.713215" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.713097" elapsed="0.000163"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.713475" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.713588" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.713702" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.713823" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.713929" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.713322" elapsed="0.000652"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.714617" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.714728" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.714845" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.714952" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.715054" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.715160" elapsed="0.000054"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.715311" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.715415" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.715515" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.714001" elapsed="0.001557"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.715904" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.715668" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.716248" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.716057" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.716575" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.716391" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.716902" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.716712" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.717230" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.717039" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.717569" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.717376" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.717909" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.717710" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.718241" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.718043" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.718568" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:08.718376" elapsed="0.000228"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:08.715577" elapsed="0.003059"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:08.713305" elapsed="0.005350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.718897" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.718743" elapsed="0.000195"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:08.719318" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:08.719042" elapsed="0.000448"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:08.712846" elapsed="0.006713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.719757" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:08.719666" elapsed="0.000133"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:08.711274" elapsed="0.008579"/>
</kw>
<test id="s1-s1-s3-t1" name="获取应用版本信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:08.722061" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:08.721509" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:08.722604" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:08.722184" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:08.722169" elapsed="0.000507"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:08.722703" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T18:04:08.722909" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:08.720864" elapsed="0.002098"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:09.062504" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 
 path_url=/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:09.062899" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:09 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/app-info/version', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '4a1662a16de589987d1e826aa5788e34', 'X-Transparent': '00-4a1662a16de589987d1e826aa5788e34-29b43b1cd03c09ac-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.003', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6efc3b4b10a4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"alertType":2,"build":6115,"description":"1","version":"v1.1.2","url":"itms-services://?action=download-manifest&amp;url=https://download.bitradex.com/test-app/IOS/manifest.plist"},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962649049} 
 </msg>
<msg time="2026-05-28T18:04:09.063087" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:09.063507" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:08.723681" elapsed="0.339892"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:09.063789" elapsed="0.000114"/>
</return>
<msg time="2026-05-28T18:04:09.064280" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</arg>
<arg>headers=&amp;{headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:08.723085" elapsed="0.341254"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.066911" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:09.065708" elapsed="0.001351"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.068409" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.067347" elapsed="0.001118"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.069387" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.068733" elapsed="0.000729"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:09.064895" elapsed="0.004665"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.071181" level="INFO">${json_data} = {'code': 0, 'data': {'alertType': 2, 'build': 6115, 'description': '1', 'version': 'v1.1.2', 'url': 'itms-services://?action=download-manifest&amp;url=https://download.bitradex.com/test-app/IOS/manifest.p...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.070336" elapsed="0.000893"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.071410" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.072060" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.071870" elapsed="0.000253"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:09.069838" elapsed="0.002375"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.073598" level="INFO">${json_data} = {'code': 0, 'data': {'alertType': 2, 'build': 6115, 'description': '1', 'version': 'v1.1.2', 'url': 'itms-services://?action=download-manifest&amp;url=https://download.bitradex.com/test-app/IOS/manifest.p...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.072877" elapsed="0.000758"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.074360" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "alertType": 2,
    "build": 6115,
    "description": "1",
    "version": "v1.1.2",
    "url": "itms-services://?action=download-manifest&amp;url=https://download.bitradex.c...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:09.073782" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.074747" level="INFO">{
  "code": 0,
  "data": {
    "alertType": 2,
    "build": 6115,
    "description": "1",
    "version": "v1.1.2",
    "url": "itms-services://?action=download-manifest&amp;url=https://download.bitradex.com/test-app/IOS/manifest.plist"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962649049
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.074535" elapsed="0.000349"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:09.072454" elapsed="0.002578"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.076277" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.075677" elapsed="0.000633"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:09.076680" elapsed="0.000614"/>
</kw>
<msg time="2026-05-28T18:04:09.077397" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:09.076473" elapsed="0.000953"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.077748" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.077578" elapsed="0.000197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.078110" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.077897" elapsed="0.000238"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.078432" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.078262" elapsed="0.000195"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.078861" level="INFO">${summary_content} = 🧪 测试过程: 获取应用版本信息 | 📡 请求接口: /v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.078576" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.079216" level="INFO">${final_summary} = 🧪 测试过程: 获取应用版本信息 | 📡 请求接口: /v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.079011" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.079489" level="INFO">🧪 测试过程: 获取应用版本信息 | 📡 请求接口: /v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.079366" elapsed="0.000172"/>
</kw>
<arg>获取应用版本信息</arg>
<arg>/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:09.075276" elapsed="0.004325"/>
</kw>
<doc>验证应用版本信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:08.719918" elapsed="0.359871"/>
</test>
<doc>应用版本信息接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:08.707200" elapsed="0.373055"/>
</suite>
<suite id="s1-s1-s4" name="Banner List" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/banner_list.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.086005" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:09.085802" elapsed="0.000236"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.086616" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.086459" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:09.086198" elapsed="0.000513"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.086845" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.086736" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.086156" elapsed="0.000764"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.087654" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.087522" elapsed="0.000181"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.087948" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.088084" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.088211" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.088333" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.088457" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.087774" elapsed="0.000734"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.088699" elapsed="0.000061"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.088875" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089003" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089126" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089247" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089369" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089488" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089607" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.089725" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.088532" elapsed="0.001243"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.090135" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.089896" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.090518" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.090299" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.090845" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.090664" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.091163" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.090978" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.091483" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.091296" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.091799" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.091616" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.092132" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.091932" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.092465" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.092267" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.092799" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.092598" elapsed="0.000237"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:09.089798" elapsed="0.003070"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.087756" elapsed="0.005130"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.093118" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.092972" elapsed="0.000187"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:09.093524" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:09.093265" elapsed="0.000406"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.087241" elapsed="0.006492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.093910" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.093830" elapsed="0.000120"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.085564" elapsed="0.008433"/>
</kw>
<test id="s1-s1-s4-t1" name="获取Banner列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.094987" level="INFO">&amp;{params} = { type=2 }</msg>
<var>&amp;{params}</var>
<arg>type=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.094794" elapsed="0.000219"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.096524" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.095910" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.097198" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.096691" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.096675" elapsed="0.000599"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:09.097305" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T18:04:09.097489" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.095188" elapsed="0.002326"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:09.431713" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/banner/listByApp?type=2 
 path_url=/v1/app/public/banner/listByApp?type=2 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:09.432143" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/banner/listByApp?type=2 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:09 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/banner/listByApp', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '80f500e86cf27cf3a165b4ab26f517f2', 'X-Transparent': '00-80f500e86cf27cf3a165b4ab26f517f2-d637691828d15555-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.004', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6efe3a5add65-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962649414} 
 </msg>
<msg time="2026-05-28T18:04:09.432325" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:09.432795" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/app/public/banner/listByApp</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:09.097616" elapsed="0.335251"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.435091" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:09.433613" elapsed="0.001631"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.436856" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779962649414}</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.435596" elapsed="0.001321"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.437196" elapsed="0.000390"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.438752" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962649414
}</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:09.437859" elapsed="0.000935"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.439281" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962649414
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.438991" elapsed="0.000421"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:09.440483" level="INFO">${data} = []</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.439619" elapsed="0.000902"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:09.440707" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证Banner列表结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($banner_list, list)</arg>
<arg>Banner数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:09.442574" elapsed="0.000315"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.443192" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T18:04:09.443284" level="INFO">${length} = 0</msg>
<var>${length}</var>
<arg>${banner_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:09.443033" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.443595" level="INFO">Banner列表包含 0 个Banner项</msg>
<arg>Banner列表包含 ${length} 个Banner项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.443438" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${length} &gt; 0</arg>
<arg>验证Banner项结构</arg>
<arg>${banner_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:09.443836" elapsed="0.000168"/>
</kw>
<arg>${data}</arg>
<doc>验证Banner列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:09.441982" elapsed="0.002118"/>
</kw>
<arg>isinstance($data, list)</arg>
<arg>验证Banner列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:09.441358" elapsed="0.002805"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>验证Banner字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:09.444305" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.445281" level="INFO">获取Banner列表 /v1/app/public/banner/listByApp status=200</msg>
<arg>获取Banner列表 /v1/app/public/banner/listByApp status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.444633" elapsed="0.000702"/>
</kw>
<doc>验证Banner列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:09.094061" elapsed="0.351499"/>
</test>
<doc>Banner列表接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:09.081451" elapsed="0.364626"/>
</suite>
<suite id="s1-s1-s5" name="Captcha Apply" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/captcha_apply.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.452554" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:09.452353" elapsed="0.000229"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.453015" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.452898" elapsed="0.000165"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:09.452692" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.453225" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.453132" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.452659" elapsed="0.000643"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.453958" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.453847" elapsed="0.000150"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454207" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454320" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454424" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454529" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454633" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.454057" elapsed="0.000632"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454840" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.454950" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455055" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455159" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455260" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455372" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455477" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455579" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.455684" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.454709" elapsed="0.001092"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.456287" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.455999" elapsed="0.000336"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.456674" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.456454" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.457096" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.456874" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.457486" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.457258" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.457871" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.457648" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.458259" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.458032" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.458661" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.458420" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.459063" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.458823" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.459467" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.459229" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:09.455839" elapsed="0.003711"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.454041" elapsed="0.005530"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.459874" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.459683" elapsed="0.000241"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:09.460312" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:09.460050" elapsed="0.000404"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.453610" elapsed="0.006908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.460696" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.460616" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.451938" elapsed="0.008843"/>
</kw>
<test id="s1-s1-s5-t1" name="申请验证码" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.461874" level="INFO">&amp;{params} = { type=2 }</msg>
<var>&amp;{params}</var>
<arg>type=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.461688" elapsed="0.000211"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.463449" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.462821" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.464090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.463595" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.463578" elapsed="0.000590"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:09.464197" elapsed="0.000029"/>
</return>
<msg time="2026-05-28T18:04:09.464385" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.462090" elapsed="0.002320"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:09.765614" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/captcha/apply?type=2 
 path_url=/v1/app/public/captcha/apply?type=2 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:09.766030" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/captcha/apply?type=2 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:09 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET, GET', 'api-path': '/public/captcha/apply, /public/captcha/apply', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '294bcd0a450c9c311ee55a777daa02e1', 'X-Transparent': '00-294bcd0a450c9c311ee55a777daa02e1-556125f47063e7b8-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.016', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f008ddc10aa-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"code":"","sdkKey":"a78c3a7d6d0e43c75bac3e0ca5effbed","enabled":true},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962649748} 
 </msg>
<msg time="2026-05-28T18:04:09.766304" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:09.766670" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:09.464925" elapsed="0.301808"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:09.766952" elapsed="0.000129"/>
</return>
<msg time="2026-05-28T18:04:09.767457" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/app/public/captcha/apply</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:09.464540" elapsed="0.302972"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.770183" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:09.768879" elapsed="0.001469"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.771855" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.770677" elapsed="0.001243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.772521" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.772206" elapsed="0.000416"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:09.768074" elapsed="0.004681"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.774501" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'a78c3a7d6d0e43c75bac3e0ca5effbed', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779962649748}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.773597" elapsed="0.000953"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.774750" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.775461" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.775253" elapsed="0.000276"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:09.773086" elapsed="0.002538"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.777211" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'a78c3a7d6d0e43c75bac3e0ca5effbed', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779962649748}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.776365" elapsed="0.000892"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.778048" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "a78c3a7d6d0e43c75bac3e0ca5effbed",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 177996...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:09.777446" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.778512" level="INFO">{
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "a78c3a7d6d0e43c75bac3e0ca5effbed",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962649748
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.778261" elapsed="0.000377"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:09.775890" elapsed="0.002833"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.780098" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.779430" elapsed="0.000707"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:09.780555" elapsed="0.000693"/>
</kw>
<msg time="2026-05-28T18:04:09.781377" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:09.780328" elapsed="0.001079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.781753" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.781570" elapsed="0.000212"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.782143" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.781916" elapsed="0.000260"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.782581" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.782388" elapsed="0.000220"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.783030" level="INFO">${summary_content} = 🧪 测试过程: 请求验证码 | 📡 请求接口: /v1/app/public/captcha/apply | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:09.782727" elapsed="0.000334"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.783451" level="INFO">${final_summary} = 🧪 测试过程: 请求验证码 | 📡 请求接口: /v1/app/public/captcha/apply | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:09.783203" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.783771" level="INFO">🧪 测试过程: 请求验证码 | 📡 请求接口: /v1/app/public/captcha/apply | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.783624" elapsed="0.000195"/>
</kw>
<arg>请求验证码</arg>
<arg>/v1/app/public/captcha/apply</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:09.778983" elapsed="0.004906"/>
</kw>
<doc>验证验证码请求接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:09.460836" elapsed="0.323248"/>
</test>
<doc>验证码申请接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:09.447265" elapsed="0.337265"/>
</suite>
<suite id="s1-s1-s6" name="Open Screen List" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/open_screen_list.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.791092" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:09.790813" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.791666" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.791494" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:09.791240" elapsed="0.000525"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.791912" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.791793" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.791214" elapsed="0.000778"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.792760" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.792619" elapsed="0.000192"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793075" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793218" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793346" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793470" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793596" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.792885" elapsed="0.000764"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793850" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.793981" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794106" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794228" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794347" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794470" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794594" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794712" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.794876" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.793674" elapsed="0.001259"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.795270" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.795050" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.795604" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.795417" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.795926" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.795744" elapsed="0.000218"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.796252" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.796063" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.796574" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.796388" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.796894" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.796708" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.797224" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.797028" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.797545" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.797359" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.797739" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:09.797624" elapsed="0.000136"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:09.794956" elapsed="0.002823"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.792865" elapsed="0.004926"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.797930" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.797843" elapsed="0.000111"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:09.798172" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:09.798011" elapsed="0.000261"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.792322" elapsed="0.005989"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.798491" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:09.798409" elapsed="0.000121"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.790349" elapsed="0.008233"/>
</kw>
<test id="s1-s1-s6-t1" name="获取开屏广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:09.801253" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:09.800469" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:09.801910" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:09.801403" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:09.801384" elapsed="0.000604"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:09.802019" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T18:04:09.802210" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:09.799720" elapsed="0.002515"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:10.222737" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/open-screen/list 
 path_url=/v1/app/public/open-screen/list 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:10.223282" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/open-screen/list 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:10 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/open-screen/list', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '062417f65d1f162948c15a667220696d', 'X-Transparent': '00-062417f65d1f162948c15a667220696d-4a8d189f1e4addca-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f031a4cbcca-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"mn_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"mn"},"ru_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"ru"},"pt_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"pt"},"tw_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"tw"},"kk_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"kk"},"ms_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"ms"},"ko_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"ko"},"az_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"az"},"pt_br_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"pt_br"},"es_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"es"},"cn_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/solid-color-1125x2436-1774947198874.png","content":"","isNeedLogin":2,"id":94,"lang":"cn"},"vi_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"vi"},"th_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"th"},"en_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/solid-color-1125x2436-1774947211887.png","content":"","isNeedLogin":2,"id":94,"lang":"en"},"ja_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/solid-color-1125x2436-1774947146373.png","content":"","isNeedLogin":2,"id":94,"lang":"ja"},"id_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"id":94,"lang":"id"}},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962650209} 
 </msg>
<msg time="2026-05-28T18:04:10.223553" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:10.223892" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:09.803024" elapsed="0.420933"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:10.224236" elapsed="0.000121"/>
</return>
<msg time="2026-05-28T18:04:10.224735" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/app/public/open-screen/list</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:09.802371" elapsed="0.422420"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.227373" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:10.226161" elapsed="0.001365"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.228839" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.227803" elapsed="0.001084"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.229327" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.229082" elapsed="0.000314"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:10.225317" elapsed="0.004176"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.231359" level="INFO">${json_data} = {'code': 0, 'data': {'mn_0': {'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal', 'domesticLink': 'https://www.bitradex-test.com/zh-CN/...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.230277" elapsed="0.001126"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.231597" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.232258" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.232072" elapsed="0.000261"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:10.229791" elapsed="0.002632"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.233850" level="INFO">${json_data} = {'code': 0, 'data': {'mn_0': {'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal', 'domesticLink': 'https://www.bitradex-test.com/zh-CN/...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.233074" elapsed="0.000810"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.235043" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "mn_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https:/...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:10.234034" elapsed="0.001046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.235456" level="INFO">{
  "code": 0,
  "data": {
    "mn_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "mn"
    },
    "ru_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "ru"
    },
    "pt_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "pt"
    },
    "tw_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "tw"
    },
    "kk_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "kk"
    },
    "ms_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "ms"
    },
    "ko_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "ko"
    },
    "az_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "az"
    },
    "pt_br_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "pt_br"
    },
    "es_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "es"
    },
    "cn_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/solid-color-1125x2436-1774947198874.png",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "cn"
    },
    "vi_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "vi"
    },
    "th_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "th"
    },
    "en_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/solid-color-1125x2436-1774947211887.png",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "en"
    },
    "ja_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/solid-color-1125x2436-1774947146373.png",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "ja"
    },
    "id_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "id": 94,
      "lang": "id"
    }
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962650209
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.235224" elapsed="0.000493"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:10.232686" elapsed="0.003104"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.237033" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.236409" elapsed="0.000655"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:10.237658" elapsed="0.000579"/>
</kw>
<msg time="2026-05-28T18:04:10.238341" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:10.237243" elapsed="0.001126"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.238687" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.238518" elapsed="0.000195"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.239056" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.238841" elapsed="0.000241"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.239375" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.239205" elapsed="0.000196"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.239809" level="INFO">${summary_content} = 🧪 测试过程: 获取开屏广告列表 | 📡 请求接口: /v1/app/public/open-screen/list | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.239519" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.240158" level="INFO">${final_summary} = 🧪 测试过程: 获取开屏广告列表 | 📡 请求接口: /v1/app/public/open-screen/list | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.239955" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.240437" level="INFO">🧪 测试过程: 获取开屏广告列表 | 📡 请求接口: /v1/app/public/open-screen/list | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.240309" elapsed="0.000179"/>
</kw>
<arg>获取开屏广告列表</arg>
<arg>/v1/app/public/open-screen/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:10.236025" elapsed="0.004531"/>
</kw>
<doc>验证开屏广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:09.798638" elapsed="0.442107"/>
</test>
<doc>开屏广告列表接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:09.785699" elapsed="0.455494"/>
</suite>
<suite id="s1-s1-s7" name="Open Screen List Lang" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/open_screen_list_lang.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.247086" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:10.246834" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.247640" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.247479" elapsed="0.000216"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:10.247226" elapsed="0.000511"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.247875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.247764" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:10.247202" elapsed="0.000751"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.248745" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.248601" elapsed="0.000193"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.249054" elapsed="0.000028"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.249194" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.249332" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.249466" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.249589" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.248868" elapsed="0.000770"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.251420" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.251560" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.251688" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.251970" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.252102" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.252226" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.252352" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.252474" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.252608" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.251220" elapsed="0.001444"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.253048" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.252789" elapsed="0.000309"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.253436" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.253216" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.253812" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.253598" elapsed="0.000257"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.254193" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.253970" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.254570" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.254352" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.254945" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.254729" elapsed="0.000258"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.255297" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.255100" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.255623" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.255430" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.255948" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.255755" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:10.252688" elapsed="0.003327"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:10.248850" elapsed="0.007183"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.256269" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.256120" elapsed="0.000190"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:10.256677" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:10.256407" elapsed="0.000416"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:10.248290" elapsed="0.008598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.257069" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.256986" elapsed="0.000122"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:10.246468" elapsed="0.010689"/>
</kw>
<test id="s1-s1-s7-t1" name="获取开屏广告语言列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.259784" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.259189" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.260340" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.259908" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:10.259892" elapsed="0.000540"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:10.260462" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T18:04:10.260630" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:10.258465" elapsed="0.002186"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:10.656177" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/open-screen/list/lang 
 path_url=/v1/app/public/open-screen/list/lang 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:10.656609" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/open-screen/list/lang 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:10 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/open-screen/list/lang', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '66842a185c298ff3abdd98e8fd357432', 'X-Transparent': '00-66842a185c298ff3abdd98e8fd357432-fb53ccca259a1596-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f05ceecddc9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[{"maxImpressions":2,"visibilityScope":"ALL","link":"https://www.bitradex-test.com/battle/spinnerPhase2","domesticLink":"https://www.bitradex-test.com/battle/spinnerPhase2","templateCode":"app_popup","type":1,"priority":99,"title":"","url":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964905160.png","content":"","blackUrl":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964909361.png","isNeedLogin":1,"whiteUrl":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964905160.png","timeInterval":4,"id":23,"lang":"cn"},{"maxImpressions":2,"visibilityScope":"ALL","link":"https://www.bitradex-test.com/battle/spinnerPhase2","domesticLink":"https://www.bitradex-test.com/battle/spinnerPhase2","templateCode":"app_popup","type":1,"priority":222,"title":"","url":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768964431319.png","content":"","blackUrl":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768964435175.png","isNeedLogin":1,"whiteUrl":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768964431319.png","timeInterval":4,"id":28,"lang":"cn"},{"maxImpressions":2,"visibilityScope":"ALL","link":"https://www.bitradex-test.com/battle/seckill?activityId=P6GTDP9FHXTY","domesticLink":"https://www.bitradex-test.com/battle/seckill?activityId=P6GTDP9FHXTY","templateCode":"app_popup","type":1,"priority":996,"title":"","url":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768839098019.png","content":"邀请好友，最高享受30%返佣！","blackUrl":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768839102436.png","isNeedLogin":1,"whiteUrl":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768839098019.png","timeInterval":4,"id":37,"lang":"cn"}],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962650641} 
 </msg>
<msg time="2026-05-28T18:04:10.656879" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:10.657296" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:10.261334" elapsed="0.396032"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:10.657634" elapsed="0.000155"/>
</return>
<msg time="2026-05-28T18:04:10.658230" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:10.260767" elapsed="0.397523"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.661417" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:10.660054" elapsed="0.001522"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.662935" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.661860" elapsed="0.001129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.663536" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.663243" elapsed="0.000388"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:10.659062" elapsed="0.004694"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.665730" level="INFO">${json_data} = {'code': 0, 'data': [{'maxImpressions': 2, 'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/battle/spinnerPhase2', 'domesticLink': 'https://www.bitradex-test.com/battle/spinnerPhase2',...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.664745" elapsed="0.001032"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.665961" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.666623" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.666432" elapsed="0.000325"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:10.664099" elapsed="0.002741"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.668381" level="INFO">${json_data} = {'code': 0, 'data': [{'maxImpressions': 2, 'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/battle/spinnerPhase2', 'domesticLink': 'https://www.bitradex-test.com/battle/spinnerPhase2',...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.667526" elapsed="0.000897"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.669756" level="INFO">${json_str} = {
  "code": 0,
  "data": [
    {
      "maxImpressions": 2,
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/battle/spinnerPhase2",
      "domesticLink": "https://www.bitra...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:10.668611" elapsed="0.001186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.670202" level="INFO">{
  "code": 0,
  "data": [
    {
      "maxImpressions": 2,
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/battle/spinnerPhase2",
      "domesticLink": "https://www.bitradex-test.com/battle/spinnerPhase2",
      "templateCode": "app_popup",
      "type": 1,
      "priority": 99,
      "title": "",
      "url": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964905160.png",
      "content": "",
      "blackUrl": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964909361.png",
      "isNeedLogin": 1,
      "whiteUrl": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964905160.png",
      "timeInterval": 4,
      "id": 23,
      "lang": "cn"
    },
    {
      "maxImpressions": 2,
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/battle/spinnerPhase2",
      "domesticLink": "https://www.bitradex-test.com/battle/spinnerPhase2",
      "templateCode": "app_popup",
      "type": 1,
      "priority": 222,
      "title": "",
      "url": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768964431319.png",
      "content": "",
      "blackUrl": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768964435175.png",
      "isNeedLogin": 1,
      "whiteUrl": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768964431319.png",
      "timeInterval": 4,
      "id": 28,
      "lang": "cn"
    },
    {
      "maxImpressions": 2,
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/battle/seckill?activityId=P6GTDP9FHXTY",
      "domesticLink": "https://www.bitradex-test.com/battle/seckill?activityId=P6GTDP9FHXTY",
      "templateCode": "app_popup",
      "type": 1,
      "priority": 996,
      "title": "",
      "url": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768839098019.png",
      "content": "邀请好友，最高享受30%返佣！",
      "blackUrl": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768839102436.png",
      "isNeedLogin": 1,
      "whiteUrl": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410x340-1768839098019.png",
      "timeInterval": 4,
      "id": 37,
      "lang": "cn"
    }
  ],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962650641
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.669953" elapsed="0.000410"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:10.667090" elapsed="0.003354"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:10.671329" level="INFO">${data} = [{'maxImpressions': 2, 'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/battle/spinnerPhase2', 'domesticLink': 'https://www.bitradex-test.com/battle/spinnerPhase2', 'templateCode': 'ap...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.670596" elapsed="0.000768"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.671507" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证语言列表结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($lang_list, list)</arg>
<arg>语言数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.672771" elapsed="0.000265"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.673319" level="INFO">Length is 3.</msg>
<msg time="2026-05-28T18:04:10.673399" level="INFO">${length} = 3</msg>
<var>${length}</var>
<arg>${lang_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:10.673183" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.673687" level="INFO">语言列表包含 3 个语言项</msg>
<arg>语言列表包含 ${length} 个语言项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.673555" elapsed="0.000175"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证语言项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($lang_item, dict)</arg>
<arg>语言项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.674907" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.675396" level="INFO">语言项内容: {'maxImpressions': 2, 'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/battle/spinnerPhase2', 'domesticLink': 'https://www.bitradex-test.com/battle/spinnerPhase2', 'templateCode': 'app_popup', 'type': 1, 'priority': 99, 'title': '', 'url': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964905160.png', 'content': '', 'blackUrl': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964909361.png', 'isNeedLogin': 1, 'whiteUrl': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/app/410-1768964905160.png', 'timeInterval': 4, 'id': 23, 'lang': 'cn'}</msg>
<arg>语言项内容: ${lang_item}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.675255" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:10.675951" level="FAIL">Dictionary does not contain key 'code'.</msg>
<arg>${lang_item}</arg>
<arg>code</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:10.675712" elapsed="0.000344">Dictionary does not contain key 'code'.</status>
</kw>
<msg time="2026-05-28T18:04:10.676152" level="INFO">${has_code} = False</msg>
<var>${has_code}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${lang_item}</arg>
<arg>code</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:10.675568" elapsed="0.000609"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_code}</arg>
<arg>Log</arg>
<arg>语言代码: ${lang_item['code']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.676345" elapsed="0.000113"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:10.676872" level="FAIL">Dictionary does not contain key 'name'.</msg>
<arg>${lang_item}</arg>
<arg>name</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:10.676707" elapsed="0.000223">Dictionary does not contain key 'name'.</status>
</kw>
<msg time="2026-05-28T18:04:10.677019" level="INFO">${has_name} = False</msg>
<var>${has_name}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${lang_item}</arg>
<arg>name</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:10.676576" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_name}</arg>
<arg>Log</arg>
<arg>语言名称: ${lang_item['name']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.677165" elapsed="0.000114"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${lang_item}</arg>
<arg>lang</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.677513" elapsed="0.000127"/>
</kw>
<msg time="2026-05-28T18:04:10.677717" level="INFO">${has_lang} = True</msg>
<var>${has_lang}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${lang_item}</arg>
<arg>lang</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:10.677393" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.678469" level="INFO">语言标识: cn</msg>
<arg>语言标识: ${lang_item['lang']}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.677995" elapsed="0.000514"/>
</kw>
<arg>${has_lang}</arg>
<arg>Log</arg>
<arg>语言标识: ${lang_item['lang']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.677846" elapsed="0.000709"/>
</kw>
<arg>${lang_list[0]}</arg>
<doc>验证单个语言项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:10.674144" elapsed="0.004468"/>
</kw>
<arg>${length} &gt; 0</arg>
<arg>验证语言项结构</arg>
<arg>${lang_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.673849" elapsed="0.004807"/>
</kw>
<arg>${data}</arg>
<doc>验证语言列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:10.672408" elapsed="0.006301"/>
</kw>
<arg>isinstance($data, list)</arg>
<arg>验证语言列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.672003" elapsed="0.006748"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>验证语言字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:10.678866" elapsed="0.000164"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.680011" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.679526" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:10.680295" elapsed="0.000477"/>
</kw>
<msg time="2026-05-28T18:04:10.680852" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:10.680153" elapsed="0.000722"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.681127" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.680991" elapsed="0.000162"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.681437" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.681262" elapsed="0.000197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.682167" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.681568" elapsed="0.000646"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.682759" level="INFO">${summary_content} = 🧪 测试过程: 获取开屏广告语言列表 | 📡 请求接口: /v1/app/public/open-screen/list/lang | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:10.682407" elapsed="0.000387"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.683186" level="INFO">${final_summary} = 🧪 测试过程: 获取开屏广告语言列表 | 📡 请求接口: /v1/app/public/open-screen/list/lang | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:10.682941" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.683492" level="INFO">🧪 测试过程: 获取开屏广告语言列表 | 📡 请求接口: /v1/app/public/open-screen/list/lang | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.683346" elapsed="0.000196"/>
</kw>
<arg>获取开屏广告语言列表</arg>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:10.679217" elapsed="0.004391"/>
</kw>
<doc>验证开屏广告语言列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:10.257213" elapsed="0.426545"/>
</test>
<doc>开屏广告语言列表接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:10.242328" elapsed="0.441809"/>
</suite>
<suite id="s1-s1-s8" name="Vajra District" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/vajra_district.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.689523" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:10.689304" elapsed="0.000250"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.690016" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.689873" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:10.689654" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.690218" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.690128" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:10.689625" elapsed="0.000658"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.690894" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.690778" elapsed="0.000156"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691134" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691248" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691354" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691454" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691556" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.690992" elapsed="0.000609"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691761" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691869" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.691973" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.692074" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.692172" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.692272" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.692372" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.692469" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.692568" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.691621" elapsed="0.000989"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.693040" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.692711" elapsed="0.000368"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.693365" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.693181" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.693686" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.693502" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.694007" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.693825" elapsed="0.000218"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.694327" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.694142" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.694634" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.694461" elapsed="0.000204"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.694914" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.694749" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.695233" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.695063" elapsed="0.000200"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.695517" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:10.695349" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:10.692629" elapsed="0.002946"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:10.690977" elapsed="0.004615"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.695790" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.695667" elapsed="0.000157"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:10.696157" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:10.695908" elapsed="0.000425"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:10.690542" elapsed="0.005847"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.696546" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:10.696476" elapsed="0.000102"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:10.689041" elapsed="0.007580"/>
</kw>
<test id="s1-s1-s8-t1" name="获取Vajra District列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.698630" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.698067" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:10.699184" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:10.698758" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:10.698742" elapsed="0.000507"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:10.699278" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T18:04:10.699481" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:10.697405" elapsed="0.002099"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:10.699739" level="INFO">&amp;{params} = { version=new }</msg>
<var>&amp;{params}</var>
<arg>version=new</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:10.699596" elapsed="0.000164"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:11.079815" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/app/public/vajra-district/list?version=new 
 path_url=/v1/app/public/vajra-district/list?version=new 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:11.080252" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/vajra-district/list?version=new 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/vajra-district/list', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'f9a9cc9a902028d32ebaecf59e36402f', 'X-Transparent': '00-f9a9cc9a902028d32ebaecf59e36402f-fe8cf48d4f06b10c-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f081b31854e-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[{"sonList":[{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ba87be22637a47299788f08e31b2dac3.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/32f6123dbd344e89b465a7d2deee4e30.png","nameAll":{"kk":"AI Trading","hi":"AI earn","mn":"AI Trading","hk":"AI earn","ru":"Ты очень красивый/красивая","tw":"AI Trading","ko":"AI 트레이딩","pt":"AI Trading","ms":"AI earn ms","en":"AI Trading","cn":"AI智投","pt_br":"AI Trading","fr":"AI earn","es":"AI earn","vi":"Giao dịch AI","th":"AI earn","ja":"AI知能投資","az":"AI Trading","id":"AI earn","pt ":"AI Trading","tr":"AI earn"},"newLabel":"124%","name":"AI智投","link":"noahex://app.com/noah/ai/home","id":132,"label":0},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/53220d07505e40ba9900ccf462c79830.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/d77aa9bea17c4555835f287afb2bc4e4.png","nameAll":{"kk":"redPackage","ptbr":"redPackage","hi":"AI earn","mn":"redPackage","hk":"AI earn","ru":"самого лучшего","tw":"redPackage","ko":"redPackage","pt":"redPackage","ms":"redPackage","pt-br":"yingwen","en":"redPackage","cn":"红包","pt_br":"redPackage","fr":"AI earn","es":"redPackage","vi":"redPackage","th":"redPackage","ja":"redPackage","az":"redPackage","id":"redPackage","pt ":"AI Trading","tr":"AI earn"},"newLabel":"9,800","name":"红包","link":"noahex://app.com/redPackage","id":140,"label":1},{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/6e8a19ffd073453f9159e56dcd97dc0b.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ed693bc5f8764797b1c3f8c26fdd966d.png","nameAll":{"kk":"大转盘","ptbr":"大转盘","hi":"Help Center","mn":"大转盘","hk":"Help Center","ru":"大转盘","tw":"大转盘","ko":"大转盘","pt":"大转盘","ms":"大转盘","en":"大转盘","cn":"大转盘","pt_br":"大转盘","fr":"Help Center","es":"大转盘","vi":"大转盘","th":"大转盘","ja":"大转盘","az":"大转盘","id":"大转盘","pt ":"visa card","tr":"Help Center"},"newLabel":"","name":"大转盘","link":"/en/battle/spinnerPhase3","id":138,"label":1},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/cb16dc4c500f452d802d97395a8e9c35.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/2cc807475a304083b6ad3a09ef61f833.png","nameAll":{"kk":"事件合约en","mn":"事件合约en","ru":"ʐɨlɐˈju tʲɪˈbʲɛ fsʲɪˈvo sɐˈmɨvə ˈlutʂɪvə ˈv ʐɨzʲˈnʲi","tw":"事件合约en","ko":"事件合约en","pt":"事件合约en","ms":"事件合约en","en":"事件合约en","cn":"事件合约","pt_br":"事件合约en","es":"事件合约en","vi":"事件合约en","th":"事件合约en","ja":"事件合约en","az":"事件合约en","id":"事件合约en"},"newLabel":"0 Fee","name":"事件合约","link":"noahex://app.com/trade/couponTabPage?type=contract&amp;symbol=btc_usdt","id":147,"label":0},{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/dcf64ec6cca04e1e8584e2db3d88e26b.jpg","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/fd26ef7967b9405cb35aabb77245d347.jpg","nameAll":{"kk":"巅峰邀请赛EN","ptbr":"活动中心","hi":"shequn","mn":"巅峰邀请赛EN","hk":"shequn","ru":"ɨlɐˈju tʲɪˈbʲɛ fsʲɪˈvo sɐˈmɨvə ˈlut","tw":"巅峰邀请赛EN","ko":"巅峰邀请赛EN","pt":"巅峰邀请赛EN","ms":"巅峰邀请赛EN","en":"巅峰邀请赛EN","cn":"巅峰邀请赛CN你@#¥%6参加了吗不参加太可惜了","pt_br":"巅峰邀请赛EN","fr":"shequn","es":"巅峰邀请赛EN","vi":"巅峰邀请赛EN","th":"巅峰邀请赛EN","ja":"巅峰邀请赛EN","az":"巅峰邀请赛","id":"巅峰邀请赛EN","tr":"shequn"},"newLabel":"","name":"巅峰邀请赛CN你@#¥%6参加了吗不参加太可惜了","link":"https://www.bitradex-test.com/battle/peakInvitationalTournament/internal","id":145,"label":0},{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/841e65458fbd471b9a8d7967cc05c45d.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/d1cddf42bf23443c9272683fde67f1f0.png","nameAll":{"kk":"222","ptbr":"222","mn":"222","ru":"Привет, как дела?","tw":"222","ko":"222","pt":"222","ms":"222","en":"巅峰表单","cn":"巅峰表单","pt_br":"222","es":"222","vi":"222","th":"222","ja":"巅峰表单","az":"1111","id":"222"},"newLabel":"","name":"巅峰表单","link":"/battle/peakinvitationalform","id":142,"label":0},{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/3c4f9e772a9b48ad915d30be37bf5445.jpeg","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/453e1f721ae54b799dcef1e4987842af.jpeg","nameAll":{"kk":"visa card","hi":"Help Center","mn":"visa card","hk":"Help Center","ru":"visa card","tw":"visa card","ko":"visa card","pt":"visa card","ms":"visa card","en":"visa card","cn":"visa","pt_br":"visa card","fr":"Help Center","es":"visa card","vi":"visa card","th":"visa card","ja":"visa card","az":"visa","id":"visa card","pt ":"visa card","tr":"Help Center"},"newLabel":"","name":"visa","link":"/btxCard/home","id":135,"label":0},{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/a94acd192e8b40f3b37c70a2742c731b.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/f8c96320ba704e99bbe5bb7ff0d13e7b.png","nameAll":{"kk":"landingpage","hi":"Invite Friends","mn":"landingpage","hk":"Invite Friends","ru":"ʐɨzʲˈnʲi","tw":"landingpage","ko":"landingpage","pt":"landingpage","ms":"landingpage","en":"landingpage","cn":"landingpage","pt_br":"landingpage","fr":"Invite Friends","es":"landingpage","vi":"landingpage","th":"landingpage","ja":"landingpage","az":"landingpage","id":"landingpage","pt ":"Team","tr":"Invite Friends"},"newLabel":"","name":"landingpage","link":"/futures-campaign","id":148,"label":0},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/8004516043604c0caba5ed1629cbe670.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/5e779eb20d9a4cbdb1892c16f80c5633.png","nameAll":{"kk":"BXC","hi":"Invite Friends","mn":"BXC","hk":"Invite Friends","ru":"ɐˈju tʲɪˈbʲɛ fsʲɪˈvo sɐˈ","tw":"BXC","ko":"BXC","pt":"BXC","ms":"BXC","en":"BXC","cn":"BXC","pt_br":"BXC","fr":"Invite Friends","es":"BXC","vi":"BXC","th":"BXC","ja":"BXC","az":"BXC","id":"BXC","pt ":"Team","tr":"Invite Friends"},"newLabel":"new","name":"BXC","link":"/token/bxc","id":146,"label":0},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/55374a597aaf48f48ef6a87a62fc44d8.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ce7e6827098741a0a5043dccd9593f5f.png","nameAll":{"kk":"111","mn":"111","ru":"Желаю тебе всего самого лучшего в жизни!","tw":"111","ko":"111","pt":"111","ms":"111","en":"111","cn":"111你@#¥%6参加了吗不参加太可惜了","pt_br":"111","es":"111","vi":"111","th":"111","ja":"111","az":"大转盘你@#¥%6参加了吗不参加太可惜了","id":"111"},"newLabel":"","name":"111你@#¥%6参加了吗不参加太可惜了","link":"/zh-CN/battle/spinnerPhase3","id":149,"label":0}]}],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779962651063} 
 </msg>
<msg time="2026-05-28T18:04:11.080799" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:11.081187" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:10.700228" elapsed="0.381025"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:11.081489" elapsed="0.000137"/>
</return>
<msg time="2026-05-28T18:04:11.082048" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/app/public/vajra-district/list</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=&amp;{headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:10.699875" elapsed="0.382228"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.084852" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:11.083589" elapsed="0.001424"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.086459" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.085327" elapsed="0.001191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.087094" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.086808" elapsed="0.000376"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:11.082701" elapsed="0.004612"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.089945" level="INFO">${json_data} = {'code': 0, 'data': [{'sonList': [{'isNeedLogin': 0, 'nightIcon': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ba87be22637a47299788f08e31b2dac...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.088290" elapsed="0.001709"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.090227" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.090890" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.090698" elapsed="0.000256"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:11.087650" elapsed="0.003393"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.093244" level="INFO">${json_data} = {'code': 0, 'data': [{'sonList': [{'isNeedLogin': 0, 'nightIcon': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ba87be22637a47299788f08e31b2dac...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.091706" elapsed="0.001585"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.094810" level="INFO">${json_str} = {
  "code": 0,
  "data": [
    {
      "sonList": [
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:11.093480" elapsed="0.001367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.095306" level="INFO">{
  "code": 0,
  "data": [
    {
      "sonList": [
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ba87be22637a47299788f08e31b2dac3.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/32f6123dbd344e89b465a7d2deee4e30.png",
          "nameAll": {
            "kk": "AI Trading",
            "hi": "AI earn",
            "mn": "AI Trading",
            "hk": "AI earn",
            "ru": "Ты очень красивый/красивая",
            "tw": "AI Trading",
            "ko": "AI 트레이딩",
            "pt": "AI Trading",
            "ms": "AI earn ms",
            "en": "AI Trading",
            "cn": "AI智投",
            "pt_br": "AI Trading",
            "fr": "AI earn",
            "es": "AI earn",
            "vi": "Giao dịch AI",
            "th": "AI earn",
            "ja": "AI知能投資",
            "az": "AI Trading",
            "id": "AI earn",
            "pt ": "AI Trading",
            "tr": "AI earn"
          },
          "newLabel": "124%",
          "name": "AI智投",
          "link": "noahex://app.com/noah/ai/home",
          "id": 132,
          "label": 0
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/53220d07505e40ba9900ccf462c79830.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/d77aa9bea17c4555835f287afb2bc4e4.png",
          "nameAll": {
            "kk": "redPackage",
            "ptbr": "redPackage",
            "hi": "AI earn",
            "mn": "redPackage",
            "hk": "AI earn",
            "ru": "самого лучшего",
            "tw": "redPackage",
            "ko": "redPackage",
            "pt": "redPackage",
            "ms": "redPackage",
            "pt-br": "yingwen",
            "en": "redPackage",
            "cn": "红包",
            "pt_br": "redPackage",
            "fr": "AI earn",
            "es": "redPackage",
            "vi": "redPackage",
            "th": "redPackage",
            "ja": "redPackage",
            "az": "redPackage",
            "id": "redPackage",
            "pt ": "AI Trading",
            "tr": "AI earn"
          },
          "newLabel": "9,800",
          "name": "红包",
          "link": "noahex://app.com/redPackage",
          "id": 140,
          "label": 1
        },
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/6e8a19ffd073453f9159e56dcd97dc0b.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ed693bc5f8764797b1c3f8c26fdd966d.png",
          "nameAll": {
            "kk": "大转盘",
            "ptbr": "大转盘",
            "hi": "Help Center",
            "mn": "大转盘",
            "hk": "Help Center",
            "ru": "大转盘",
            "tw": "大转盘",
            "ko": "大转盘",
            "pt": "大转盘",
            "ms": "大转盘",
            "en": "大转盘",
            "cn": "大转盘",
            "pt_br": "大转盘",
            "fr": "Help Center",
            "es": "大转盘",
            "vi": "大转盘",
            "th": "大转盘",
            "ja": "大转盘",
            "az": "大转盘",
            "id": "大转盘",
            "pt ": "visa card",
            "tr": "Help Center"
          },
          "newLabel": "",
          "name": "大转盘",
          "link": "/en/battle/spinnerPhase3",
          "id": 138,
          "label": 1
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/cb16dc4c500f452d802d97395a8e9c35.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/2cc807475a304083b6ad3a09ef61f833.png",
          "nameAll": {
            "kk": "事件合约en",
            "mn": "事件合约en",
            "ru": "ʐɨlɐˈju tʲɪˈbʲɛ fsʲɪˈvo sɐˈmɨvə ˈlutʂɪvə ˈv ʐɨzʲˈnʲi",
            "tw": "事件合约en",
            "ko": "事件合约en",
            "pt": "事件合约en",
            "ms": "事件合约en",
            "en": "事件合约en",
            "cn": "事件合约",
            "pt_br": "事件合约en",
            "es": "事件合约en",
            "vi": "事件合约en",
            "th": "事件合约en",
            "ja": "事件合约en",
            "az": "事件合约en",
            "id": "事件合约en"
          },
          "newLabel": "0 Fee",
          "name": "事件合约",
          "link": "noahex://app.com/trade/couponTabPage?type=contract&amp;symbol=btc_usdt",
          "id": 147,
          "label": 0
        },
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/dcf64ec6cca04e1e8584e2db3d88e26b.jpg",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/fd26ef7967b9405cb35aabb77245d347.jpg",
          "nameAll": {
            "kk": "巅峰邀请赛EN",
            "ptbr": "活动中心",
            "hi": "shequn",
            "mn": "巅峰邀请赛EN",
            "hk": "shequn",
            "ru": "ɨlɐˈju tʲɪˈbʲɛ fsʲɪˈvo sɐˈmɨvə ˈlut",
            "tw": "巅峰邀请赛EN",
            "ko": "巅峰邀请赛EN",
            "pt": "巅峰邀请赛EN",
            "ms": "巅峰邀请赛EN",
            "en": "巅峰邀请赛EN",
            "cn": "巅峰邀请赛CN你@#¥%6参加了吗不参加太可惜了",
            "pt_br": "巅峰邀请赛EN",
            "fr": "shequn",
            "es": "巅峰邀请赛EN",
            "vi": "巅峰邀请赛EN",
            "th": "巅峰邀请赛EN",
            "ja": "巅峰邀请赛EN",
            "az": "巅峰邀请赛",
            "id": "巅峰邀请赛EN",
            "tr": "shequn"
          },
          "newLabel": "",
          "name": "巅峰邀请赛CN你@#¥%6参加了吗不参加太可惜了",
          "link": "https://www.bitradex-test.com/battle/peakInvitationalTournament/internal",
          "id": 145,
          "label": 0
        },
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/841e65458fbd471b9a8d7967cc05c45d.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/d1cddf42bf23443c9272683fde67f1f0.png",
          "nameAll": {
            "kk": "222",
            "ptbr": "222",
            "mn": "222",
            "ru": "Привет, как дела?",
            "tw": "222",
            "ko": "222",
            "pt": "222",
            "ms": "222",
            "en": "巅峰表单",
            "cn": "巅峰表单",
            "pt_br": "222",
            "es": "222",
            "vi": "222",
            "th": "222",
            "ja": "巅峰表单",
            "az": "1111",
            "id": "222"
          },
          "newLabel": "",
          "name": "巅峰表单",
          "link": "/battle/peakinvitationalform",
          "id": 142,
          "label": 0
        },
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/3c4f9e772a9b48ad915d30be37bf5445.jpeg",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/453e1f721ae54b799dcef1e4987842af.jpeg",
          "nameAll": {
            "kk": "visa card",
            "hi": "Help Center",
            "mn": "visa card",
            "hk": "Help Center",
            "ru": "visa card",
            "tw": "visa card",
            "ko": "visa card",
            "pt": "visa card",
            "ms": "visa card",
            "en": "visa card",
            "cn": "visa",
            "pt_br": "visa card",
            "fr": "Help Center",
            "es": "visa card",
            "vi": "visa card",
            "th": "visa card",
            "ja": "visa card",
            "az": "visa",
            "id": "visa card",
            "pt ": "visa card",
            "tr": "Help Center"
          },
          "newLabel": "",
          "name": "visa",
          "link": "/btxCard/home",
          "id": 135,
          "label": 0
        },
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/a94acd192e8b40f3b37c70a2742c731b.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/f8c96320ba704e99bbe5bb7ff0d13e7b.png",
          "nameAll": {
            "kk": "landingpage",
            "hi": "Invite Friends",
            "mn": "landingpage",
            "hk": "Invite Friends",
            "ru": "ʐɨzʲˈnʲi",
            "tw": "landingpage",
            "ko": "landingpage",
            "pt": "landingpage",
            "ms": "landingpage",
            "en": "landingpage",
            "cn": "landingpage",
            "pt_br": "landingpage",
            "fr": "Invite Friends",
            "es": "landingpage",
            "vi": "landingpage",
            "th": "landingpage",
            "ja": "landingpage",
            "az": "landingpage",
            "id": "landingpage",
            "pt ": "Team",
            "tr": "Invite Friends"
          },
          "newLabel": "",
          "name": "landingpage",
          "link": "/futures-campaign",
          "id": 148,
          "label": 0
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/8004516043604c0caba5ed1629cbe670.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/5e779eb20d9a4cbdb1892c16f80c5633.png",
          "nameAll": {
            "kk": "BXC",
            "hi": "Invite Friends",
            "mn": "BXC",
            "hk": "Invite Friends",
            "ru": "ɐˈju tʲɪˈbʲɛ fsʲɪˈvo sɐˈ",
            "tw": "BXC",
            "ko": "BXC",
            "pt": "BXC",
            "ms": "BXC",
            "en": "BXC",
            "cn": "BXC",
            "pt_br": "BXC",
            "fr": "Invite Friends",
            "es": "BXC",
            "vi": "BXC",
            "th": "BXC",
            "ja": "BXC",
            "az": "BXC",
            "id": "BXC",
            "pt ": "Team",
            "tr": "Invite Friends"
          },
          "newLabel": "new",
          "name": "BXC",
          "link": "/token/bxc",
          "id": 146,
          "label": 0
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/55374a597aaf48f48ef6a87a62fc44d8.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/ce7e6827098741a0a5043dccd9593f5f.png",
          "nameAll": {
            "kk": "111",
            "mn": "111",
            "ru": "Желаю тебе всего самого лучшего в жизни!",
            "tw": "111",
            "ko": "111",
            "pt": "111",
            "ms": "111",
            "en": "111",
            "cn": "111你@#¥%6参加了吗不参加太可惜了",
            "pt_br": "111",
            "es": "111",
            "vi": "111",
            "th": "111",
            "ja": "111",
            "az": "大转盘你@#¥%6参加了吗不参加太可惜了",
            "id": "111"
          },
          "newLabel": "",
          "name": "111你@#¥%6参加了吗不参加太可惜了",
          "link": "/zh-CN/battle/spinnerPhase3",
          "id": 149,
          "label": 0
        }
      ]
    }
  ],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779962651063
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.095009" elapsed="0.000700"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:11.091284" elapsed="0.004510"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.097153" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.096508" elapsed="0.000679"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:11.097548" elapsed="0.000684"/>
</kw>
<msg time="2026-05-28T18:04:11.098345" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:11.097348" elapsed="0.001029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.098729" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.098541" elapsed="0.000219"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.099154" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.098909" elapsed="0.000271"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.099486" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.099309" elapsed="0.000204"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.099939" level="INFO">${summary_content} = 🧪 测试过程: 获取Vajra District列表 | 📡 请求接口: /v1/app/public/vajra-district/list | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.099635" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.100325" level="INFO">${final_summary} = 🧪 测试过程: 获取Vajra District列表 | 📡 请求接口: /v1/app/public/vajra-district/list | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.100101" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.100618" level="INFO">🧪 测试过程: 获取Vajra District列表 | 📡 请求接口: /v1/app/public/vajra-district/list | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.100481" elapsed="0.000184"/>
</kw>
<arg>获取Vajra District列表</arg>
<arg>/v1/app/public/vajra-district/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:11.096057" elapsed="0.004673"/>
</kw>
<doc>验证Vajra District列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T18:04:10.696678" elapsed="0.404237"/>
</test>
<doc>Vajra District 接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:10.685270" elapsed="0.416143"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:07.345410" elapsed="3.757169"/>
</suite>
<suite id="s1-s2" name="Future-U" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u">
<suite id="s1-s2-s1" name="Market" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/market">
<suite id="s1-s2-s1-s1" name="Future U Symbol Detail" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/market/future_u_symbol_detail.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.111521" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:11.111287" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.112062" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.111897" elapsed="0.000216"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:11.111662" elapsed="0.000494"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.112274" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.112182" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.111636" elapsed="0.000701"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.112960" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.112843" elapsed="0.000158"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.113213" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.113330" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.113439" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.113544" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.113649" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.113064" elapsed="0.000670"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.113901" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114011" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114117" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114222" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114324" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114428" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114531" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114630" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.114732" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.113754" elapsed="0.001021"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.115093" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.114877" elapsed="0.000254"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.115420" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.115229" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.115745" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.115555" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.116075" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.115877" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.116398" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.116207" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.116722" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.116526" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.117058" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.116854" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.117393" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.117191" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.117733" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.117526" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:11.114794" elapsed="0.003007"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.113048" elapsed="0.004771"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.118051" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.117906" elapsed="0.000187"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:11.118478" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:11.118192" elapsed="0.000463"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.112600" elapsed="0.006124"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.118904" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.118822" elapsed="0.000120"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.110982" elapsed="0.008007"/>
</kw>
<test id="s1-s2-s1-s1-t1" name="获取期货U本位交易对详情" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.120510" level="INFO">&amp;{params} = { symbol=btc_usdt }</msg>
<var>&amp;{params}</var>
<arg>symbol=btc_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.120320" elapsed="0.000214"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.121930" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.121397" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.122533" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.122089" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.122074" elapsed="0.000524"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:11.122626" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T18:04:11.122798" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.120713" elapsed="0.002105"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:11.473533" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/symbol/detail?symbol=btc_usdt 
 path_url=/v1/future-u/market/public/symbol/detail?symbol=btc_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:11.473837" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/symbol/detail?symbol=btc_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'fa012302c9808bcd953d34dc9f091eb3', 'X-Transparent': '00-fa012302c9808bcd953d34dc9f091eb3-6e37873ad4b14a34-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.019', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f0aca1d04be-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"id":1,"symbol":"btc_usdt","symbolGroupId":1,"pair":"btc_usdt","contractType":"PERPETUAL","productType":"perpetual","predictEventType":null,"predictEventParam":null,"predictEventSort":null,"underlyingType":"U_BASED","contractSize":"0.0001","tradeSwitch":true,"openSwitch":true,"isDisplay":true,"isOpenApi":true,"state":0,"initLeverage":5,"initPositionType":"CROSSED","baseCoin":"btc","quoteCoin":"usdt","baseCoinPrecision":8,"baseCoinDisplayPrecision":4,"quoteCoinPrecision":8,"quoteCoinDisplayPrecision":4,"quantityPrecision":0,"pricePrecision":2,"supportOrderType":"LIMIT,MARKET","supportTimeInForce":"GTC,FOK,IOC,GTX","supportEntrustType":"TAKE_PROFIT,STOP,TAKE_PROFIT_MARKET,STOP_MARKET,TRAILING_STOP_MARKET","supportPositionType":"CROSSED,ISOLATED","minQty":"2","minNotional":"5","maxNotional":"10000000000","multiplierDown":"0.5","multiplierUp":"0.5","maxOpenOrders":20000000,"maxEntrusts":20000000,"makerFee":"0.0002","takerFee":"0.0004","liquidationFee":"0.015","marketTakeBound":"0.05","depthPrecisionMerge":5,"labels":["HOT","NEW"],"onboardDate":1651327201000,"enName":"BTCUSDT","cnName":"BTCUSDT ","minStepPrice":"0.01","minPrice":null,"maxPrice":null,"deliveryDate":1667819989000,"deliveryPrice":null,"deliveryCompletion":false,"cnDesc":"cn","enDesc":"en en","cnRemark":null,"enRemark":null,"plates":[1,2]},"ts":1779962651388} 
 </msg>
<msg time="2026-05-28T18:04:11.473996" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:11.474269" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:11.123262" elapsed="0.351064"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:11.474484" elapsed="0.000080"/>
</return>
<msg time="2026-05-28T18:04:11.474855" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:11.122931" elapsed="0.351976"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.476966" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:11.475948" elapsed="0.001139"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.478298" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.477326" elapsed="0.001024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.478851" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.478588" elapsed="0.000350"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:11.475302" elapsed="0.003748"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.481135" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': None, 'data': {'id': 1, 'symbol': 'btc_usdt', 'symbolGroupId': 1, 'pair': 'btc_usdt', 'contractType': 'PERPETUAL', 'productType': 'perpetual', 'predictEventTyp...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.479927" elapsed="0.001267"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.481416" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.482230" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.481984" elapsed="0.000332"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:11.479337" elapsed="0.003088"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.483953" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': None, 'data': {'id': 1, 'symbol': 'btc_usdt', 'symbolGroupId': 1, 'pair': 'btc_usdt', 'contractType': 'PERPETUAL', 'productType': 'perpetual', 'predictEventTyp...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.483164" elapsed="0.000830"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.484842" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": null,
  "data": {
    "id": 1,
    "symbol": "btc_usdt",
    "symbolGroupId": 1,
    "pair": "btc_usdt",
    "contractType": "PERPETUAL",
    "productTy...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:11.484170" elapsed="0.000715"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.485307" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": null,
  "data": {
    "id": 1,
    "symbol": "btc_usdt",
    "symbolGroupId": 1,
    "pair": "btc_usdt",
    "contractType": "PERPETUAL",
    "productType": "perpetual",
    "predictEventType": null,
    "predictEventParam": null,
    "predictEventSort": null,
    "underlyingType": "U_BASED",
    "contractSize": "0.0001",
    "tradeSwitch": true,
    "openSwitch": true,
    "isDisplay": true,
    "isOpenApi": true,
    "state": 0,
    "initLeverage": 5,
    "initPositionType": "CROSSED",
    "baseCoin": "btc",
    "quoteCoin": "usdt",
    "baseCoinPrecision": 8,
    "baseCoinDisplayPrecision": 4,
    "quoteCoinPrecision": 8,
    "quoteCoinDisplayPrecision": 4,
    "quantityPrecision": 0,
    "pricePrecision": 2,
    "supportOrderType": "LIMIT,MARKET",
    "supportTimeInForce": "GTC,FOK,IOC,GTX",
    "supportEntrustType": "TAKE_PROFIT,STOP,TAKE_PROFIT_MARKET,STOP_MARKET,TRAILING_STOP_MARKET",
    "supportPositionType": "CROSSED,ISOLATED",
    "minQty": "2",
    "minNotional": "5",
    "maxNotional": "10000000000",
    "multiplierDown": "0.5",
    "multiplierUp": "0.5",
    "maxOpenOrders": 20000000,
    "maxEntrusts": 20000000,
    "makerFee": "0.0002",
    "takerFee": "0.0004",
    "liquidationFee": "0.015",
    "marketTakeBound": "0.05",
    "depthPrecisionMerge": 5,
    "labels": [
      "HOT",
      "NEW"
    ],
    "onboardDate": 1651327201000,
    "enName": "BTCUSDT",
    "cnName": "BTCUSDT ",
    "minStepPrice": "0.01",
    "minPrice": null,
    "maxPrice": null,
    "deliveryDate": 1667819989000,
    "deliveryPrice": null,
    "deliveryCompletion": false,
    "cnDesc": "cn",
    "enDesc": "en en",
    "cnRemark": null,
    "enRemark": null,
    "plates": [
      1,
      2
    ]
  },
  "ts": 1779962651388
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.485064" elapsed="0.000388"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:11.482709" elapsed="0.002831"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:11.486534" level="INFO">${data} = {'id': 1, 'symbol': 'btc_usdt', 'symbolGroupId': 1, 'pair': 'btc_usdt', 'contractType': 'PERPETUAL', 'productType': 'perpetual', 'predictEventType': None, 'predictEventParam': None, 'predictEventSort'...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.485703" elapsed="0.000875"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.487000" level="INFO">Argument types are:
&lt;class 'dict'&gt;
&lt;class 'NoneType'&gt;</msg>
<arg>${data}</arg>
<arg>${None}</arg>
<arg>响应数据不应该为空</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-28T18:04:11.486748" elapsed="0.000323"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.487238" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证期货交易对详情列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.487686" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证期货交易对详情项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($symbol_detail, dict)</arg>
<arg>交易对详情项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.488741" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${symbol_detail}</arg>
<arg>symbol</arg>
<arg>交易对详情应包含symbol字段</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.489102" elapsed="0.000187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:11.489607" level="INFO">${symbol} = btc_usdt</msg>
<var>${symbol}</var>
<arg>${symbol_detail}</arg>
<arg>symbol</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.489418" elapsed="0.000218"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:11.490106" elapsed="0.000167"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.490771" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:11.490394" elapsed="0.000428"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:11.490950" elapsed="0.000358"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:11.489794" elapsed="0.001590"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'baseAsset' in $symbol_detail</arg>
<arg>验证基础资产</arg>
<arg>${symbol_detail['baseAsset']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.491561" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'quoteAsset' in $symbol_detail</arg>
<arg>验证计价资产</arg>
<arg>${symbol_detail['quoteAsset']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.491861" elapsed="0.000145"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'status' in $symbol_detail</arg>
<arg>验证交易对状态</arg>
<arg>${symbol_detail['status']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.492120" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'baseAssetPrecision' in $symbol_detail</arg>
<arg>验证基础资产精度</arg>
<arg>${symbol_detail['baseAssetPrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.492377" elapsed="0.000138"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'quotePrecision' in $symbol_detail</arg>
<arg>验证计价精度</arg>
<arg>${symbol_detail['quotePrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.492630" elapsed="0.000135"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'orderTypes' in $symbol_detail</arg>
<arg>验证订单类型</arg>
<arg>${symbol_detail['orderTypes']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.492884" elapsed="0.000136"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'icebergAllowed' in $symbol_detail</arg>
<arg>验证冰山订单允许</arg>
<arg>${symbol_detail['icebergAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.493134" elapsed="0.000133"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'ocoAllowed' in $symbol_detail</arg>
<arg>验证OCO订单允许</arg>
<arg>${symbol_detail['ocoAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.493381" elapsed="0.000133"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'isSpotTradingAllowed' in $symbol_detail</arg>
<arg>验证现货交易允许</arg>
<arg>${symbol_detail['isSpotTradingAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.493627" elapsed="0.000135"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'isMarginTradingAllowed' in $symbol_detail</arg>
<arg>验证保证金交易允许</arg>
<arg>${symbol_detail['isMarginTradingAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.493877" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'filters' in $symbol_detail</arg>
<arg>验证过滤器</arg>
<arg>${symbol_detail['filters']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.494124" elapsed="0.000133"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'permissions' in $symbol_detail</arg>
<arg>验证权限</arg>
<arg>${symbol_detail['permissions']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.494370" elapsed="0.000134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.494737" level="INFO">✅ 期货交易对详情项验证通过: btc_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.494611" elapsed="0.000169"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:11.488421" elapsed="0.006413"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证期货交易对详情项结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.488029" elapsed="0.006850"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.495856" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.495364" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:11.496130" elapsed="0.000437"/>
</kw>
<msg time="2026-05-28T18:04:11.496642" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:11.495995" elapsed="0.000669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.496897" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.496773" elapsed="0.000146"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.497193" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.497024" elapsed="0.000190"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.497459" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.497317" elapsed="0.000169"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.497818" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位交易对详情 | 📡 请求接口: /v1/future-u/market/public/symbol/detail | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.497584" elapsed="0.000259"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.498113" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位交易对详情 | 📡 请求接口: /v1/future-u/market/public/symbol/detail | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.497946" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.498368" level="INFO">🧪 测试过程: 获取期货U本位交易对详情 | 📡 请求接口: /v1/future-u/market/public/symbol/detail | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.498269" elapsed="0.000136"/>
</kw>
<arg>获取期货U本位交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:11.495053" elapsed="0.003398"/>
</kw>
<doc>验证期货U本位交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:11.119049" elapsed="0.379521"/>
</test>
<test id="s1-s2-s1-s1-t2" name="获取期货U本位其他交易对详情" line="35">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.500471" level="INFO">&amp;{params} = { symbol=eth_usdt }</msg>
<var>&amp;{params}</var>
<arg>symbol=eth_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.500273" elapsed="0.000229"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.501275" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.500995" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.501571" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.501344" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.501334" elapsed="0.000271"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:11.501618" elapsed="0.000013"/>
</return>
<msg time="2026-05-28T18:04:11.501699" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.500632" elapsed="0.001077"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:11.791130" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/symbol/detail?symbol=eth_usdt 
 path_url=/v1/future-u/market/public/symbol/detail?symbol=eth_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:11.791571" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/symbol/detail?symbol=eth_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'b152fbc09d540125fc6731e90eaf96fe', 'X-Transparent': '00-b152fbc09d540125fc6731e90eaf96fe-db52aa49bc4d1188-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f0c3b0304be-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"id":2,"symbol":"eth_usdt","symbolGroupId":2,"pair":"eth_usdt","contractType":"PERPETUAL","productType":"perpetual","predictEventType":null,"predictEventParam":null,"predictEventSort":null,"underlyingType":"U_BASED","contractSize":"0.01","tradeSwitch":true,"openSwitch":true,"isDisplay":true,"isOpenApi":false,"state":0,"initLeverage":20,"initPositionType":"CROSSED","baseCoin":"eth","quoteCoin":"usdt","baseCoinPrecision":8,"baseCoinDisplayPrecision":4,"quoteCoinPrecision":8,"quoteCoinDisplayPrecision":4,"quantityPrecision":0,"pricePrecision":2,"supportOrderType":"LIMIT,MARKET","supportTimeInForce":"GTC,FOK,IOC,GTX","supportEntrustType":"TAKE_PROFIT,STOP,TAKE_PROFIT_MARKET,STOP_MARKET,TRAILING_STOP_MARKET","supportPositionType":"CROSSED,ISOLATED","minQty":"2","minNotional":"5","maxNotional":"1000000000","multiplierDown":"0.5","multiplierUp":"0.9","maxOpenOrders":400,"maxEntrusts":120,"makerFee":"0.0002","takerFee":"0.0065","liquidationFee":"0.0001","marketTakeBound":"0.05","depthPrecisionMerge":5,"labels":["NEW","HOT"],"onboardDate":1651327319000,"enName":"ETHUSDT","cnName":"ETHUSDT ","minStepPrice":"0.01","minPrice":null,"maxPrice":null,"deliveryDate":null,"deliveryPrice":null,"deliveryCompletion":false,"cnDesc":"","enDesc":"","cnRemark":null,"enRemark":null,"plates":[]},"ts":1779962651747} 
 </msg>
<msg time="2026-05-28T18:04:11.791767" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:11.792207" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:11.501937" elapsed="0.290347"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:11.792478" elapsed="0.000161"/>
</return>
<msg time="2026-05-28T18:04:11.793150" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:11.501768" elapsed="0.291438"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.795983" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:11.794700" elapsed="0.001426"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.797515" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.796409" elapsed="0.001160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.798127" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.797831" elapsed="0.000387"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:11.793811" elapsed="0.004542"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.800552" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': None, 'data': {'id': 2, 'symbol': 'eth_usdt', 'symbolGroupId': 2, 'pair': 'eth_usdt', 'contractType': 'PERPETUAL', 'productType': 'perpetual', 'predictEventTyp...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.799339" elapsed="0.001268"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.800795" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.801454" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.801257" elapsed="0.000263"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:11.798701" elapsed="0.002905"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.803669" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': None, 'data': {'id': 2, 'symbol': 'eth_usdt', 'symbolGroupId': 2, 'pair': 'eth_usdt', 'contractType': 'PERPETUAL', 'productType': 'perpetual', 'predictEventTyp...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.802796" elapsed="0.000916"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.804722" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": null,
  "data": {
    "id": 2,
    "symbol": "eth_usdt",
    "symbolGroupId": 2,
    "pair": "eth_usdt",
    "contractType": "PERPETUAL",
    "productTy...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:11.803899" elapsed="0.000868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.805150" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": null,
  "data": {
    "id": 2,
    "symbol": "eth_usdt",
    "symbolGroupId": 2,
    "pair": "eth_usdt",
    "contractType": "PERPETUAL",
    "productType": "perpetual",
    "predictEventType": null,
    "predictEventParam": null,
    "predictEventSort": null,
    "underlyingType": "U_BASED",
    "contractSize": "0.01",
    "tradeSwitch": true,
    "openSwitch": true,
    "isDisplay": true,
    "isOpenApi": false,
    "state": 0,
    "initLeverage": 20,
    "initPositionType": "CROSSED",
    "baseCoin": "eth",
    "quoteCoin": "usdt",
    "baseCoinPrecision": 8,
    "baseCoinDisplayPrecision": 4,
    "quoteCoinPrecision": 8,
    "quoteCoinDisplayPrecision": 4,
    "quantityPrecision": 0,
    "pricePrecision": 2,
    "supportOrderType": "LIMIT,MARKET",
    "supportTimeInForce": "GTC,FOK,IOC,GTX",
    "supportEntrustType": "TAKE_PROFIT,STOP,TAKE_PROFIT_MARKET,STOP_MARKET,TRAILING_STOP_MARKET",
    "supportPositionType": "CROSSED,ISOLATED",
    "minQty": "2",
    "minNotional": "5",
    "maxNotional": "1000000000",
    "multiplierDown": "0.5",
    "multiplierUp": "0.9",
    "maxOpenOrders": 400,
    "maxEntrusts": 120,
    "makerFee": "0.0002",
    "takerFee": "0.0065",
    "liquidationFee": "0.0001",
    "marketTakeBound": "0.05",
    "depthPrecisionMerge": 5,
    "labels": [
      "NEW",
      "HOT"
    ],
    "onboardDate": 1651327319000,
    "enName": "ETHUSDT",
    "cnName": "ETHUSDT ",
    "minStepPrice": "0.01",
    "minPrice": null,
    "maxPrice": null,
    "deliveryDate": null,
    "deliveryPrice": null,
    "deliveryCompletion": false,
    "cnDesc": "",
    "enDesc": "",
    "cnRemark": null,
    "enRemark": null,
    "plates": []
  },
  "ts": 1779962651747
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.804923" elapsed="0.000365"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:11.801862" elapsed="0.003499"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:11.806257" level="INFO">${data} = {'id': 2, 'symbol': 'eth_usdt', 'symbolGroupId': 2, 'pair': 'eth_usdt', 'contractType': 'PERPETUAL', 'productType': 'perpetual', 'predictEventType': None, 'predictEventParam': None, 'predictEventSort'...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.805517" elapsed="0.000772"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.806653" level="INFO">Argument types are:
&lt;class 'dict'&gt;
&lt;class 'NoneType'&gt;</msg>
<arg>${data}</arg>
<arg>${None}</arg>
<arg>响应数据不应该为空</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="PASS" start="2026-05-28T18:04:11.806435" elapsed="0.000279"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.806862" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证期货交易对详情列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.807340" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证期货交易对详情项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($symbol_detail, dict)</arg>
<arg>交易对详情项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.808514" elapsed="0.000250"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${symbol_detail}</arg>
<arg>symbol</arg>
<arg>交易对详情应包含symbol字段</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.808948" elapsed="0.000208"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:11.809438" level="INFO">${symbol} = eth_usdt</msg>
<var>${symbol}</var>
<arg>${symbol_detail}</arg>
<arg>symbol</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.809274" elapsed="0.000190"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:11.809894" elapsed="0.000162"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.810315" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:11.810170" elapsed="0.000189"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:11.810473" elapsed="0.000178"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:11.809617" elapsed="0.001099"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'baseAsset' in $symbol_detail</arg>
<arg>验证基础资产</arg>
<arg>${symbol_detail['baseAsset']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.810823" elapsed="0.000166"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'quoteAsset' in $symbol_detail</arg>
<arg>验证计价资产</arg>
<arg>${symbol_detail['quoteAsset']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.811111" elapsed="0.000146"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'status' in $symbol_detail</arg>
<arg>验证交易对状态</arg>
<arg>${symbol_detail['status']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.811375" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'baseAssetPrecision' in $symbol_detail</arg>
<arg>验证基础资产精度</arg>
<arg>${symbol_detail['baseAssetPrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.811635" elapsed="0.000138"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'quotePrecision' in $symbol_detail</arg>
<arg>验证计价精度</arg>
<arg>${symbol_detail['quotePrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.811890" elapsed="0.000147"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'orderTypes' in $symbol_detail</arg>
<arg>验证订单类型</arg>
<arg>${symbol_detail['orderTypes']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.812160" elapsed="0.000138"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'icebergAllowed' in $symbol_detail</arg>
<arg>验证冰山订单允许</arg>
<arg>${symbol_detail['icebergAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.812413" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'ocoAllowed' in $symbol_detail</arg>
<arg>验证OCO订单允许</arg>
<arg>${symbol_detail['ocoAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.812734" elapsed="0.000138"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'isSpotTradingAllowed' in $symbol_detail</arg>
<arg>验证现货交易允许</arg>
<arg>${symbol_detail['isSpotTradingAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.812987" elapsed="0.000153"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'isMarginTradingAllowed' in $symbol_detail</arg>
<arg>验证保证金交易允许</arg>
<arg>${symbol_detail['isMarginTradingAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.813256" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'filters' in $symbol_detail</arg>
<arg>验证过滤器</arg>
<arg>${symbol_detail['filters']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.813472" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'permissions' in $symbol_detail</arg>
<arg>验证权限</arg>
<arg>${symbol_detail['permissions']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.813689" elapsed="0.000117"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.814012" level="INFO">✅ 期货交易对详情项验证通过: eth_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.813899" elapsed="0.000153"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:11.808165" elapsed="0.005942"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证期货交易对详情项结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:11.807711" elapsed="0.006437"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.815069" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.814606" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:11.815349" elapsed="0.000447"/>
</kw>
<msg time="2026-05-28T18:04:11.815873" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:11.815207" elapsed="0.000687"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.816141" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.816006" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.816435" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.816263" elapsed="0.000193"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.816747" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.816602" elapsed="0.000167"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.817136" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位其他交易对详情 | 📡 请求接口: /v1/future-u/market/public/symbol/detail | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:11.816868" elapsed="0.000294"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.817444" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位其他交易对详情 | 📡 请求接口: /v1/future-u/market/public/symbol/detail | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:11.817267" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.817847" level="INFO">🧪 测试过程: 获取期货U本位其他交易对详情 | 📡 请求接口: /v1/future-u/market/public/symbol/detail | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.817573" elapsed="0.000351"/>
</kw>
<arg>获取期货U本位其他交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:11.814315" elapsed="0.003698"/>
</kw>
<doc>验证期货U本位其他交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:11.498755" elapsed="0.319417"/>
</test>
<doc>期货U本位交易对详情接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:11.106486" elapsed="0.712029"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:11.105191" elapsed="0.714667"/>
</suite>
<suite id="s1-s2-s2" name="Q" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q">
<suite id="s1-s2-s2-s1" name="Future U Depth" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_depth.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.826289" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:11.826051" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.826761" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.826625" elapsed="0.000178"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:11.826425" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.826955" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.826861" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.826398" elapsed="0.000627"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.827638" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.827523" elapsed="0.000157"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.827889" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828010" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828118" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828220" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828323" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.827739" elapsed="0.000635"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828546" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828663" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828771" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828875" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.828977" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.829080" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.829184" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.829330" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.829435" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.828393" elapsed="0.001086"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.829812" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.829582" elapsed="0.000272"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.830152" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.829958" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.830480" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.830290" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.830819" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.830618" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.831112" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.830936" elapsed="0.000211"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.831399" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.831232" elapsed="0.000198"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.831793" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.831514" elapsed="0.000311"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.832091" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.831913" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.832387" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:11.832208" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:11.829499" elapsed="0.002947"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.827723" elapsed="0.004739"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.832674" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.832546" elapsed="0.000163"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:11.833046" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:11.832797" elapsed="0.000417"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.827283" elapsed="0.005989"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.833436" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:11.833365" elapsed="0.000103"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.825761" elapsed="0.007748"/>
</kw>
<test id="s1-s2-s2-s1-t1" name="获取期货U本位深度数据_BTC" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:11.836034" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:11.835466" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:11.836593" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:11.836161" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:11.836146" elapsed="0.000514"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:11.836688" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T18:04:11.836857" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:11.834788" elapsed="0.002090"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.175310" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100 
 path_url=/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:12.175828" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'ea305bc015f87db5022c9e810a4033d5', 'X-Transparent': '00-ea305bc015f87db5022c9e810a4033d5-665b1eb18bb66d2a-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f0faf11b453-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779962652156,"s":"btc_usdt","u":1423260960186,"b":[["73406.2","27052"],["73406.1","25788"],["73405.9","13480"],["73405.7","17549"],["73405.6","3395"],["73405.4","187968"],["73405.3","165776"],["73405.2","199224"],["73404.3","3392"],["73404.2","13873"],["73403.3","6083"],["73403.1","12867"],["73401.9","48895"],["73401.7","11898"],["73401.4","30593"],["73401.2","3584"],["73400.5","4712"],["73400.2","4756"],["73399.7","2843"],["73399.2","26864"],["73398.9","2765"],["73398.7","2494"],["73398.6","4439"],["73398.1","15606"],["73397.1","4019"],["73395.2","9374"],["73394.7","4901"],["73392.6","15059"],["73391.5","8638"],["73391.1","25051"],["73389.3","28354"],["73388.7","39884"],["73388.2","5292"],["73387.7","5330"],["73387.2","17521"],["73386.8","3003"],["73386.6","5207"],["73384.4","2756"],["73384.2","21522"],["73383.8","4201"],["73381","16723"],["73379.6","25008"],["73377.9","32301"],["73377.7","47896"],["73376.3","3485"],["73372.9","957"],["73371.2","20445"],["73370.5","1550"],["73368.6","3434"],["73367.9","24079"],["73367.6","6130"],["73366.6","27440"],["73365.7","26228"],["73365.6","3614"],["73364.4","25761"],["73364","37004"],["73362.7","22484"],["73361.2","4958"],["73359.5","2109"],["73359.2","11677"],["73358.8","16553"],["73354.5","24226"],["73354.2","5143"],["73353.9","41685"],["73353.8","17587"],["73353.3","3772"],["73352.3","3081"],["73347.9","5897"],["73346.5","1928"],["73344.4","27425"],["73344.3","3590"],["73343.7","57136"],["73343.3","2965"],["73343.2","49472"],["73339.5","17964"],["73339","20596"],["73335.5","4033"],["73332.3","2831"],["73329.8","3877"],["73326.7","18012"],["73323.9","3254"],["73320.7","4488"],["73320.3","10690"],["73318.5","2012"],["73317.8","7578"],["73313.8","46700"],["73313.6","3239"],["73312.9","6853"],["73306.6","3649"],["73305.7","30099"],["73302.7","6147"],["73300.9","22971"],["73299.5","15939"],["73299","3695"],["73298.9","21113"],["73286.5","5300"],["73285.3","29464"],["73278.7","30117"],["73266.8","3295"],["73266.2","7017"]],"a":[["73892.3","22116"],["73892.4","27332"],["73892.6","3166"],["73892.8","16396"],["73892.9","3292"],["73893.2","3286"],["73893.3","182539"],["73893.5","3842"],["73893.7","158560"],["73893.8","143840"],["73894.1","4237"],["73894.4","2450"],["73894.6","7332"],["73895.2","5323"],["73895.6","23872"],["73895.8","17698"],["73896.2","20822"],["73896.8","1567"],["73897.3","21978"],["73898","3194"],["73898.8","18184"],["73898.9","29772"],["73900.2","24461"],["73900.5","2297"],["73902.7","22435"],["73903.1","38632"],["73903.6","33559"],["73904.8","10526"],["73904.9","9629"],["73906.4","3595"],["73906.5","5404"],["73907.2","15946"],["73909.7","5858"],["73909.8","3424"],["73910.3","30768"],["73910.9","3624"],["73911.5","5243"],["73914","548"],["73915","22670"],["73915.1","13013"],["73915.3","6612"],["73917.4","3650"],["73917.8","23090"],["73918","1957"],["73918.5","12371"],["73920.8","3585"],["73921.2","2611"],["73922.4","23820"],["73924.3","12953"],["73925.7","4085"],["73925.9","4525"],["73926.4","11477"],["73928.7","2434"],["73931.7","2034"],["73934.5","8168"],["73934.6","4931"],["73935.6","34711"],["73936.1","3128"],["73936.3","1401"],["73937","28300"],["73937.8","29297"],["73939.3","5511"],["73941.1","30191"],["73943.6","24512"],["73943.7","3637"],["73944.8","46350"],["73949.1","2269"],["73950.5","6986"],["73952.5","46341"],["73953","6737"],["73955.5","21288"],["73957.2","19590"],["73958.9","24743"],["73961.3","8486"],["73962.1","14032"],["73963.3","3159"],["73964.2","7271"],["73964.4","8177"],["73972.7","9665"],["73973.4","4531"],["73976.4","4982"],["73978.1","54229"],["73978.6","20312"],["73979.6","13707"],["73980.5","6412"],["73983.2","9762"],["73983.6","2998"],["73985.5","4025"],["73986.5","2502"],["73986.8","18868"],["73987.7","11565"],["73991.2","5983"],["73997.4","4344"],["73997.8","4930"],["73998","5640"],["74000.3","25391"],["74002.8","4060"],["74006.7","1898"],["74011.2","45085"],["74014.1","6551"]]},"ts":1779962652156} 
 </msg>
<msg time="2026-05-28T18:04:12.176055" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:12.176344" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:11.837302" elapsed="0.339095"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:12.176578" elapsed="0.000098"/>
</return>
<msg time="2026-05-28T18:04:12.176971" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/depth</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=btc_usdt&amp;level=100</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:11.836998" elapsed="0.340017"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.179077" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:12.178148" elapsed="0.001049"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.180267" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.179432" elapsed="0.000871"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.180644" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.180465" elapsed="0.000233"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:12.177480" elapsed="0.003349"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.181706" level="INFO">Length is 5.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:12.180976" elapsed="0.000807"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.182753" level="INFO">${data} = {'t': 1779962652156, 's': 'btc_usdt', 'u': 1423260960186, 'b': [['73406.2', '27052'], ['73406.1', '25788'], ['73405.9', '13480'], ['73405.7', '17549'], ['73405.6', '3395'], ['73405.4', '187968'], ['73...</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.181934" elapsed="0.000856"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.182952" elapsed="0.000193"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.183281" elapsed="0.000474"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>u</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.183899" elapsed="0.000171"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>b</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.184196" elapsed="0.000150"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.184456" elapsed="0.000134"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:12.184708" elapsed="0.000612"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${data['t']}, int)</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.185445" elapsed="0.000586"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${data['t']} &gt; 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.186143" elapsed="0.000690"/>
</kw>
<doc>验证期货U本位深度数据接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:11.833572" elapsed="0.353461"/>
</test>
<test id="s1-s2-s2-s1-t2" name="获取期货U本位深度数据_ETH" line="27">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.191408" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:12.190171" elapsed="0.001434"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.192512" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.191819" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.191774" elapsed="0.000843"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:12.192663" elapsed="0.000053"/>
</return>
<msg time="2026-05-28T18:04:12.192931" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.189281" elapsed="0.003677"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.370670" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100 
 path_url=/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:12.371068" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'beaaa59fbe335d2e4148ed18433f3f80', 'X-Transparent': '00-beaaa59fbe335d2e4148ed18433f3f80-093971ef00a5a52e-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f108f8eb453-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779962652298,"s":"eth_usdt","u":1423125091545,"b":[],"a":[]},"ts":1779962652298} 
 </msg>
<msg time="2026-05-28T18:04:12.371245" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:12.371779" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:12.193666" elapsed="0.178184"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:12.372111" elapsed="0.000137"/>
</return>
<msg time="2026-05-28T18:04:12.372626" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/depth</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=eth_usdt&amp;level=100</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:12.193175" elapsed="0.179516"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.375370" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:12.374178" elapsed="0.001328"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.376855" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.375777" elapsed="0.001130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.377450" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.377173" elapsed="0.000364"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:12.373309" elapsed="0.004361"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.378895" level="INFO">Length is 5.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:12.377908" elapsed="0.001077"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.380094" level="INFO">${data} = {'t': 1779962652298, 's': 'eth_usdt', 'u': 1423125091545, 'b': [], 'a': []}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.379210" elapsed="0.000928"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.380319" elapsed="0.000209"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.380706" elapsed="0.000201"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>u</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.381063" elapsed="0.000185"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>b</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.381411" elapsed="0.000200"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.381778" elapsed="0.000189"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:12.382141" elapsed="0.004177"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${data['t']}, int)</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.386513" elapsed="0.000691"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${data['t']} &gt; 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.387340" elapsed="0.000638"/>
</kw>
<doc>验证期货U本位深度数据接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:12.187375" elapsed="0.200800"/>
</test>
<test id="s1-s2-s2-s1-t3" name="获取期货U本位深度数据_SOL" line="47">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.392058" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:12.391251" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.392860" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.392261" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.392228" elapsed="0.000757"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:12.393048" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T18:04:12.393304" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.390353" elapsed="0.002978"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.527935" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100 
 path_url=/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:12.528493" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '8b551a8e6ef265929a02b2da957d9d37', 'X-Transparent': '00-8b551a8e6ef265929a02b2da957d9d37-0aadad74d5c91171-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.010', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f11c847b453-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779962652498,"s":"sol_usdt","u":1423125089951,"b":[],"a":[["280.00","100"],["300.00","100"]]},"ts":1779962652498} 
 </msg>
<msg time="2026-05-28T18:04:12.528678" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:12.529065" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:12.393932" elapsed="0.135198"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:12.529374" elapsed="0.000122"/>
</return>
<msg time="2026-05-28T18:04:12.529887" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/depth</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=sol_usdt&amp;level=100</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:12.393506" elapsed="0.136436"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.532625" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:12.531436" elapsed="0.001321"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.534015" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.533014" elapsed="0.001058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.534509" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.534282" elapsed="0.000301"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:12.530565" elapsed="0.004106"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.535629" level="INFO">Length is 5.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:12.534851" elapsed="0.000848"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.536603" level="INFO">${data} = {'t': 1779962652498, 's': 'sol_usdt', 'u': 1423125089951, 'b': [], 'a': [['280.00', '100'], ['300.00', '100']]}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.535869" elapsed="0.000776"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.536820" elapsed="0.000203"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.537194" elapsed="0.000195"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>u</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.537560" elapsed="0.000187"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>b</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.537924" elapsed="0.000196"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.538291" elapsed="0.000198"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:12.538649" elapsed="0.000690"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${data['t']}, int)</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.539486" elapsed="0.000690"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${data['t']} &gt; 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.540306" elapsed="0.000620"/>
</kw>
<doc>验证期货U本位深度数据接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:12.388521" elapsed="0.152634"/>
</test>
<test id="s1-s2-s2-s1-t4" name="获取期货U本位深度数据_不同深度级别" line="67">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.546101" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:12.545004" elapsed="0.001135"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.546959" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.546352" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.546313" elapsed="0.000752"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:12.547112" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T18:04:12.547330" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.544092" elapsed="0.003263"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.674836" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000 
 path_url=/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:12.675300" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '605999510cca33ffb9e9c4873f6ee873', 'X-Transparent': '00-605999510cca33ffb9e9c4873f6ee873-91954d261c59c0fd-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f12c8dcb453-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779962652654,"s":"btc_usdt","u":1423260960256,"b":[["73411.3","33128"],["73411.2","29396"],["73411","6080"],["73410.7","40556"],["73410.6","5135"],["73410.5","180294"],["73410.4","152091"],["73409.9","141080"],["73409.8","20658"],["73409.3","2783"],["73408.7","21508"],["73408.5","24913"],["73408.2","13348"],["73406.1","25788"],["73405.9","13480"],["73405.7","17549"],["73405.4","19708"],["73405.3","27956"],["73405.2","27084"],["73403.1","12867"],["73401.9","48895"],["73401.7","11898"],["73401.4","30593"],["73401.2","3584"],["73400.2","4756"],["73399.7","2843"],["73399.2","26864"],["73398.7","2494"],["73398.1","15606"],["73397.1","4019"],["73395.2","9374"],["73394.7","4901"],["73392.6","15059"],["73391.5","8638"],["73391.1","25051"],["73389.3","28354"],["73388.7","39884"],["73388.2","5292"],["73387.7","5330"],["73387.2","17521"],["73386.8","3003"],["73386.6","5207"],["73384.4","2756"],["73384.2","21522"],["73381","16723"],["73379.6","25008"],["73377.9","32301"],["73377.7","47896"],["73376.3","3485"],["73372.9","957"],["73371.2","20445"],["73370.5","1550"],["73368.6","3434"],["73367.9","24079"],["73367.6","6130"],["73366.6","27440"],["73365.7","26228"],["73365.6","3614"],["73364.4","25761"],["73364","37004"],["73362.7","22484"],["73361.2","4958"],["73359.5","2109"],["73359.2","11677"],["73358.8","16553"],["73354.5","24226"],["73354.2","5143"],["73353.9","41685"],["73353.8","17587"],["73353.3","3772"],["73352.3","3081"],["73347.9","5897"],["73346.5","1928"],["73344.4","27425"],["73344.3","3590"],["73343.7","57136"],["73343.3","2965"],["73343.2","49472"],["73339.5","17964"],["73339","20596"],["73335.5","4033"],["73332.3","2831"],["73329.8","3877"],["73326.7","18012"],["73323.9","3254"],["73320.7","4488"],["73320.3","10690"],["73318.5","2012"],["73317.8","7578"],["73313.6","3239"],["73312.9","6853"],["73306.6","3649"],["73305.7","30099"],["73302.7","6147"],["73300.9","22971"],["73299.5","15939"],["73299","3695"],["73298.9","21113"],["73286.5","5300"],["73285.3","29464"],["73278.7","30117"],["73266.8","3295"],["73266.2","7017"],["73262.2","25764"],["73260.5","2925"],["73259.2","3310"],["73259","4535"],["73258.7","38466"],["73257.8","3173"],["73257.5","3626"],["73256.4","10230"],["73255.8","3912"],["73255.7","37544"],["73255.1","5485"],["73251.9","5622"],["73244.8","26876"],["73243.7","3609"],["73242.1","4421"],["73240.5","42696"],["73239.8","727"],["73237","5027"],["73235.7","969"],["73235.6","4087"],["73234.3","21073"],["73227.4","7585"],["73226.6","17042"],["73224.5","8500"],["73223.8","3858"],["73222.3","30970"],["73221.8","3056"],["73215.1","2496"],["73212.8","2357"],["73212.1","23956"],["73204.7","1554"],["73201","4042"],["73200.1","1142"],["73199.1","33606"],["73196.4","23658"],["73195.2","4975"],["73190","5280"],["73187.2","51871"],["73183.2","23175"],["73174.8","47538"],["73174.6","4048"],["73174.1","3903"],["73172","2965"],["73162.5","4780"],["73159.1","27903"],["73156.9","23844"],["73156","4141"],["73155.7","5094"],["73154.6","4365"],["73154.5","4503"],["73151.4","23857"],["73150.9","2281"],["73146.5","5188"],["73144.6","14687"],["73143.5","44632"],["73132.3","4860"],["73130.6","3422"],["73130.1","20956"],["73124.5","3353"],["73122.7","17863"],["73120.2","3590"],["73114.2","2241"],["73108.2","6934"],["73106.4","13294"],["73104.4","21246"],["73101.9","10221"],["73099","2275"],["73096.7","4547"],["73092.6","53381"],["73091.6","4051"],["73090.6","2665"],["73073.7","7884"],["73072.7","1475"],["73071.4","23756"],["73070.8","2291"],["73068","4653"],["73054.1","3339"],["73052.3","7118"],["73051.4","35068"],["73043.6","24872"],["73041.7","40734"],["73038.3","14485"],["73037.2","10886"],["73031.5","5471"],["73031.2","19546"],["73030.7","4622"],["73020.2","27900"],["73018.3","3159"],["73015.8","52921"],["73015.2","4968"],["73002.3","26415"],["72983.4","5137"],["72982.9","36576"],["72975.8","15425"],["72974.9","2166"],["72961.9","4134"],["72952.8","3758"],["72950.3","22955"],["72948.6","4495"],["72946.1","19790"],["72941","2567"],["72925.3","2733"],["72913.7","3752"],["72912","2360"],["72907.9","2077"],["72903.6","19685"],["72902.1","29322"],["72899.9","3807"],["72898","38139"],["72897.8","4855"],["72897.3","12508"],["72885.8","25698"],["72882.9","2511"],["72881.6","2357"],["72879.3","26554"],["72877.1","12027"],["72873.6","3007"],["72864.9","5011"],["72864.2","2501"],["72862.5","4892"],["72850.4","26629"],["72841.8","59113"],["72837.2","3220"],["72829.7","4454"],["72829","17296"],["72816.8","4314"],["72814.7","22576"],["72802.2","1894"],["72801.5","25173"],["72797.7","39994"],["72796.9","30675"],["72789.4","3474"],["72788.8","7713"],["72788","24746"],["72786.5","6094"],["72784.8","2649"],["72779.9","29960"],["72779.2","2009"],["72778.8","17522"],["72763.1","2258"],["72761.6","9577"],["72755.2","3804"],["72753.8","3322"],["72753.4","32163"],["72752.4","13682"],["72752.1","43723"],["72747.1","3230"],["72737.9","1174"],["72735.4","3502"],["72730.1","16194"],["72727.7","3756"],["72723.6","2"],["72715.6","3023"],["72708.7","19638"],["72707.7","3181"],["72706","2417"],["72701.1","7857"],["72698.2","23398"],["72697.1","12985"],["72695.6","2860"],["72692.8","4700"],["72688.6","30819"],["72686","5462"],["72684.9","17135"],["72684.2","45617"],["72679","15332"],["72678.3","4424"],["72664.9","15285"],["72660.7","17413"],["72657.6","6548"],["72657.2","20594"],["72656.8","5806"],["72655.1","19535"],["72651.6","4027"],["72640.7","32406"],["72639.3","23952"],["72636.5","4081"],["72622.1","2255"],["72613.1","23134"]],"a":[["73897.4","28056"],["73897.5","19688"],["73897.7","2329"],["73898","3194"],["73898.1","38675"],["73898.4","130660"],["73898.7","3997"],["73898.8","177804"],["73898.9","172372"],["73899.5","20165"],["73899.7","34138"],["73900.2","24461"],["73900.5","2297"],["73900.7","4448"],["73902.6","5291"],["73902.7","22435"],["73903.1","38632"],["73903.3","2963"],["73903.6","33559"],["73904.2","4639"],["73904.8","10526"],["73904.9","9629"],["73906.4","3595"],["73906.5","5404"],["73907.2","15946"],["73908.9","10514"],["73909.7","5858"],["73909.8","3424"],["73910.3","30768"],["73910.9","3624"],["73911.5","5243"],["73914","548"],["73915","22670"],["73915.1","13013"],["73915.3","6612"],["73917.4","3650"],["73917.8","23090"],["73918","1957"],["73918.5","12371"],["73920.8","3585"],["73921.2","2611"],["73922.4","23820"],["73924.3","12953"],["73925.7","4085"],["73925.9","4525"],["73926.4","11477"],["73928.7","2434"],["73928.8","17174"],["73931.7","2034"],["73934.5","8168"],["73934.6","4931"],["73935.3","2379"],["73935.6","34711"],["73936.1","3128"],["73936.3","1401"],["73937","28300"],["73937.8","29297"],["73939.3","5511"],["73941.1","30191"],["73943.6","24512"],["73943.7","3637"],["73944.8","46350"],["73949.1","2269"],["73950.5","6986"],["73952.5","46341"],["73953","6737"],["73955.5","21288"],["73957.2","19590"],["73958.9","24743"],["73961.3","8486"],["73962.1","14032"],["73963.3","3159"],["73964.2","7271"],["73964.4","8177"],["73972.7","9665"],["73973.4","4531"],["73976.4","4982"],["73978.1","54229"],["73978.6","20312"],["73979.6","13707"],["73980.5","6412"],["73983.2","9762"],["73983.6","2998"],["73985.5","4025"],["73986.5","2502"],["73986.8","18868"],["73987.7","11565"],["73991.2","5983"],["73997.4","4344"],["73997.8","4930"],["73998","5640"],["74000.3","25391"],["74002.8","4060"],["74006.7","1898"],["74011.2","45085"],["74014.1","6551"],["74021.2","4580"],["74021.3","16764"],["74025.1","23018"],["74025.8","5926"],["74029","11114"],["74030.6","36372"],["74032.8","4357"],["74034.2","47646"],["74035","3902"],["74035.3","5591"],["74039.9","12465"],["74042.2","2308"],["74045.2","14077"],["74047.9","3938"],["74048.2","18437"],["74050.5","29085"],["74050.7","3308"],["74052.8","1478"],["74056.2","3728"],["74056.7","19314"],["74058.2","3328"],["74061","16236"],["74061.2","4971"],["74062.6","2895"],["74063.6","5191"],["74067.1","3898"],["74068.1","5054"],["74074.2","3242"],["74075.9","165"],["74082.2","6690"],["74084","17821"],["74087.6","3792"],["74088.2","4456"],["74091.4","7929"],["74097.4","5036"],["74097.6","2671"],["74097.7","10325"],["74103.8","3189"],["74106.7","3500"],["74112.2","6525"],["74114.2","12134"],["74118.2","5265"],["74121","3941"],["74124.6","3944"],["74125.8","42061"],["74127.6","10744"],["74131.8","367"],["74133.9","519"],["74135.8","4691"],["74136.1","8262"],["74136.6","6454"],["74136.7","4591"],["74138.4","43149"],["74138.8","5606"],["74139.9","12871"],["74141.1","17514"],["74141.4","4497"],["74148.9","2866"],["74151.4","5878"],["74152.9","7810"],["74161.6","23107"],["74167.6","2566"],["74168.2","3655"],["74172.8","38386"],["74174.9","4745"],["74175","4174"],["74178.7","29076"],["74184.5","11318"],["74184.8","38976"],["74185.1","27930"],["74185.7","5115"],["74186.2","40111"],["74187.4","4933"],["74196.5","13490"],["74197.4","18471"],["74199","4258"],["74208.4","3045"],["74210.1","42596"],["74210.7","4006"],["74211.2","3378"],["74221","35688"],["74230.8","18312"],["74235.8","18889"],["74240.3","2789"],["74240.4","4092"],["74248.7","2462"],["74254.3","3387"],["74282.8","5474"],["74287.8","4429"],["74288","4114"],["74291.2","23273"],["74294","3206"],["74294.8","2965"],["74296.3","5971"],["74298","14143"],["74298.3","3304"],["74303.1","22481"],["74305.6","43313"],["74310.7","5408"],["74311.2","2900"],["74316.6","1995"],["74330","3880"],["74330.9","14519"],["74332.2","37288"],["74337","23019"],["74340.4","1621"],["74342.5","6158"],["74343.1","10078"],["74350.9","3180"],["74357.1","31650"],["74357.5","13220"],["74359.7","2935"],["74360.4","2404"],["74363.8","3363"],["74365.6","3610"],["74371.2","3999"],["74381.3","3451"],["74387.4","2873"],["74387.9","22005"],["74390.9","27599"],["74394.4","4936"],["74397.1","4078"],["74399.4","20372"],["74408.8","2708"],["74420","41452"],["74424.7","34467"],["74425.8","26221"],["74432.9","4740"],["74433.9","29475"],["74434.9","3302"],["74437.8","2564"],["74441.3","21008"],["74443.2","9563"],["74447.5","3764"],["74449.4","35129"],["744... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T18:04:12.675809" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:12.676178" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:12.547906" elapsed="0.128338"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:12.676477" elapsed="0.000140"/>
</return>
<msg time="2026-05-28T18:04:12.676999" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/depth</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=btc_usdt&amp;level=1000</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:12.547507" elapsed="0.129542"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.679746" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:12.678536" elapsed="0.001347"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.680935" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.680144" elapsed="0.000830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.681382" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.681167" elapsed="0.000280"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:12.677666" elapsed="0.003873"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.682801" level="INFO">Length is 5.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:12.681715" elapsed="0.001199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.684613" level="INFO">${data} = {'t': 1779962652654, 's': 'btc_usdt', 'u': 1423260960256, 'b': [['73411.3', '33128'], ['73411.2', '29396'], ['73411', '6080'], ['73410.7', '40556'], ['73410.6', '5135'], ['73410.5', '180294'], ['73410...</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:12.683084" elapsed="0.001567"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.684809" elapsed="0.000186"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.685128" elapsed="0.000159"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>u</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.685429" elapsed="0.000157"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>b</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.685724" elapsed="0.000152"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:12.686005" elapsed="0.000150"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:12.686301" elapsed="0.000728"/>
</kw>
<doc>验证期货U本位深度数据接口不同深度级别功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:12.541526" elapsed="0.145740"/>
</test>
<test id="s1-s2-s2-s1-t5" name="获取期货U本位深度数据_无效交易对" line="84">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.692016" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:12.691167" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.692883" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.692240" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.692197" elapsed="0.000790"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:12.693033" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T18:04:12.693239" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.690237" elapsed="0.003027"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.819903" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100 
 path_url=/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:12.820319" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9995', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '7fadf8e3123f5245b076e2e7a307df76', 'X-Transparent': '00-7fadf8e3123f5245b076e2e7a307df76-e0ed07251f92841d-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.016', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f13a961b453-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779962652802} 
 </msg>
<msg time="2026-05-28T18:04:12.820470" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:12.820768" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:12.693805" elapsed="0.127017"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:12.821016" elapsed="0.000109"/>
</return>
<msg time="2026-05-28T18:04:12.821440" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/depth</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=invalid_pair&amp;level=100</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:12.693410" elapsed="0.128072"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${response.status_code} &gt;= 400 or ${response.json()['code']} != 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.821868" elapsed="0.002855"/>
</kw>
<doc>验证期货U本位深度数据接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:12.687646" elapsed="0.137431"/>
</test>
<test id="s1-s2-s2-s1-t6" name="获取期货U本位深度数据_缺少参数" line="92">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.831161" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:12.830188" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.832134" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.831425" elapsed="0.000785"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.831382" elapsed="0.000871"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:12.832301" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T18:04:12.832551" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.829061" elapsed="0.003525"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.953726" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?level=100 
 path_url=/v1/future-u/market/public/q/depth?level=100 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:12.953996" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/depth?level=100 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9994', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'b87aeb2674af130fd8c9b375a4184015', 'X-Transparent': '00-b87aeb2674af130fd8c9b375a4184015-67e27239bfdcfe97-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.010', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f1489d4b453-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779962652937} 
 </msg>
<msg time="2026-05-28T18:04:12.954273" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:12.954643" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:12.833328" elapsed="0.121379"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:12.954930" elapsed="0.000124"/>
</return>
<msg time="2026-05-28T18:04:12.955362" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/depth</arg>
<arg>headers=${headers}</arg>
<arg>params=level=100</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:12.832805" elapsed="0.122589"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${response.status_code} &gt;= 400 or ${response.json()['code']} != 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:12.955697" elapsed="0.002653"/>
</kw>
<doc>验证期货U本位深度数据接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:12.825524" elapsed="0.133099"/>
</test>
<doc>期货U本位深度数据接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:11.821894" elapsed="1.137250"/>
</suite>
<suite id="s1-s2-s2-s2" name="Future U Funding Rate" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_funding_rate.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.968776" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:12.968518" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.969369" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.969208" elapsed="0.000219"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:12.968934" elapsed="0.000534"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.969621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.969503" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.968903" elapsed="0.000806"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.970576" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.970429" elapsed="0.000200"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.970914" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.971063" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.971201" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.971340" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.971478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.970714" elapsed="0.000826"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.971750" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.971887" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.972028" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.972173" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.972318" elapsed="0.000025"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.972457" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.972583" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.972705" elapsed="0.000060"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.973094" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.971571" elapsed="0.001579"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.973538" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.973275" elapsed="0.000307"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.973923" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.973696" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.974287" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.974072" elapsed="0.000254"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.974667" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.974433" elapsed="0.000289"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.975052" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.974831" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.975425" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.975201" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.975823" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.975573" elapsed="0.000292"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.976221" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.975973" elapsed="0.000293"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.976584" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:12.976374" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:12.973176" elapsed="0.003473"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.970690" elapsed="0.005980"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.976908" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.976762" elapsed="0.000188"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:12.977396" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:12.977059" elapsed="0.000594"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.970103" elapsed="0.007620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.977901" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:12.977822" elapsed="0.000115"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.968168" elapsed="0.009816"/>
</kw>
<test id="s1-s2-s2-s2-t1" name="获取期货U本位资金费率_BTC" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:12.981374" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:12.980480" elapsed="0.000946"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:12.982294" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:12.981598" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:12.981569" elapsed="0.000826"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:12.982435" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T18:04:12.982673" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:12.979674" elapsed="0.003028"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:13.298301" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt 
 path_url=/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:13.298864" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '0841d153ac4b2f56241528f45ed59990', 'X-Transparent': '00-0841d153ac4b2f56241528f45ed59990-def1bd543602acea-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f16bb2e03b3-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"btc_usdt","fundingRate":0.001506,"nextCollectionTime":1779966000000,"collectionInternal":1},"ts":1779962653283} 
 </msg>
<msg time="2026-05-28T18:04:13.299062" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:13.299455" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:12.983341" elapsed="0.316189"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:13.299788" elapsed="0.000118"/>
</return>
<msg time="2026-05-28T18:04:13.300328" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/funding-rate</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=btc_usdt</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:12.982883" elapsed="0.317507"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.303225" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:13.301941" elapsed="0.001432"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.304742" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:13.303667" elapsed="0.001136"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.305359" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.305060" elapsed="0.000388"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:13.301042" elapsed="0.004525"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.306874" level="INFO">Length is 4.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:13.305814" elapsed="0.001135"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.307922" level="INFO">${data} = {'symbol': 'btc_usdt', 'fundingRate': 0.001506, 'nextCollectionTime': 1779966000000, 'collectionInternal': 1}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:13.307127" elapsed="0.000836"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>symbol</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.308148" elapsed="0.000228"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>fundingRate</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.308557" elapsed="0.000196"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>nextCollectionTime</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.308918" elapsed="0.000199"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>collectionInternal</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.309288" elapsed="0.000196"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['symbol']}</arg>
<arg>btc_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:13.309678" elapsed="0.000862"/>
</kw>
<doc>验证期货U本位资金费率接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:12.978059" elapsed="0.332771"/>
</test>
<test id="s1-s2-s2-s2-t2" name="获取期货U本位资金费率_ETH" line="21">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.315901" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:13.314998" elapsed="0.000941"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.316769" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.316119" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:13.316081" elapsed="0.000846"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:13.316973" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T18:04:13.317212" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.313456" elapsed="0.003787"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:13.571768" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt 
 path_url=/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:13.572134" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '7b262943ec79cdfb32799180ca168161', 'X-Transparent': '00-7b262943ec79cdfb32799180ca168161-f8d732b8a53fa8cf-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f179cb203b3-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"eth_usdt","fundingRate":0.000160000000000000,"nextCollectionTime":1779984000000,"collectionInternal":8},"ts":1779962653489} 
 </msg>
<msg time="2026-05-28T18:04:13.572348" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:13.572696" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:13.317872" elapsed="0.254880"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:13.572963" elapsed="0.000117"/>
</return>
<msg time="2026-05-28T18:04:13.573418" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/funding-rate</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=eth_usdt</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:13.317423" elapsed="0.256037"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.575808" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:13.574845" elapsed="0.001080"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.576994" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:13.576159" elapsed="0.000877"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.577478" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.577240" elapsed="0.000307"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:13.574042" elapsed="0.003602"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.578542" level="INFO">Length is 4.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:13.577822" elapsed="0.000781"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.579474" level="INFO">${data} = {'symbol': 'eth_usdt', 'fundingRate': 0.00016, 'nextCollectionTime': 1779984000000, 'collectionInternal': 8}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:13.578792" elapsed="0.000714"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>symbol</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.579660" elapsed="0.000177"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>fundingRate</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.579972" elapsed="0.000167"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>nextCollectionTime</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.580272" elapsed="0.000158"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>collectionInternal</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.580558" elapsed="0.000157"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['symbol']}</arg>
<arg>eth_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:13.580856" elapsed="0.000668"/>
</kw>
<doc>验证期货U本位资金费率接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:13.311245" elapsed="0.270505"/>
</test>
<test id="s1-s2-s2-s2-t3" name="获取期货U本位资金费率_SOL" line="35">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.586624" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:13.585662" elapsed="0.001064"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.587553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.586916" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:13.586880" elapsed="0.000772"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:13.587703" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T18:04:13.587931" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.584588" elapsed="0.003372"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:13.703208" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt 
 path_url=/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:13.703570" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '6750e64ec5312dabf7ddc092e445d67a', 'X-Transparent': '00-6750e64ec5312dabf7ddc092e445d67a-088a6308d2644b67-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.010', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f19486203b3-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"sol_usdt","fundingRate":0.002625,"nextCollectionTime":1779984000000,"collectionInternal":8},"ts":1779962653688} 
 </msg>
<msg time="2026-05-28T18:04:13.703753" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:13.704153" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:13.588593" elapsed="0.115626"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:13.704456" elapsed="0.000133"/>
</return>
<msg time="2026-05-28T18:04:13.704957" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/funding-rate</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=sol_usdt</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:13.588142" elapsed="0.116867"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.708337" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:13.706398" elapsed="0.002077"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.709805" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:13.708751" elapsed="0.001109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.710389" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.710104" elapsed="0.000375"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:13.705588" elapsed="0.005012"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.711811" level="INFO">Length is 4.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:13.710849" elapsed="0.001030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.712819" level="INFO">${data} = {'symbol': 'sol_usdt', 'fundingRate': 0.002625, 'nextCollectionTime': 1779984000000, 'collectionInternal': 8}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:13.712049" elapsed="0.000809"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>symbol</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.713041" elapsed="0.000213"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>fundingRate</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.713420" elapsed="0.000197"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>nextCollectionTime</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.713784" elapsed="0.000268"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>collectionInternal</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:13.714212" elapsed="0.000189"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['symbol']}</arg>
<arg>sol_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:13.714573" elapsed="0.000788"/>
</kw>
<doc>验证期货U本位资金费率接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:13.582395" elapsed="0.133217"/>
</test>
<test id="s1-s2-s2-s2-t4" name="获取期货U本位资金费率_无效交易对" line="49">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.720770" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:13.719881" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.721635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.721001" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:13.720971" elapsed="0.000766"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:13.721784" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T18:04:13.722012" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.718825" elapsed="0.003214"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:13.844293" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol 
 path_url=/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:13.844620" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '6286ec63a62faf6376bba53642b38750', 'X-Transparent': '00-6286ec63a62faf6376bba53642b38750-5ba99774bacf4dee-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.013', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f1a1a3a03b3-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779962653830} 
 </msg>
<msg time="2026-05-28T18:04:13.844784" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:13.845091" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:13.722680" elapsed="0.122469"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:13.845331" elapsed="0.000088"/>
</return>
<msg time="2026-05-28T18:04:13.845739" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/funding-rate</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=invalid_symbol</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:13.722235" elapsed="0.123558"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${response.status_code} &gt;= 400 or ${response.json()['code']} != 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:13.846197" elapsed="0.002991"/>
</kw>
<doc>验证期货U本位资金费率接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:13.715996" elapsed="0.133547"/>
</test>
<test id="s1-s2-s2-s2-t5" name="获取期货U本位资金费率_缺少参数" line="56">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.855937" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:13.854954" elapsed="0.001025"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.856943" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.856229" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:13.856193" elapsed="0.000864"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:13.857110" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T18:04:13.857387" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.853629" elapsed="0.003793"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:13.971826" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate 
 path_url=/v1/future-u/market/public/q/funding-rate 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:13.972236" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9995', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '0166d7ad9377184600946ac1a055344a', 'X-Transparent': '00-0166d7ad9377184600946ac1a055344a-3180f7bc89b8c637-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f1afc1603b3-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779962653958} 
 </msg>
<msg time="2026-05-28T18:04:13.972480" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:13.972869" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:13.858555" elapsed="0.114380"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:13.973169" elapsed="0.000130"/>
</return>
<msg time="2026-05-28T18:04:13.973681" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/funding-rate</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:13.857632" elapsed="0.116103"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${response.status_code} &gt;= 400 or ${response.json()['code']} != 0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:13.974154" elapsed="0.002221"/>
</kw>
<doc>验证期货U本位资金费率接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:13.850065" elapsed="0.126624"/>
</test>
<doc>期货U本位资金费率接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:12.961524" elapsed="1.015978"/>
</suite>
<suite id="s1-s2-s2-s3" name="Future U Index Price" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_index_price.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.987652" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:13.987376" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.988286" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.988110" elapsed="0.000234"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:13.987821" elapsed="0.000566"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.988543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.988420" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:13.987786" elapsed="0.000844"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.989568" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.989417" elapsed="0.000208"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.989922" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.990072" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.990227" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.990352" elapsed="0.000075"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.990536" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.989711" elapsed="0.000878"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.990783" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.990907" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991030" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991154" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991274" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991393" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991514" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991629" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:13.991747" elapsed="0.000272"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:13.990618" elapsed="0.001438"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.992466" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.992180" elapsed="0.000334"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.992883" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.992637" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.993255" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.993033" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.993629" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.993401" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.994008" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.993779" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.994387" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.994156" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.994762" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.994533" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.995105" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.994891" elapsed="0.000247"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.995448" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:13.995238" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:13.992082" elapsed="0.003433"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:13.989689" elapsed="0.005848"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.995777" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.995628" elapsed="0.000191"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:13.996266" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:13.995917" elapsed="0.000594"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.989077" elapsed="0.007506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:13.996767" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:13.996686" elapsed="0.000119"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.987005" elapsed="0.009848"/>
</kw>
<test id="s1-s2-s2-s3-t1" name="获取期货U本位所有指数价格" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.000273" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:13.999495" elapsed="0.000861"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:14.001112" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:14.000505" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:14.000483" elapsed="0.000726"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:14.001246" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T18:04:14.001474" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:13.998515" elapsed="0.002991"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:14.362175" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/index-price 
 path_url=/v1/future-u/market/public/q/index-price 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:14.362584" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/index-price 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'dab55822cf14a7a839ab11f4d95fb8da', 'X-Transparent': '00-dab55822cf14a7a839ab11f4d95fb8da-f4ca2fa4efb1e025-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.010', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f1d4b680f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"s":"trb_usdt","p":"15.164","t":1776061641025},{"s":"xrp_usdt","p":"1.8284","t":1744189287376},{"s":"eth_usdt","p":"1995.96","t":1779962653598},{"s":"sol_usdt","p":"81.3","t":1779962653600},{"s":"bnb_usdt","p":"599.36","t":1776061637754},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"73537.55","t":1779962653595},{"s":"1000shib_usdt","p":"0.0058","t":1776061707972},{"s":"ada_usdt","p":"0.2394","t":1776061663345},{"s":"arb_usdt","p":"0.11","t":1776061665430},{"s":"doge_usdt","p":"0.09872","t":1779962653603},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"73449.3561","t":1779962653593},{"s":"xaut_usdt","p":"4543.7984","t":1779095550280}],"ts":1779962654346} 
 </msg>
<msg time="2026-05-28T18:04:14.362773" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:14.363157" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:14.002469" elapsed="0.360757"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:14.363486" elapsed="0.000144"/>
</return>
<msg time="2026-05-28T18:04:14.364046" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/index-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:14.001681" elapsed="0.362417"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.366785" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:14.365550" elapsed="0.001380"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.368295" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:14.367201" elapsed="0.001153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.368911" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:14.368617" elapsed="0.000385"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:14.364700" elapsed="0.004427"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.371377" level="INFO">Length is 15.</msg>
<arg>${response_data['data']}</arg>
<arg>指数价格数据不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.370577" elapsed="0.000871"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($response_data['data'], list)</arg>
<arg>指数价格数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.371633" elapsed="0.000469"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-05-28T18:04:14.369483" elapsed="0.002710"/>
</kw>
<kw name="验证指数价格列表格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($index_price_list, list)</arg>
<arg>指数价格列表应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.373555" elapsed="0.000699"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.374570" level="INFO">Length is 15.</msg>
<arg>${index_price_list}</arg>
<arg>指数价格列表不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.374397" elapsed="0.000224"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.375533" elapsed="0.000197"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.375864" elapsed="0.000176"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.376173" elapsed="0.000181"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.377443" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.377281" elapsed="0.000213"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.377653" elapsed="0.000188"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.377984" elapsed="0.000454"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.376531" elapsed="0.001974"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.379445" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.379296" elapsed="0.000200"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.379603" elapsed="0.000147"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.379860" elapsed="0.000327"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.378653" elapsed="0.001598"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.381040" elapsed="0.000251"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.381410" elapsed="0.000182"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.381939" level="INFO">${timestamp_str} = 1776061641025</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.381718" elapsed="0.000246"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.382207" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.382280" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.382093" elapsed="0.000211"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.382412" elapsed="0.000249"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.380408" elapsed="0.002315"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.375181" elapsed="0.007593"/>
</kw>
<var name="${index_price}">{'s': 'trb_usdt', 'p': '15.164', 't': 1776061641025}</var>
<status status="PASS" start="2026-05-28T18:04:14.374990" elapsed="0.007814"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.383258" elapsed="0.000140"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.383499" elapsed="0.000131"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.383725" elapsed="0.000149"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.384880" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.384598" elapsed="0.000323"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.385018" elapsed="0.000125"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.385236" elapsed="0.000139"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.384009" elapsed="0.001422"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.386181" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.386067" elapsed="0.000152"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.386308" elapsed="0.000140"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.386593" elapsed="0.000147"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.385539" elapsed="0.001257"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.387765" elapsed="0.000300"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.388194" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.388742" level="INFO">${timestamp_str} = 1744189287376</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.388529" elapsed="0.000242"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.389022" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.389100" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.388896" elapsed="0.000231"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.389244" elapsed="0.000259"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.386912" elapsed="0.002662"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.383019" elapsed="0.006609"/>
</kw>
<var name="${index_price}">{'s': 'xrp_usdt', 'p': '1.8284', 't': 1744189287376}</var>
<status status="PASS" start="2026-05-28T18:04:14.382906" elapsed="0.006757"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.390241" elapsed="0.000172"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.390533" elapsed="0.000174"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.390826" elapsed="0.000171"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.391863" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.391725" elapsed="0.000180"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.392004" elapsed="0.000143"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.392256" elapsed="0.000146"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.391150" elapsed="0.001308"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.393244" level="INFO">Length is 7.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.393117" elapsed="0.000166"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.393376" elapsed="0.000137"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.393611" elapsed="0.000149"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.392568" elapsed="0.001251"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.394476" elapsed="0.000192"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.394768" elapsed="0.000159"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.395198" level="INFO">${timestamp_str} = 1779962653598</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.395039" elapsed="0.000182"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.395422" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.395488" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.395322" elapsed="0.000186"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.395605" elapsed="0.000202"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.393941" elapsed="0.001925"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.389933" elapsed="0.005976"/>
</kw>
<var name="${index_price}">{'s': 'eth_usdt', 'p': '1995.96', 't': 1779962653598}</var>
<status status="PASS" start="2026-05-28T18:04:14.389778" elapsed="0.006155"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.396508" elapsed="0.000140"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.396747" elapsed="0.000140"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.397032" elapsed="0.000143"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.397956" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.397830" elapsed="0.000166"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.398088" elapsed="0.000129"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.398316" elapsed="0.000141"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.397294" elapsed="0.001218"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.399280" level="INFO">Length is 4.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.399154" elapsed="0.000166"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.399413" elapsed="0.000131"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.399645" elapsed="0.000149"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.398619" elapsed="0.001233"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.400459" elapsed="0.000161"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.400704" elapsed="0.000135"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.401057" level="INFO">${timestamp_str} = 1779962653600</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.400926" elapsed="0.000151"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.401247" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.401301" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.401161" elapsed="0.000158"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.401399" elapsed="0.000185"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.399968" elapsed="0.001663"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.396122" elapsed="0.005545"/>
</kw>
<var name="${index_price}">{'s': 'sol_usdt', 'p': '81.3', 't': 1779962653600}</var>
<status status="PASS" start="2026-05-28T18:04:14.396013" elapsed="0.005674"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.402053" elapsed="0.000119"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.402258" elapsed="0.000120"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.402463" elapsed="0.000120"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.403261" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.403152" elapsed="0.000145"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.403377" elapsed="0.000114"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.403575" elapsed="0.000117"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.402685" elapsed="0.001054"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.404392" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.404286" elapsed="0.000140"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.404507" elapsed="0.000118"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.404707" elapsed="0.001333"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.403831" elapsed="0.002259"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.406653" elapsed="0.000167"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.406904" elapsed="0.000141"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.407265" level="INFO">${timestamp_str} = 1776061637754</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.407131" elapsed="0.000176"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.407478" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.407533" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.407390" elapsed="0.000162"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.407632" elapsed="0.000169"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.406195" elapsed="0.001652"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.401846" elapsed="0.006036"/>
</kw>
<var name="${index_price}">{'s': 'bnb_usdt', 'p': '599.36', 't': 1776061637754}</var>
<status status="PASS" start="2026-05-28T18:04:14.401753" elapsed="0.006149"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.408272" elapsed="0.000124"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.408481" elapsed="0.000121"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.408685" elapsed="0.000121"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.409398" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.409302" elapsed="0.000126"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.409499" elapsed="0.000101"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.409675" elapsed="0.000108"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.408906" elapsed="0.000919"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.410401" level="INFO">Length is 5.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.410305" elapsed="0.000127"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.410505" elapsed="0.000100"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.410680" elapsed="0.000113"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.409906" elapsed="0.000929"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.411332" elapsed="0.000143"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.411549" elapsed="0.000117"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.411859" level="INFO">${timestamp_str} = 1776061643383</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.411742" elapsed="0.000135"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.412028" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.412076" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.411952" elapsed="0.000140"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.412162" elapsed="0.000151"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.410924" elapsed="0.001434"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.408062" elapsed="0.004327"/>
</kw>
<var name="${index_price}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-05-28T18:04:14.407967" elapsed="0.004440"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.412737" elapsed="0.000105"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.412917" elapsed="0.000108"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.413107" elapsed="0.000105"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.413822" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.413735" elapsed="0.000118"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.413918" elapsed="0.000092"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.414075" elapsed="0.000101"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.413298" elapsed="0.000916"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.414753" level="INFO">Length is 8.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.414669" elapsed="0.000112"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.414845" elapsed="0.000091"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.415013" elapsed="0.000099"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.414308" elapsed="0.000842"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.415592" elapsed="0.000126"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.415786" elapsed="0.000107"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.416066" level="INFO">${timestamp_str} = 1779962653595</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.415960" elapsed="0.000122"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.416216" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.416263" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.416149" elapsed="0.000129"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.416341" elapsed="0.000137"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.415231" elapsed="0.001285"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.412548" elapsed="0.003998"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '73537.55', 't': 1779962653595}</var>
<status status="PASS" start="2026-05-28T18:04:14.412466" elapsed="0.004096"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.416856" elapsed="0.000096"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.417021" elapsed="0.000095"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.417184" elapsed="0.000095"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.417805" level="INFO">Length is 13.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.417720" elapsed="0.000112"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.417897" elapsed="0.000088"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.418053" elapsed="0.000095"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.417360" elapsed="0.000826"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.418703" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.418616" elapsed="0.000114"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.418794" elapsed="0.000090"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.418957" elapsed="0.000102"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.418259" elapsed="0.000838"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.419541" elapsed="0.000126"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.419734" elapsed="0.000107"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.420014" level="INFO">${timestamp_str} = 1776061707972</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.419908" elapsed="0.000122"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.420168" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.420301" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.420098" elapsed="0.000218"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.420382" elapsed="0.000139"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.419180" elapsed="0.001379"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.416688" elapsed="0.003901"/>
</kw>
<var name="${index_price}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-05-28T18:04:14.416615" elapsed="0.003990"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.420915" elapsed="0.000097"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.421084" elapsed="0.000097"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.421249" elapsed="0.000097"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.421878" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.421791" elapsed="0.000115"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.421980" elapsed="0.000092"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.422134" elapsed="0.000088"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.421425" elapsed="0.000832"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.422729" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.422652" elapsed="0.000103"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.422814" elapsed="0.000082"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.422959" elapsed="0.000096"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.422325" elapsed="0.000765"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.423493" elapsed="0.000115"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.423669" elapsed="0.000097"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.423923" level="INFO">${timestamp_str} = 1776061663345</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.423828" elapsed="0.000110"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.424062" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.424102" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.423998" elapsed="0.000117"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.424172" elapsed="0.000124"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.423163" elapsed="0.001167"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.420732" elapsed="0.003624"/>
</kw>
<var name="${index_price}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-05-28T18:04:14.420656" elapsed="0.003714"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.424636" elapsed="0.000087"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.424784" elapsed="0.000088"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.424932" elapsed="0.000090"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.425509" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.425427" elapsed="0.000107"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.425592" elapsed="0.000081"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.425733" elapsed="0.000085"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.425095" elapsed="0.000757"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.426385" level="INFO">Length is 4.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.426312" elapsed="0.000096"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.426462" elapsed="0.000076"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.426595" elapsed="0.000083"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.425919" elapsed="0.000791"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.427094" elapsed="0.000107"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.427271" elapsed="0.000092"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.427512" level="INFO">${timestamp_str} = 1776061665430</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.427423" elapsed="0.000103"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.427644" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.427682" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.427583" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.427753" elapsed="0.000116"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.426777" elapsed="0.001123"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.424484" elapsed="0.003441"/>
</kw>
<var name="${index_price}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-05-28T18:04:14.424417" elapsed="0.003521"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.428182" elapsed="0.000083"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.428323" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.428462" elapsed="0.000082"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.428985" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.428914" elapsed="0.000094"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.429063" elapsed="0.000076"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.429195" elapsed="0.000083"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.428613" elapsed="0.000698"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.429747" level="INFO">Length is 7.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.429674" elapsed="0.000096"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.429823" elapsed="0.000077"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.429956" elapsed="0.000082"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.429373" elapsed="0.000697"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.430440" elapsed="0.000107"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.430603" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.430826" level="INFO">${timestamp_str} = 1779962653603</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.430743" elapsed="0.000096"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.430944" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.430983" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.430890" elapsed="0.000104"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.431044" elapsed="0.000107"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.430136" elapsed="0.001045"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.428042" elapsed="0.003161"/>
</kw>
<var name="${index_price}">{'s': 'doge_usdt', 'p': '0.09872', 't': 1779962653603}</var>
<status status="PASS" start="2026-05-28T18:04:14.427980" elapsed="0.003236"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.431446" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.431575" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.431703" elapsed="0.000137"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.432262" level="INFO">Length is 11.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.432194" elapsed="0.000089"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.432333" elapsed="0.000070"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.432468" elapsed="0.000075"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.431905" elapsed="0.000668"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.432984" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.432916" elapsed="0.000090"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.433056" elapsed="0.000071"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.433181" elapsed="0.000078"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.432630" elapsed="0.000659"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.433641" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.433795" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.434017" level="INFO">${timestamp_str} = 1747980978061</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.433934" elapsed="0.000096"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.434136" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.434172" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.434083" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.434235" elapsed="0.000107"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.433352" elapsed="0.001019"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.431314" elapsed="0.003080"/>
</kw>
<var name="${index_price}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-05-28T18:04:14.431256" elapsed="0.003152"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.434641" elapsed="0.000077"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.434772" elapsed="0.000077"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.434902" elapsed="0.000079"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.435380" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.435316" elapsed="0.000085"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.435450" elapsed="0.000068"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.435568" elapsed="0.000071"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.435042" elapsed="0.000625"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.436052" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.435989" elapsed="0.000084"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.436121" elapsed="0.000070"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.436240" elapsed="0.000074"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.435722" elapsed="0.000621"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.436680" elapsed="0.000154"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.436885" elapsed="0.000081"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.437095" level="INFO">${timestamp_str} = 1776061697756</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.437016" elapsed="0.000091"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.437207" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.437241" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.437157" elapsed="0.000095"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.437301" elapsed="0.000102"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.436404" elapsed="0.001037"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.434507" elapsed="0.002956"/>
</kw>
<var name="${index_price}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-05-28T18:04:14.434449" elapsed="0.003027"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.437695" elapsed="0.000072"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.437819" elapsed="0.000076"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.437944" elapsed="0.000074"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.438416" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.438350" elapsed="0.000087"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.438486" elapsed="0.000069"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.438606" elapsed="0.000073"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.438079" elapsed="0.000629"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.439100" level="INFO">Length is 10.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.439037" elapsed="0.000083"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.439168" elapsed="0.000069"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.439286" elapsed="0.000072"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.438764" elapsed="0.000622"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.439702" elapsed="0.000091"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.439841" elapsed="0.000076"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.440041" level="INFO">${timestamp_str} = 1779962653593</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.439966" elapsed="0.000086"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.440148" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.440180" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.440099" elapsed="0.000092"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.440237" elapsed="0.000097"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.439444" elapsed="0.000917"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.437570" elapsed="0.002813"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdc', 'p': '73449.3561', 't': 1779962653593}</var>
<status status="PASS" start="2026-05-28T18:04:14.437514" elapsed="0.002881"/>
</iter>
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.440606" elapsed="0.000070"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.440725" elapsed="0.000069"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.440842" elapsed="0.000070"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.441293" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.441231" elapsed="0.000082"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.441359" elapsed="0.000067"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.441476" elapsed="0.000122"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.440969" elapsed="0.000658"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.442004" level="INFO">Length is 9.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.441942" elapsed="0.000082"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.442072" elapsed="0.000066"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.442186" elapsed="0.000070"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.441681" elapsed="0.000614"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.442614" elapsed="0.000091"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.442754" elapsed="0.000077"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.442962" level="INFO">${timestamp_str} = 1779095550280</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.442881" elapsed="0.000093"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.443072" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.443103" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.443022" elapsed="0.000091"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.443160" elapsed="0.000097"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.442354" elapsed="0.000930"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.440484" elapsed="0.002821"/>
</kw>
<var name="${index_price}">{'s': 'xaut_usdt', 'p': '4543.7984', 't': 1779095550280}</var>
<status status="PASS" start="2026-05-28T18:04:14.440431" elapsed="0.002885"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-05-28T18:04:14.374741" elapsed="0.068588"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.372574" elapsed="0.070778"/>
</kw>
<doc>测试获取所有期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:13.996933" elapsed="0.446477"/>
</test>
<test id="s1-s2-s2-s3-t2" name="获取期货U本位单个指数价格" line="16">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.444199" level="INFO">${params} = {'symbol': 'btc_usdt'}</msg>
<var>${params}</var>
<arg>symbol=btc_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.444124" elapsed="0.000086"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.444928" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.444630" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:14.445225" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:14.444996" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:14.444987" elapsed="0.000281"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:14.445283" elapsed="0.000012"/>
</return>
<msg time="2026-05-28T18:04:14.445368" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:14.444297" elapsed="0.001083"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:14.620646" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/index-price?symbol=btc_usdt 
 path_url=/v1/future-u/market/public/q/index-price?symbol=btc_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:14.621029" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/index-price?symbol=btc_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '1e101457866b46210af69d3bfa384e82', 'X-Transparent': '00-1e101457866b46210af69d3bfa384e82-1ae903a61d840d8e-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f1e9cab0f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"s":"btc_usdt","p":"73537.55","t":1779962653595}],"ts":1779962654555} 
 </msg>
<msg time="2026-05-28T18:04:14.621205" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:14.621567" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:14.445626" elapsed="0.176007"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:14.621955" elapsed="0.000112"/>
</return>
<msg time="2026-05-28T18:04:14.622420" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/index-price</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:14.445440" elapsed="0.177039"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.625027" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:14.623821" elapsed="0.001345"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.626498" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:14.625440" elapsed="0.001111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.627083" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:14.626799" elapsed="0.000378"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:14.623024" elapsed="0.004274"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.630085" level="INFO">Length is 1.</msg>
<arg>${response_data['data']}</arg>
<arg>指数价格数据不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.629058" elapsed="0.001129"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($response_data['data'], list)</arg>
<arg>指数价格数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.630419" elapsed="0.000504"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-05-28T18:04:14.627617" elapsed="0.003396"/>
</kw>
<kw name="验证指数价格列表格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($index_price_list, list)</arg>
<arg>指数价格列表应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.632271" elapsed="0.000337"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.633448" level="INFO">Length is 1.</msg>
<arg>${index_price_list}</arg>
<arg>指数价格列表不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.632771" elapsed="0.000745"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证指数价格项格式">
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>s</arg>
<arg>指数价格项应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.634584" elapsed="0.000254"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.635008" elapsed="0.000201"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.635345" elapsed="0.000178"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.636626" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.636457" elapsed="0.000221"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.636806" elapsed="0.000185"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.637140" elapsed="0.000190"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.635686" elapsed="0.001724"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.638469" level="INFO">Length is 8.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.638305" elapsed="0.000220"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.638653" elapsed="0.000166"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.638950" elapsed="0.000201"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.637557" elapsed="0.001663"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.640012" elapsed="0.000240"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.640364" elapsed="0.000181"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.640860" level="INFO">${timestamp_str} = 1779962653595</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.640663" elapsed="0.000224"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.641119" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:14.641193" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.641007" elapsed="0.000208"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.641331" elapsed="0.000254"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.639368" elapsed="0.002280"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T18:04:14.634142" elapsed="0.007565"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '73537.55', 't': 1779962653595}</var>
<status status="PASS" start="2026-05-28T18:04:14.633899" elapsed="0.007896"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-05-28T18:04:14.633626" elapsed="0.008218"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.631296" elapsed="0.010619"/>
</kw>
<kw name="验证单个指数价格符号">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.642854" level="INFO">Length is 1.</msg>
<msg time="2026-05-28T18:04:14.642939" level="INFO">${list_length} = 1</msg>
<var>${list_length}</var>
<arg>${index_price_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:14.642744" elapsed="0.000219"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.643228" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${list_length}</arg>
<arg>1</arg>
<arg>单个指数价格查询应该只返回一个结果</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:14.643073" elapsed="0.000211"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${index_price_list[0]['s']}</arg>
<arg>${expected_symbol}</arg>
<arg>返回的指数价格符号应该匹配查询参数</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:14.643415" elapsed="0.000485"/>
</kw>
<arg>${response.json()['data']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-05-28T18:04:14.642059" elapsed="0.001892"/>
</kw>
<doc>测试获取单个期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:14.443506" elapsed="0.200596"/>
</test>
<test id="s1-s2-s2-s3-t3" name="获取期货U本位符号指数价格_BTC" line="27">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.645898" level="INFO">${params} = {'symbol': 'btc_usdt'}</msg>
<var>${params}</var>
<arg>symbol=btc_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.645712" elapsed="0.000208"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.647381" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.646799" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:14.648029" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:14.647551" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:14.647519" elapsed="0.000584"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:14.648144" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T18:04:14.648446" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:14.646137" elapsed="0.002349"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:14.777071" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt 
 path_url=/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:14.777487" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'b248e5861ec9489bf3417efca47735ba', 'X-Transparent': '00-b248e5861ec9489bf3417efca47735ba-67c35ebe6931349e-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.010', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f1fede00f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"73537.52","t":1779962654616},"ts":1779962654760} 
 </msg>
<msg time="2026-05-28T18:04:14.777672" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:14.778085" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:14.649173" elapsed="0.128979"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:14.778392" elapsed="0.000141"/>
</return>
<msg time="2026-05-28T18:04:14.778921" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-index-price</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:14.648678" elapsed="0.130303"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.781711" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:14.780521" elapsed="0.001311"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.782873" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:14.782045" elapsed="0.000868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.783335" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:14.783111" elapsed="0.000292"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:14.779663" elapsed="0.003837"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.784537" level="INFO">${data} = {'s': 'btc_usdt', 'p': '73537.52', 't': 1779962654616}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:14.783682" elapsed="0.000895"/>
</kw>
<kw name="验证符号指数价格数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<arg>符号指数价格数据应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.785329" elapsed="0.000300"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>p</arg>
<arg>符号指数价格数据应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.785802" elapsed="0.000233"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<arg>符号指数价格数据应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.786204" elapsed="0.000236"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T18:04:14.784860" elapsed="0.001682"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.788110" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>符号指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.787878" elapsed="0.000302"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>符号指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.788352" elapsed="0.000242"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>${expected_symbol}</arg>
<arg>返回的符号应该匹配查询参数</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:14.788783" elapsed="0.000313"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>符号指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.789276" elapsed="0.000260"/>
</kw>
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-05-28T18:04:14.786768" elapsed="0.002861"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.790773" level="INFO">Length is 8.</msg>
<arg>${price}</arg>
<arg>符号指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.790614" elapsed="0.000210"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>符号指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.790945" elapsed="0.000168"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>符号指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.791242" elapsed="0.000199"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.789830" elapsed="0.001691"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${data['t']} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.791660" elapsed="0.000745"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data['t'], int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.792550" elapsed="0.000348"/>
</kw>
<doc>测试获取BTC期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:14.644346" elapsed="0.148777"/>
</test>
<test id="s1-s2-s2-s3-t4" name="获取期货U本位符号指数价格_ETH" line="41">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.795563" level="INFO">${params} = {'symbol': 'eth_usdt'}</msg>
<var>${params}</var>
<arg>symbol=eth_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.795304" elapsed="0.000291"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.797584" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.796837" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:14.798419" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:14.797796" elapsed="0.000685"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:14.797757" elapsed="0.000763"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:14.798564" elapsed="0.000030"/>
</return>
<msg time="2026-05-28T18:04:14.798817" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:14.795898" elapsed="0.002948"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:14.930122" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt 
 path_url=/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:14.930517" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'd2379f535983ede3c0eceefb2feab30e', 'X-Transparent': '00-d2379f535983ede3c0eceefb2feab30e-83d9132e6b74a08f-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f20dee10f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"1995.96","t":1779962654619},"ts":1779962654914} 
 </msg>
<msg time="2026-05-28T18:04:14.930719" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:14.931126" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:14.799666" elapsed="0.131516"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:14.931367" elapsed="0.000112"/>
</return>
<msg time="2026-05-28T18:04:14.931795" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-index-price</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:14.798990" elapsed="0.132851"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.933749" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:14.932941" elapsed="0.000904"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.934588" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:14.934021" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.934934" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:14.934767" elapsed="0.000218"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:14.932304" elapsed="0.002752"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.935715" level="INFO">${data} = {'s': 'eth_usdt', 'p': '1995.96', 't': 1779962654619}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:14.935174" elapsed="0.000565"/>
</kw>
<kw name="验证符号指数价格数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<arg>符号指数价格数据应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.936267" elapsed="0.000187"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>p</arg>
<arg>符号指数价格数据应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.936549" elapsed="0.000131"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<arg>符号指数价格数据应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:14.936838" elapsed="0.000306"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T18:04:14.935964" elapsed="0.001312"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.938208" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>符号指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.938086" elapsed="0.000160"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>符号指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.938331" elapsed="0.000136"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>${expected_symbol}</arg>
<arg>返回的符号应该匹配查询参数</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:14.938575" elapsed="0.000179"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>符号指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.938845" elapsed="0.000133"/>
</kw>
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<status status="PASS" start="2026-05-28T18:04:14.937479" elapsed="0.001552"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.940090" level="INFO">Length is 7.</msg>
<arg>${price}</arg>
<arg>符号指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:14.939892" elapsed="0.000263"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>符号指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:14.940420" elapsed="0.000168"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>符号指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:14.940682" elapsed="0.000147"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:14.939144" elapsed="0.001745"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${data['t']} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.940982" elapsed="0.000513"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data['t'], int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:14.941596" elapsed="0.000311"/>
</kw>
<doc>测试获取ETH期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:14.793505" elapsed="0.148610"/>
</test>
<test id="s1-s2-s2-s3-t5" name="获取期货U本位符号指数价格_SOL" line="55">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.944139" level="INFO">${params} = {'symbol': 'sol_usdt'}</msg>
<var>${params}</var>
<arg>symbol=sol_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.943885" elapsed="0.000291"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:14.946239" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:14.945436" elapsed="0.000829"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:14.946950" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:14.946417" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:14.946383" elapsed="0.000653"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:14.947077" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T18:04:14.947285" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:14.944474" elapsed="0.002835"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:15.144408" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt 
 path_url=/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:15.144741" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:15 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'f5855fccac43c3c2ed1992720a515995', 'X-Transparent': '00-f5855fccac43c3c2ed1992720a515995-53f94fe8974d75d9-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f21cffb0f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"sol_usdt","p":"81.3","t":1779962654622},"ts":1779962655059} 
 </msg>
<msg time="2026-05-28T18:04:15.144879" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:15.147619" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:14.948176" elapsed="0.199501"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:15.147856" elapsed="0.000102"/>
</return>
<msg time="2026-05-28T18:04:15.148266" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-index-price</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:14.947446" elapsed="0.200853"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.150273" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:15.149403" elapsed="0.000962"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.151152" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.150526" elapsed="0.000740"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.151602" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.151417" elapsed="0.000242"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:15.148774" elapsed="0.002957"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.152543" level="INFO">${data} = {'s': 'sol_usdt', 'p': '81.3', 't': 1779962654622}</msg>
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.151877" elapsed="0.000708"/>
</kw>
<kw name="验证符号指数价格数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>s</arg>
<arg>符号指数价格数据应该包含symbol字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:15.153192" elapsed="0.000252"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>p</arg>
<arg>符号指数价格数据应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:15.153583" elapsed="0.000187"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>t</arg>
<arg>符号指数价格数据应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:15.153904" elapsed="0.000182"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T18:04:15.152824" elapsed="0.001341"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.155408" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>符号指数价格符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.155220" elapsed="0.000240"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>符号指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.155578" elapsed="0.000172"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>${expected_symbol}</arg>
<arg>返回的符号应该匹配查询参数</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:15.155877" elapsed="0.000226"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>符号指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.156232" elapsed="0.000168"/>
</kw>
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<status status="PASS" start="2026-05-28T18:04:15.154370" elapsed="0.002102"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.157433" level="INFO">Length is 4.</msg>
<arg>${price}</arg>
<arg>符号指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.157296" elapsed="0.000181"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>符号指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.157592" elapsed="0.000146"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>符号指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.157842" elapsed="0.000168"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T18:04:15.156614" elapsed="0.001459"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${data['t']} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.158184" elapsed="0.000618"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data['t'], int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.158917" elapsed="0.000311"/>
</kw>
<doc>测试获取SOL期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:14.942395" elapsed="0.217037"/>
</test>
<test id="s1-s2-s2-s3-t6" name="获取期货U本位符号指数价格_无效交易对" line="69">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.161899" level="INFO">${params} = {'symbol': 'invalid_pair'}</msg>
<var>${params}</var>
<arg>symbol=invalid_pair</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.161675" elapsed="0.000249"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.163645" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.162973" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.164349" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.163834" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.163802" elapsed="0.000623"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:15.164461" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T18:04:15.164630" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.162176" elapsed="0.002476"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:15.294263" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair 
 path_url=/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:15.294904" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:15 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'c4222336e5265f9d493e50b689864f3e', 'X-Transparent': '00-c4222336e5265f9d493e50b689864f3e-a36c77978e6c0317-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f2319e30f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779962655278} 
 </msg>
<msg time="2026-05-28T18:04:15.295099" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:15.295531" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:15.165379" elapsed="0.130224"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:15.295890" elapsed="0.000157"/>
</return>
<msg time="2026-05-28T18:04:15.296485" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-index-price</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:15.164775" elapsed="0.131766"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.298631" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<arg>HTTP状态码应该是200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:15.297061" elapsed="0.001707"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.300370" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': []}, 'data': None, 'ts': 1779962655278}</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.299063" elapsed="0.001368"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.301787" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response_data['code']}</arg>
<arg>1</arg>
<arg>无效交易对应该返回错误码1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:15.300683" elapsed="0.001222"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data['msg']}</arg>
<arg>failure</arg>
<arg>错误消息应该是failure</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:15.302170" elapsed="0.001093"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data['data']}</arg>
<arg>${None}</arg>
<arg>错误情况下data应该为null</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:15.303450" elapsed="0.000847"/>
</kw>
<doc>测试获取无效交易对的符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:15.159767" elapsed="0.144815"/>
</test>
<test id="s1-s2-s2-s3-t7" name="获取期货U本位符号指数价格_缺少参数" line="81">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.310333" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.309359" elapsed="0.001015"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.311378" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.310608" elapsed="0.000848"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.310565" elapsed="0.000928"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:15.311545" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T18:04:15.311821" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.308236" elapsed="0.003619"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:15.439172" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price 
 path_url=/v1/future-u/market/public/q/symbol-index-price 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:15.439717" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-index-price 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:15 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'd51c5df445a7a04ff6c8ecc8c6ea7a01', 'X-Transparent': '00-d51c5df445a7a04ff6c8ecc8c6ea7a01-9983d01f083c552a-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f240ac10f2c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779962655422} 
 </msg>
<msg time="2026-05-28T18:04:15.439905" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:15.440266" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:15.312931" elapsed="0.127399"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:15.440569" elapsed="0.000125"/>
</return>
<msg time="2026-05-28T18:04:15.441084" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-index-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:15.312074" elapsed="0.129065"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.443044" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<arg>HTTP状态码应该是200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:15.441593" elapsed="0.001600"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.444671" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': ['symbol']}, 'data': None, 'ts': 1779962655422}</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.443491" elapsed="0.001242"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.445751" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response_data['code']}</arg>
<arg>1</arg>
<arg>缺少参数应该返回错误码1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:15.444925" elapsed="0.000916"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data['msg']}</arg>
<arg>failure</arg>
<arg>错误消息应该是failure</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:15.446049" elapsed="0.000811"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data['data']}</arg>
<arg>${None}</arg>
<arg>错误情况下data应该为null</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:15.447053" elapsed="0.000842"/>
</kw>
<doc>测试缺少symbol参数的符号指数价格请求</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:15.305069" elapsed="0.143124"/>
</test>
<doc>期货U本位指数价格接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:13.980280" elapsed="1.468628"/>
</suite>
<suite id="s1-s2-s2-s4" name="Future U Mark Price" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_mark_price.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.459503" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:15.459255" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.460036" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.459899" elapsed="0.000185"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:15.459653" elapsed="0.000470"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.460256" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.460153" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.459621" elapsed="0.000711"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.461056" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.460938" elapsed="0.000161"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.461345" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.461466" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.461595" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.461720" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.461908" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.461169" elapsed="0.000792"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462114" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462206" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462297" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462392" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462483" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462579" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462666" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462759" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.462849" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.461987" elapsed="0.000909"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.463205" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.462982" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.463496" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.463321" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.463783" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.463613" elapsed="0.000201"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.464093" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.463905" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.464380" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.464210" elapsed="0.000199"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.464668" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.464490" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.464982" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.464780" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.465284" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.465097" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.465586" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.465395" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:15.462913" elapsed="0.002742"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.461151" elapsed="0.004523"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.465873" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.465747" elapsed="0.000160"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:15.466512" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:15.465999" elapsed="0.000711"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.460672" elapsed="0.006127"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.467070" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.466947" elapsed="0.000169"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.458936" elapsed="0.008239"/>
</kw>
<test id="s1-s2-s2-s4-t1" name="获取期货U本位标记价格" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.470323" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.469604" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.470986" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.470502" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.470484" elapsed="0.000579"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:15.471095" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T18:04:15.471274" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.468761" elapsed="0.002537"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:15.891897" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/mark-price 
 path_url=/v1/future-u/market/public/q/mark-price 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:15.892294" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/mark-price 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:15 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '88082f8c659ac98f483870ba871eb6ea', 'X-Transparent': '00-88082f8c659ac98f483870ba871eb6ea-5eb0699e2f1de00c-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.013', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f26c9b09354-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"s":"trb_usdt","p":"44.994","t":1776061641025},{"s":"xrp_usdt","p":"1.8795","t":1744189287376},{"s":"eth_usdt","p":"76000","t":1779962655651},{"s":"sol_usdt","p":"85.15","t":1779962655645},{"s":"bnb_usdt","p":"2085","t":1779962655651},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"73640.45","t":1779962655640},{"s":"1000shib_usdt","p":"0.0058","t":1776061707972},{"s":"ada_usdt","p":"0.2394","t":1776061663345},{"s":"arb_usdt","p":"0.11","t":1776061665430},{"s":"doge_usdt","p":"0.09868","t":1779962655647},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"73449.3592","t":1779962655636},{"s":"xaut_usdt","p":"4543.7984","t":1779095550280}],"ts":1779962655863} 
 </msg>
<msg time="2026-05-28T18:04:15.892515" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:15.892932" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:15.472061" elapsed="0.420938"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:15.893255" elapsed="0.000133"/>
</return>
<msg time="2026-05-28T18:04:15.893781" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/mark-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:15.471431" elapsed="0.422404"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.896530" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:15.895289" elapsed="0.001400"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.898037" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.896962" elapsed="0.001130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.898632" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.898336" elapsed="0.000384"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:15.894417" elapsed="0.004423"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:15.900356" level="INFO">${data} = [{'s': 'trb_usdt', 'p': '44.994', 't': 1776061641025}, {'s': 'xrp_usdt', 'p': '1.8795', 't': 1744189287376}, {'s': 'eth_usdt', 'p': '76000', 't': 1779962655651}, {'s': 'sol_usdt', 'p': '85.15', 't': 1...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.899090" elapsed="0.001323"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.900964" level="INFO">Length is 15.</msg>
<arg>${data}</arg>
<arg>响应数据不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.900664" elapsed="0.000366"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>标记价格数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.901289" elapsed="0.000469"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.902122" level="INFO">Length is 15.</msg>
<msg time="2026-05-28T18:04:15.902242" level="INFO">${length} = 15</msg>
<var>${length}</var>
<arg>${data}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.901941" elapsed="0.000336"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt; 0</arg>
<arg>标记价格列表不应为空</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.902444" elapsed="0.000277"/>
</kw>
<kw name="验证期货标记价格列表结构">
<for flavor="IN">
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.904430" elapsed="0.000354"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.904956" elapsed="0.000595"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.905694" elapsed="0.000195"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.906025" elapsed="0.000184"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.906770" elapsed="0.000189"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.907261" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.907090" elapsed="0.000223"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.907455" elapsed="0.000205"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.906412" elapsed="0.001324"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.908267" elapsed="0.000170"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.908715" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.908561" elapsed="0.000208"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.908898" elapsed="0.000208"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.909464" level="INFO">${price_float} = 44.994</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.909259" elapsed="0.000232"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.909605" elapsed="0.000193"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.907925" elapsed="0.001934"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.910327" elapsed="0.000253"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.910691" elapsed="0.000185"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.911183" level="INFO">${timestamp_str} = 1776061641025</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.910995" elapsed="0.000221"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.911445" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.911524" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.911328" elapsed="0.000222"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.911661" elapsed="0.000257"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.910035" elapsed="0.001950"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.903999" elapsed="0.008042"/>
</kw>
<var name="${mark_price_item}">{'s': 'trb_usdt', 'p': '44.994', 't': 1776061641025}</var>
<status status="PASS" start="2026-05-28T18:04:15.903765" elapsed="0.008309"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.912619" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.912943" elapsed="0.000178"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.913234" elapsed="0.000173"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.913518" elapsed="0.000142"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.914106" elapsed="0.000135"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.914446" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.914332" elapsed="0.000153"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.914580" elapsed="0.000131"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.913848" elapsed="0.000918"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.915127" elapsed="0.000286"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.915618" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.915507" elapsed="0.000151"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.915750" elapsed="0.000136"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.916145" level="INFO">${price_float} = 1.8795</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.915986" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.916265" elapsed="0.000147"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.914888" elapsed="0.001577"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.916820" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.917093" elapsed="0.000144"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.917549" level="INFO">${timestamp_str} = 1744189287376</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.917331" elapsed="0.000263"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.917884" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.917966" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.917737" elapsed="0.000254"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.918104" elapsed="0.000254"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.916587" elapsed="0.001840"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.912329" elapsed="0.006154"/>
</kw>
<var name="${mark_price_item}">{'s': 'xrp_usdt', 'p': '1.8795', 't': 1744189287376}</var>
<status status="PASS" start="2026-05-28T18:04:15.912196" elapsed="0.006319"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.919048" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.919399" elapsed="0.000183"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.919701" elapsed="0.000174"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.919993" elapsed="0.000170"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.920607" elapsed="0.000161"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.921032" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.920883" elapsed="0.000197"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.921194" elapsed="0.000171"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.920305" elapsed="0.001127"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.921847" elapsed="0.000135"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.922202" level="INFO">Length is 5.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.922079" elapsed="0.000162"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.922337" elapsed="0.000145"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.922786" level="INFO">${price_float} = 76000.0</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.922618" elapsed="0.000191"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.922904" elapsed="0.000160"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.921579" elapsed="0.001539"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.923490" elapsed="0.000187"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.923774" elapsed="0.000157"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.924189" level="INFO">${timestamp_str} = 1779962655651</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.924032" elapsed="0.000180"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.924412" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.924476" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.924308" elapsed="0.000189"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.924592" elapsed="0.000203"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.923240" elapsed="0.001611"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.918751" elapsed="0.006145"/>
</kw>
<var name="${mark_price_item}">{'s': 'eth_usdt', 'p': '76000', 't': 1779962655651}</var>
<status status="PASS" start="2026-05-28T18:04:15.918610" elapsed="0.006313"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.925504" elapsed="0.000188"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.925792" elapsed="0.000152"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.926044" elapsed="0.000142"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.926284" elapsed="0.000144"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.926797" elapsed="0.000131"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.927147" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.927024" elapsed="0.000161"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.927280" elapsed="0.000141"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.926547" elapsed="0.000929"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.927840" elapsed="0.000131"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.928185" level="INFO">Length is 5.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.928065" elapsed="0.000158"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.928317" elapsed="0.000144"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.928724" level="INFO">${price_float} = 85.15</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.928563" elapsed="0.000184"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.928839" elapsed="0.000157"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.927594" elapsed="0.001454"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.929414" elapsed="0.000184"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.929695" elapsed="0.000155"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.930100" level="INFO">${timestamp_str} = 1779962655645</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.929949" elapsed="0.000171"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.930289" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.930343" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.930202" elapsed="0.000160"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.930441" elapsed="0.000172"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.929168" elapsed="0.001605"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.925115" elapsed="0.005716"/>
</kw>
<var name="${mark_price_item}">{'s': 'sol_usdt', 'p': '85.15', 't': 1779962655645}</var>
<status status="PASS" start="2026-05-28T18:04:15.925000" elapsed="0.005859"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.931351" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.931672" elapsed="0.000152"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.931916" elapsed="0.000135"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.932141" elapsed="0.000133"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.932627" elapsed="0.000125"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.932955" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.932840" elapsed="0.000151"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.933077" elapsed="0.000129"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.932391" elapsed="0.000869"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.933722" elapsed="0.000124"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.934039" level="INFO">Length is 4.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.933932" elapsed="0.000143"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.934161" elapsed="0.000132"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.934533" level="INFO">${price_float} = 2085.0</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.934385" elapsed="0.000170"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.934640" elapsed="0.000152"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.933373" elapsed="0.001470"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.935189" elapsed="0.000177"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.935456" elapsed="0.000145"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.935831" level="INFO">${timestamp_str} = 1779962655651</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.935693" elapsed="0.000160"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.936029" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.936086" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.935939" elapsed="0.000165"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.936188" elapsed="0.000184"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.934957" elapsed="0.001465"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.931081" elapsed="0.005381"/>
</kw>
<var name="${mark_price_item}">{'s': 'bnb_usdt', 'p': '2085', 't': 1779962655651}</var>
<status status="PASS" start="2026-05-28T18:04:15.930951" elapsed="0.005533"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.936883" elapsed="0.000168"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.937140" elapsed="0.000134"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.937363" elapsed="0.000132"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.937583" elapsed="0.000129"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.938041" elapsed="0.000118"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.938382" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.938244" elapsed="0.000174"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.938507" elapsed="0.000127"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.937820" elapsed="0.000860"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.938973" elapsed="0.000108"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.939251" level="INFO">Length is 5.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.939157" elapsed="0.000125"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.939357" elapsed="0.000115"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.939682" level="INFO">${price_float} = 2.256</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.939553" elapsed="0.000148"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.939775" elapsed="0.000123"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.938776" elapsed="0.001166"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.940235" elapsed="0.000146"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.940456" elapsed="0.000126"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.940788" level="INFO">${timestamp_str} = 1776061643383</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.940658" elapsed="0.000148"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.940960" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.941011" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.940883" elapsed="0.000146"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.941102" elapsed="0.000261"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.940039" elapsed="0.001370"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.936661" elapsed="0.004785"/>
</kw>
<var name="${mark_price_item}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-05-28T18:04:15.936557" elapsed="0.004909"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.941812" elapsed="0.000148"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.942036" elapsed="0.000118"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.942231" elapsed="0.000116"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.942425" elapsed="0.000114"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.942829" elapsed="0.000105"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.943098" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.943010" elapsed="0.000116"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.943193" elapsed="0.000100"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.942633" elapsed="0.000701"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.943592" elapsed="0.000096"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.943844" level="INFO">Length is 8.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.943756" elapsed="0.000116"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.943941" elapsed="0.000104"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.944233" level="INFO">${price_float} = 73640.45</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.944117" elapsed="0.000133"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.944316" elapsed="0.000113"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.943419" elapsed="0.001071"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.944764" elapsed="0.000132"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.944966" elapsed="0.000111"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.945261" level="INFO">${timestamp_str} = 1779962655640</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.945148" elapsed="0.000129"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.945417" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.945462" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.945344" elapsed="0.000132"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.945540" elapsed="0.000141"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.944575" elapsed="0.001146"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.941620" elapsed="0.004132"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdt', 'p': '73640.45', 't': 1779962655640}</var>
<status status="PASS" start="2026-05-28T18:04:15.941528" elapsed="0.004242"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.946075" elapsed="0.000131"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.946276" elapsed="0.000113"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.946459" elapsed="0.000102"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.946630" elapsed="0.000102"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.946995" elapsed="0.000173"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.947323" level="INFO">Length is 13.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.947236" elapsed="0.000115"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.947418" elapsed="0.000103"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.946820" elapsed="0.000742"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.947821" elapsed="0.000094"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.948069" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.947982" elapsed="0.000114"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.948165" elapsed="0.000104"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.948456" level="INFO">${price_float} = 0.0058</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.948340" elapsed="0.000133"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.948539" elapsed="0.000111"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.947646" elapsed="0.001041"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.948952" elapsed="0.000130"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.949150" elapsed="0.000110"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.949437" level="INFO">${timestamp_str} = 1776061707972</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.949328" elapsed="0.000126"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.949595" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.949641" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.949522" elapsed="0.000134"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.949723" elapsed="0.000141"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.948776" elapsed="0.001128"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.945905" elapsed="0.004032"/>
</kw>
<var name="${mark_price_item}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-05-28T18:04:15.945824" elapsed="0.004131"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.950285" elapsed="0.000129"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.950488" elapsed="0.000110"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.950668" elapsed="0.000102"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.950838" elapsed="0.000102"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.951202" elapsed="0.000094"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.951449" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.951363" elapsed="0.000114"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.951543" elapsed="0.000099"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.951025" elapsed="0.000657"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.951926" elapsed="0.000084"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.952150" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.952071" elapsed="0.000104"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.952236" elapsed="0.000094"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.952505" level="INFO">${price_float} = 0.2394</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.952400" elapsed="0.000121"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.952584" elapsed="0.000101"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.951767" elapsed="0.000958"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.952961" elapsed="0.000191"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.953217" elapsed="0.000101"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.953478" level="INFO">${timestamp_str} = 1776061663345</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.953379" elapsed="0.000114"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.953624" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.953667" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.953557" elapsed="0.000124"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.953741" elapsed="0.000128"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.952802" elapsed="0.001102"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.950111" elapsed="0.003822"/>
</kw>
<var name="${mark_price_item}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-05-28T18:04:15.950031" elapsed="0.003919"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.954229" elapsed="0.000118"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.954410" elapsed="0.000101"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.954576" elapsed="0.000094"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.954734" elapsed="0.000093"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.955065" elapsed="0.000085"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.955290" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.955212" elapsed="0.000103"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.955377" elapsed="0.000091"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.954906" elapsed="0.000615"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.955757" elapsed="0.000087"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.955983" level="INFO">Length is 4.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.955906" elapsed="0.000102"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.956070" elapsed="0.000094"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.956320" level="INFO">${price_float} = 0.11</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.956224" elapsed="0.000110"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.956390" elapsed="0.000093"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.955599" elapsed="0.000915"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.956737" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.956908" elapsed="0.000092"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.957153" level="INFO">${timestamp_str} = 1776061665430</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.957060" elapsed="0.000107"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.957283" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.957321" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.957223" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.957389" elapsed="0.000116"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.956587" elapsed="0.000951"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.954072" elapsed="0.003492"/>
</kw>
<var name="${mark_price_item}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-05-28T18:04:15.953998" elapsed="0.003581"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.957840" elapsed="0.000109"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.958008" elapsed="0.000089"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.958156" elapsed="0.000086"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.958300" elapsed="0.000088"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.958679" elapsed="0.000082"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.958896" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.958821" elapsed="0.000099"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.958976" elapsed="0.000085"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.958461" elapsed="0.000632"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.959310" elapsed="0.000078"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.959519" level="INFO">Length is 7.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.959445" elapsed="0.000098"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.959599" elapsed="0.000086"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.959841" level="INFO">${price_float} = 0.09868</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.959746" elapsed="0.000109"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.959911" elapsed="0.000094"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.959164" elapsed="0.000873"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.960256" elapsed="0.000112"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.960442" elapsed="0.000095"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.960683" level="INFO">${timestamp_str} = 1779962655647</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.960594" elapsed="0.000102"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.960812" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.960848" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.960755" elapsed="0.000105"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.960912" elapsed="0.000111"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.960108" elapsed="0.000946"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.957691" elapsed="0.003389"/>
</kw>
<var name="${mark_price_item}">{'s': 'doge_usdt', 'p': '0.09868', 't': 1779962655647}</var>
<status status="PASS" start="2026-05-28T18:04:15.957624" elapsed="0.003471"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.961339" elapsed="0.000102"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.961495" elapsed="0.000088"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.961638" elapsed="0.000080"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.961773" elapsed="0.000079"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.962057" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.962250" level="INFO">Length is 11.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.962184" elapsed="0.000088"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.962326" elapsed="0.000078"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.961920" elapsed="0.000515"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.962642" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.962837" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.962771" elapsed="0.000088"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.962912" elapsed="0.000079"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.963136" level="INFO">${price_float} = 3.3966</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.963050" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.963202" elapsed="0.000086"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.962502" elapsed="0.000816"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.963525" elapsed="0.000165"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.963745" elapsed="0.000086"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.963975" level="INFO">${timestamp_str} = 1747980978061</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.963885" elapsed="0.000102"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.964099" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.964135" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.964041" elapsed="0.000107"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.964200" elapsed="0.000109"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.963385" elapsed="0.000955"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.961200" elapsed="0.003165"/>
</kw>
<var name="${mark_price_item}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-05-28T18:04:15.961136" elapsed="0.003244"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.964622" elapsed="0.000107"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.964784" elapsed="0.000097"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.964940" elapsed="0.000081"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.965079" elapsed="0.000081"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.965371" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.965569" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.965499" elapsed="0.000092"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.965643" elapsed="0.000080"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.965227" elapsed="0.000527"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.965958" elapsed="0.000073"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.966152" level="INFO">Length is 6.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.966084" elapsed="0.000089"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.966226" elapsed="0.000080"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.966452" level="INFO">${price_float} = 0.0445</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.966362" elapsed="0.000103"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.966521" elapsed="0.000087"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.965821" elapsed="0.000817"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.966843" elapsed="0.000106"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.967003" elapsed="0.000087"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.967237" level="INFO">${timestamp_str} = 1776061697756</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.967149" elapsed="0.000102"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.967360" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.967395" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.967304" elapsed="0.000102"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.967458" elapsed="0.000110"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.966706" elapsed="0.000892"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.964485" elapsed="0.003138"/>
</kw>
<var name="${mark_price_item}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-05-28T18:04:15.964422" elapsed="0.003215"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.967877" elapsed="0.000101"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.968033" elapsed="0.000083"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.968171" elapsed="0.000081"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.968306" elapsed="0.000089"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.968672" elapsed="0.000079"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.968874" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.968805" elapsed="0.000091"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.968949" elapsed="0.000078"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.968463" elapsed="0.000595"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.969260" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.969458" level="INFO">Length is 10.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.969396" elapsed="0.000083"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.969528" elapsed="0.000074"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.969737" level="INFO">${price_float} = 73449.3592</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.969655" elapsed="0.000093"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.969795" elapsed="0.000080"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.969125" elapsed="0.000778"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.970093" elapsed="0.000093"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.970236" elapsed="0.000080"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.970447" level="INFO">${timestamp_str} = 1779962655636</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.970367" elapsed="0.000092"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.970559" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.970591" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.970508" elapsed="0.000094"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.970650" elapsed="0.000103"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.969965" elapsed="0.000816"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.967742" elapsed="0.003061"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdc', 'p': '73449.3592', 't': 1779962655636}</var>
<status status="PASS" start="2026-05-28T18:04:15.967679" elapsed="0.003137"/>
</iter>
<iter>
<kw name="验证期货标记价格项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_item, dict)</arg>
<arg>标记价格项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971035" elapsed="0.000093"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971178" elapsed="0.000077"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971306" elapsed="0.000077"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971433" elapsed="0.000073"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971694" elapsed="0.000066"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.971870" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971808" elapsed="0.000082"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.971937" elapsed="0.000072"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.971570" elapsed="0.000466"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.972221" elapsed="0.000072"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.972404" level="INFO">Length is 9.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:15.972342" elapsed="0.000082"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:15.972472" elapsed="0.000074"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.972680" level="INFO">${price_float} = 4543.7984</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:15.972597" elapsed="0.000095"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.972742" elapsed="0.000081"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.972097" elapsed="0.000753"/>
</kw>
<kw name="验证时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.973415" elapsed="0.000093"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.973558" elapsed="0.000080"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.973767" level="INFO">${timestamp_str} = 1779095550280</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:15.973687" elapsed="0.000092"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.973889" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:15.973920" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:15.973837" elapsed="0.000094"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:15.973976" elapsed="0.000098"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:15.972911" elapsed="0.001190"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.970912" elapsed="0.003211"/>
</kw>
<var name="${mark_price_item}">{'s': 'xaut_usdt', 'p': '4543.7984', 't': 1779095550280}</var>
<status status="PASS" start="2026-05-28T18:04:15.970854" elapsed="0.003281"/>
</iter>
<var>${mark_price_item}</var>
<value>@{mark_price_list}</value>
<status status="PASS" start="2026-05-28T18:04:15.903483" elapsed="0.070664"/>
</for>
<arg>${data}</arg>
<doc>验证期货标记价格列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:15.903068" elapsed="0.071103"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.974614" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.974387" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:15.974750" elapsed="0.000218"/>
</kw>
<msg time="2026-05-28T18:04:15.975008" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:15.974681" elapsed="0.000338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.975140" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:15.975074" elapsed="0.000078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.975293" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:15.975204" elapsed="0.000101"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.975432" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:15.975358" elapsed="0.000085"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.975614" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位标记价格 | 📡 请求接口: /v1/future-u/market/public/q/mark-price | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:15.975493" elapsed="0.000134"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.975771" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位标记价格 | 📡 请求接口: /v1/future-u/market/public/q/mark-price | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:15.975678" elapsed="0.000106"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.975891" level="INFO">🧪 测试过程: 获取期货U本位标记价格 | 📡 请求接口: /v1/future-u/market/public/q/mark-price | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.975835" elapsed="0.000075"/>
</kw>
<arg>获取期货U本位标记价格</arg>
<arg>/v1/future-u/market/public/q/mark-price</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:15.974246" elapsed="0.001688"/>
</kw>
<doc>验证期货U本位标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:15.467241" elapsed="0.508751"/>
</test>
<doc>期货U本位标记价格接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:15.450979" elapsed="0.525141"/>
</suite>
<suite id="s1-s2-s2-s5" name="Future U Symbol Mark Price" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_symbol_mark_price.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.978444" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:15.978363" elapsed="0.000093"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.978632" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.978576" elapsed="0.000076"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:15.978491" elapsed="0.000176"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.978719" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.978677" elapsed="0.000065"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.978482" elapsed="0.000268"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.979097" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.978973" elapsed="0.000143"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979214" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979278" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979330" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979380" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979428" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.979145" elapsed="0.000305"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979525" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979576" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979625" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979674" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979722" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979772" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979820" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979867" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.979913" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.979459" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.980078" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.979981" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.980231" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.980142" elapsed="0.000106"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.980385" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.980296" elapsed="0.000106"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.980540" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.980448" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.980696" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.980603" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.980855" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.980765" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.981014" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.980918" elapsed="0.000113"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.981175" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.981077" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.981338" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:15.981240" elapsed="0.000115"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:15.979942" elapsed="0.001428"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.979138" elapsed="0.002241"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.981485" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.981419" elapsed="0.000085"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:15.981664" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:15.981548" elapsed="0.000186"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.978867" elapsed="0.002896"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.981859" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:15.981808" elapsed="0.000068"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.978269" elapsed="0.003630"/>
</kw>
<test id="s1-s2-s2-s5-t1" name="获取期货U本位符号标记价格_正常请求" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:15.983246" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:15.982968" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:15.983525" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:15.983310" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:15.983302" elapsed="0.000257"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:15.983573" elapsed="0.000013"/>
</return>
<msg time="2026-05-28T18:04:15.983657" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:15.982654" elapsed="0.001015"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:16.463635" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt 
 path_url=/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:16.464065" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'ddc6f65c419ddb5e00854fe77936b672', 'X-Transparent': '00-ddc6f65c419ddb5e00854fe77936b672-6c8189d93c3db28d-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.010', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f2a1d690719-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"73640.45","t":1779962655640},"ts":1779962656436} 
 </msg>
<msg time="2026-05-28T18:04:16.464254" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:16.464660" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:15.984019" elapsed="0.480722"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:16.464969" elapsed="0.000128"/>
</return>
<msg time="2026-05-28T18:04:16.465509" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:15.983727" elapsed="0.481849"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.468362" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:16.467060" elapsed="0.001459"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.469991" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.468826" elapsed="0.001225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.470651" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:16.470333" elapsed="0.000419"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:16.466155" elapsed="0.004735"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:16.472379" level="INFO">${response_data} = {'s': 'btc_usdt', 'p': '73640.45', 't': 1779962655640}</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.471160" elapsed="0.001269"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.472931" level="INFO">Length is 3.</msg>
<arg>${response_data}</arg>
<arg>响应数据不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:16.472642" elapsed="0.000361"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($response_data, dict)</arg>
<arg>标记价格数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.473370" elapsed="0.000483"/>
</kw>
<kw name="验证期货符号标记价格结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_data, dict)</arg>
<arg>标记价格数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.474832" elapsed="0.000909"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_data}</arg>
<arg>s</arg>
<arg>标记价格数据应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.475947" elapsed="0.000296"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_data}</arg>
<arg>p</arg>
<arg>标记价格数据应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.476393" elapsed="0.000203"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_data}</arg>
<arg>t</arg>
<arg>标记价格数据应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.476727" elapsed="0.000181"/>
</kw>
<kw name="验证符号标记价格交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:16.477592" elapsed="0.000190"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.478087" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:16.477915" elapsed="0.000225"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:16.478278" elapsed="0.000194"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T18:04:16.478809" level="INFO">${symbol_lower} = btc_usdt</msg>
<var>${symbol_lower}</var>
<arg>${symbol}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-28T18:04:16.478619" elapsed="0.000221"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T18:04:16.479146" level="INFO">${expected_lower} = btc_usdt</msg>
<var>${expected_lower}</var>
<arg>${expected_symbol}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-28T18:04:16.478966" elapsed="0.000211"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${symbol_lower}</arg>
<arg>${expected_lower}</arg>
<arg>返回的交易对符号应与请求的符号匹配</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:16.479313" elapsed="0.000269"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:16.477138" elapsed="0.002532"/>
</kw>
<kw name="验证符号标记价格价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:16.480218" elapsed="0.000187"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.480653" level="INFO">Length is 8.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:16.480517" elapsed="0.000184"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:16.480848" elapsed="0.000177"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.481353" level="INFO">${price_float} = 73640.45</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:16.481155" elapsed="0.000225"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.481496" elapsed="0.000235"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:16.479869" elapsed="0.001933"/>
</kw>
<kw name="验证符号标记价格时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.482316" elapsed="0.000290"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.482722" elapsed="0.000191"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.483222" level="INFO">${timestamp_str} = 1779962655640</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:16.483033" elapsed="0.000217"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.483478" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:16.483557" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:16.483366" elapsed="0.000217"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.483694" elapsed="0.000245"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-05-28T18:04:16.484391" level="INFO">${current_time} = 1779962656.484275</msg>
<var>${current_time}</var>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-05-28T18:04:16.484080" elapsed="0.000339"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.484764" level="INFO">${current_timestamp} = 1779962656484</msg>
<var>${current_timestamp}</var>
<arg>int(${current_time} * 1000)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:16.484560" elapsed="0.000227"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.485078" level="INFO">${time_diff} = 844</msg>
<var>${time_diff}</var>
<arg>abs(${current_timestamp} - ${timestamp})</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:16.484884" elapsed="0.000218"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${time_diff} &lt; 300000</arg>
<arg>时间戳应该在当前时间的5分钟内（考虑到网络延迟和时钟差异）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.485194" elapsed="0.000147"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:16.481997" elapsed="0.003521"/>
</kw>
<arg>${response_data}</arg>
<arg>btc_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:16.474240" elapsed="0.011338"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.486708" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.486129" elapsed="0.000603"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:16.486993" elapsed="0.000487"/>
</kw>
<msg time="2026-05-28T18:04:16.487565" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:16.486849" elapsed="0.000739"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.487859" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.487718" elapsed="0.000164"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.488163" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.487987" elapsed="0.000200"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.488445" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.488299" elapsed="0.000170"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.488835" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位符号标记价格_正常请求 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.488577" elapsed="0.000362"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.489611" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位符号标记价格_正常请求 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.489125" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.489927" level="INFO">🧪 测试过程: 获取期货U本位符号标记价格_正常请求 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:16.489781" elapsed="0.000198"/>
</kw>
<arg>获取期货U本位符号标记价格_正常请求</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:16.485797" elapsed="0.004244"/>
</kw>
<doc>验证期货U本位单个交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:15.981923" elapsed="0.508268"/>
</test>
<test id="s1-s2-s2-s5-t2" name="获取期货U本位符号标记价格_ETH交易对" line="33">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.493906" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.493256" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:16.494555" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:16.494066" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:16.494042" elapsed="0.000593"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:16.494673" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T18:04:16.494868" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:16.492429" elapsed="0.002462"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:16.719572" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt 
 path_url=/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:16.720088" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'fbd142d72e8aeabadd883ab9d2f67de5', 'X-Transparent': '00-fbd142d72e8aeabadd883ab9d2f67de5-9b343a7fb60dac70-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f2b88710719-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"76000","t":1779962655651},"ts":1779962656684} 
 </msg>
<msg time="2026-05-28T18:04:16.720274" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:16.720694" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:16.495679" elapsed="0.225085"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:16.721017" elapsed="0.000141"/>
</return>
<msg time="2026-05-28T18:04:16.721555" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:16.495024" elapsed="0.226593"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.724386" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:16.723069" elapsed="0.001462"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.725854" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.724802" elapsed="0.001108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.726459" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:16.726169" elapsed="0.000385"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:16.722193" elapsed="0.004482"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:16.728150" level="INFO">${response_data} = {'s': 'eth_usdt', 'p': '76000', 't': 1779962655651}</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.726923" elapsed="0.001288"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.728703" level="INFO">Length is 3.</msg>
<arg>${response_data}</arg>
<arg>响应数据不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:16.728412" elapsed="0.000362"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($response_data, dict)</arg>
<arg>标记价格数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.729018" elapsed="0.000569"/>
</kw>
<kw name="验证期货符号标记价格结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($mark_price_data, dict)</arg>
<arg>标记价格数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.730568" elapsed="0.000400"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_data}</arg>
<arg>s</arg>
<arg>标记价格数据应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.731157" elapsed="0.000280"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_data}</arg>
<arg>p</arg>
<arg>标记价格数据应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.731599" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_data}</arg>
<arg>t</arg>
<arg>标记价格数据应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.731992" elapsed="0.000230"/>
</kw>
<kw name="验证符号标记价格交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:16.732871" elapsed="0.000193"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.733707" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<arg>交易对符号不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:16.733193" elapsed="0.000573"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:16.733916" elapsed="0.000208"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T18:04:16.734468" level="INFO">${symbol_lower} = eth_usdt</msg>
<var>${symbol_lower}</var>
<arg>${symbol}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-28T18:04:16.734267" elapsed="0.000232"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T18:04:16.734803" level="INFO">${expected_lower} = eth_usdt</msg>
<var>${expected_lower}</var>
<arg>${expected_symbol}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-05-28T18:04:16.734622" elapsed="0.000293"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${symbol_lower}</arg>
<arg>${expected_lower}</arg>
<arg>返回的交易对符号应与请求的符号匹配</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:16.735057" elapsed="0.000291"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:16.732439" elapsed="0.002996"/>
</kw>
<kw name="验证符号标记价格价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:16.735969" elapsed="0.000172"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.736420" level="INFO">Length is 5.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:16.736269" elapsed="0.000202"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T18:04:16.736593" elapsed="0.000172"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.737094" level="INFO">${price_float} = 76000.0</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-05-28T18:04:16.736894" elapsed="0.000226"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.737239" elapsed="0.000200"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T18:04:16.735628" elapsed="0.001871"/>
</kw>
<kw name="验证符号标记价格时间戳">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>时间戳应该是整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.737982" elapsed="0.000237"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.738331" elapsed="0.000172"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.738801" level="INFO">${timestamp_str} = 1779962655651</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:16.738614" elapsed="0.000217"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.739062" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:16.739137" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:16.738950" elapsed="0.000212"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.739271" elapsed="0.000256"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-05-28T18:04:16.739979" level="INFO">${current_time} = 1779962656.739871</msg>
<var>${current_time}</var>
<arg>result_format=epoch</arg>
<arg>exclude_millis=False</arg>
<doc>Returns current local or UTC time with an optional increment.</doc>
<status status="PASS" start="2026-05-28T18:04:16.739671" elapsed="0.000334"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.740340" level="INFO">${current_timestamp} = 1779962656739</msg>
<var>${current_timestamp}</var>
<arg>int(${current_time} * 1000)</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:16.740135" elapsed="0.000231"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.740696" level="INFO">${time_diff} = 1088</msg>
<var>${time_diff}</var>
<arg>abs(${current_timestamp} - ${timestamp})</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:16.740477" elapsed="0.000245"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${time_diff} &lt; 300000</arg>
<arg>时间戳应该在当前时间的5分钟内（考虑到网络延迟和时钟差异）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:16.740839" elapsed="0.000165"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:16.737688" elapsed="0.003381"/>
</kw>
<arg>${response_data}</arg>
<arg>eth_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:16.729987" elapsed="0.011131"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.742167" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.741635" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:16.742489" elapsed="0.000469"/>
</kw>
<msg time="2026-05-28T18:04:16.743045" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:16.742318" elapsed="0.000750"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.743356" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.743213" elapsed="0.000167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.743659" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.743484" elapsed="0.000197"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.743927" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.743786" elapsed="0.000163"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.744300" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位符号标记价格_ETH交易对 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.744050" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.744652" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位符号标记价格_ETH交易对 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.744477" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.744893" level="INFO">🧪 测试过程: 获取期货U本位符号标记价格_ETH交易对 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:16.744782" elapsed="0.000150"/>
</kw>
<arg>获取期货U本位符号标记价格_ETH交易对</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:16.741326" elapsed="0.003663"/>
</kw>
<doc>验证期货U本位ETH交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:16.490430" elapsed="0.254737"/>
</test>
<test id="s1-s2-s2-s5-t3" name="获取期货U本位符号标记价格_无效交易对" line="59">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.749543" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.748744" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:16.750309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:16.749744" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:16.749716" elapsed="0.000678"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:16.750428" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T18:04:16.750625" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:16.747809" elapsed="0.002841"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:16.890886" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol 
 path_url=/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:16.891271" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '6701c5205b9e6577599ea4849bba19cd', 'X-Transparent': '00-6701c5205b9e6577599ea4849bba19cd-704190d7cfd03f42-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f2d2c830719-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779962656866} 
 </msg>
<msg time="2026-05-28T18:04:16.891461" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:16.891862" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:16.751494" elapsed="0.140439"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:16.892160" elapsed="0.000139"/>
</return>
<msg time="2026-05-28T18:04:16.892675" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:16.750792" elapsed="0.141939"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.894650" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<arg>HTTP状态码应为200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:16.893172" elapsed="0.001626"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:16.896346" level="INFO">${response_data} = None</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.895110" elapsed="0.001292"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:16.897859" level="INFO">${code} = 1</msg>
<var>${code}</var>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.896666" elapsed="0.001252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:16.899290" level="INFO">${msg} = failure</msg>
<var>${msg}</var>
<arg>${response.json()}</arg>
<arg>msg</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.898176" elapsed="0.001167"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.899933" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${code}</arg>
<arg>1</arg>
<arg>业务错误码应为1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:16.899596" elapsed="0.000455"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${msg}</arg>
<arg>failure</arg>
<arg>错误消息应为failure</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:16.900298" elapsed="0.000372"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data}</arg>
<arg>${None}</arg>
<arg>错误情况下data应为null</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:16.900930" elapsed="0.000439"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.903562" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.902754" elapsed="0.000849"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:16.904084" elapsed="0.000784"/>
</kw>
<msg time="2026-05-28T18:04:16.905010" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:16.903816" elapsed="0.001232"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.905489" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.905247" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.906043" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.905706" elapsed="0.000378"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.906528" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.906269" elapsed="0.000300"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.907171" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位符号标记价格_无效交易对 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:16.906747" elapsed="0.000466"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.907599" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位符号标记价格_无效交易对 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:16.907354" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.907931" level="INFO">🧪 测试过程: 获取期货U本位符号标记价格_无效交易对 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:16.907774" elapsed="0.000216"/>
</kw>
<arg>获取期货U本位符号标记价格_无效交易对</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:16.901899" elapsed="0.006165"/>
</kw>
<doc>验证期货U本位标记价格接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:16.745581" elapsed="0.162712"/>
</test>
<test id="s1-s2-s2-s5-t4" name="获取期货U本位符号标记价格_缺少参数" line="85">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:16.913124" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:16.912305" elapsed="0.000851"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:16.913949" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:16.913367" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:16.913335" elapsed="0.000717"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:16.914097" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T18:04:16.914336" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:16.911404" elapsed="0.002960"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:17.065830" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price 
 path_url=/v1/future-u/market/public/q/symbol-mark-price 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:17.066247" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:17 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'e8502b1e2db10873304996137b0910e6', 'X-Transparent': '00-e8502b1e2db10873304996137b0910e6-b188e1050d5a6482-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.008', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f2e2f560719-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779962657041} 
 </msg>
<msg time="2026-05-28T18:04:17.066443" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:17.066845" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:16.915302" elapsed="0.151610"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:17.067147" elapsed="0.000131"/>
</return>
<msg time="2026-05-28T18:04:17.067681" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-mark-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:16.914527" elapsed="0.153212"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.069693" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<arg>HTTP状态码应为200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:17.068193" elapsed="0.001620"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:17.071112" level="INFO">${response_data} = None</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.070083" elapsed="0.001075"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:17.072243" level="INFO">${code} = 1</msg>
<var>${code}</var>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.071379" elapsed="0.000906"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:17.073322" level="INFO">${msg} = failure</msg>
<var>${msg}</var>
<arg>${response.json()}</arg>
<arg>msg</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.072485" elapsed="0.000880"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.074473" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${code}</arg>
<arg>1</arg>
<arg>业务错误码应为1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:17.073551" elapsed="0.001020"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${msg}</arg>
<arg>failure</arg>
<arg>错误消息应为failure</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:17.074777" elapsed="0.000291"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data}</arg>
<arg>${None}</arg>
<arg>错误情况下data应为null</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:17.075233" elapsed="0.000285"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.077100" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.076384" elapsed="0.000758"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.077567" elapsed="0.000750"/>
</kw>
<msg time="2026-05-28T18:04:17.078459" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:17.077339" elapsed="0.001150"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.079996" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.079729" elapsed="0.000305"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.080457" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.080191" elapsed="0.000296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.080807" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.080622" elapsed="0.000212"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.081262" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位符号标记价格_缺少参数 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.080961" elapsed="0.000332"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.081640" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位符号标记价格_缺少参数 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.081419" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.081979" level="INFO">🧪 测试过程: 获取期货U本位符号标记价格_缺少参数 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.081823" elapsed="0.000206"/>
</kw>
<arg>获取期货U本位符号标记价格_缺少参数</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:17.075854" elapsed="0.006248"/>
</kw>
<doc>验证期货U本位标记价格接口对缺少参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:16.908664" elapsed="0.173615"/>
</test>
<test id="s1-s2-s2-s5-t5" name="获取期货U本位符号标记价格_大写交易对错误" line="111">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.087418" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.086616" elapsed="0.000847"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.088307" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.087645" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:17.087608" elapsed="0.000806"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:17.088457" elapsed="0.000044"/>
</return>
<msg time="2026-05-28T18:04:17.088729" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:17.085525" elapsed="0.003231"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:17.241457" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT 
 path_url=/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:17.241887" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:17 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '8209c7679b0e3c2cc857f3e353a29090', 'X-Transparent': '00-8209c7679b0e3c2cc857f3e353a29090-91d9f19d92a1dcf4-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.014', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f2f39d00719-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779962657208} 
 </msg>
<msg time="2026-05-28T18:04:17.242264" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:17.242648" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:17.089839" elapsed="0.152878"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:17.242959" elapsed="0.000130"/>
</return>
<msg time="2026-05-28T18:04:17.243486" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:17.088984" elapsed="0.154557"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.245416" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<arg>HTTP状态码应为200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:17.243983" elapsed="0.001592"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:17.247111" level="INFO">${response_data} = None</msg>
<var>${response_data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.245884" elapsed="0.001283"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:17.248566" level="INFO">${code} = 1</msg>
<var>${code}</var>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.247435" elapsed="0.001189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:17.249969" level="INFO">${msg} = failure</msg>
<var>${msg}</var>
<arg>${response.json()}</arg>
<arg>msg</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.248873" elapsed="0.001149"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.250595" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${code}</arg>
<arg>1</arg>
<arg>业务错误码应为1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:17.250266" elapsed="0.000439"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${msg}</arg>
<arg>failure</arg>
<arg>错误消息应为failure</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-05-28T18:04:17.250953" elapsed="0.000357"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${response_data}</arg>
<arg>${None}</arg>
<arg>错误情况下data应为null</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:17.251545" elapsed="0.000321"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.253669" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.252879" elapsed="0.000833"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.254628" elapsed="0.000834"/>
</kw>
<msg time="2026-05-28T18:04:17.255606" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:17.253927" elapsed="0.001717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.256062" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.255849" elapsed="0.000245"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.256515" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.256240" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.256916" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.256698" elapsed="0.000249"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.257432" level="INFO">${summary_content} = 🧪 测试过程: 获取期货U本位符号标记价格_大写交易对错误 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.257093" elapsed="0.000377"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.258448" level="INFO">${final_summary} = 🧪 测试过程: 获取期货U本位符号标记价格_大写交易对错误 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:17.257618" elapsed="0.000957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.258955" level="INFO">🧪 测试过程: 获取期货U本位符号标记价格_大写交易对错误 | 📡 请求接口: /v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.258766" elapsed="0.000249"/>
</kw>
<arg>获取期货U本位符号标记价格_大写交易对错误</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:17.252259" elapsed="0.006848"/>
</kw>
<doc>验证期货U本位标记价格接口对大写交易对的处理（应返回错误）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:17.082606" elapsed="0.176723"/>
</test>
<doc>期货U本位单个交易对标记价格接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:15.976587" elapsed="1.283265"/>
</suite>
<suite id="s1-s2-s2-s6" name="Future U Ticker" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_ticker.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.266607" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:17.266395" elapsed="0.000243"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.267103" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.266978" elapsed="0.000166"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:17.266751" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.267295" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.267207" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:17.266719" elapsed="0.000641"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.268032" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.267924" elapsed="0.000147"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.268294" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.268536" elapsed="0.000035"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.268692" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.268990" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.269128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.268130" elapsed="0.001054"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.269411" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.269543" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.269674" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.269796" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.269917" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.270038" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.270156" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.270279" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.270397" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.269213" elapsed="0.001234"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.270852" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.270571" elapsed="0.000333"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.271256" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.271021" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.271648" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.271420" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.272075" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.271845" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.272467" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.272236" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.272802" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.272602" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.273139" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.272938" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.273479" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.273274" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.273816" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:17.273612" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:17.270471" elapsed="0.003412"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:17.268115" elapsed="0.005787"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.274143" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.273990" elapsed="0.000194"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:17.274556" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:17.274281" elapsed="0.000426"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:17.267668" elapsed="0.007102"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.274950" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.274868" elapsed="0.000119"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:17.266102" elapsed="0.008933"/>
</kw>
<test id="s1-s2-s2-s6-t1" name="获取期货U本位单个Ticker数据_BTC" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.277830" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.277210" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.278456" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.277971" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:17.277952" elapsed="0.000578"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:17.278563" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T18:04:17.278757" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:17.276481" elapsed="0.002300"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:17.670134" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=btc_usdt 
 path_url=/v1/future-u/market/public/q/ticker?symbol=btc_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:17.670577" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=btc_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:17 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '879c6d71b89e8ca0b272912e2aca3938', 'X-Transparent': '00-879c6d71b89e8ca0b272912e2aca3938-a44a8460d9777f35-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.017', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f31dbf384c9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779962654406,"s":"btc_usdt","c":"73408.60","h":"78844.40","l":"72608.80","a":"253429","v":"1893929","o":"76171.40","r":"-0.0362"},"ts":1779962657641} 
 </msg>
<msg time="2026-05-28T18:04:17.670878" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:17.671283" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:17.279259" elapsed="0.392090"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:17.671611" elapsed="0.000156"/>
</return>
<msg time="2026-05-28T18:04:17.672173" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/ticker</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=btc_usdt</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:17.278914" elapsed="0.393315"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.675007" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:17.673752" elapsed="0.001407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.676804" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.675471" elapsed="0.001405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.677513" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.677188" elapsed="0.000424"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:17.672882" elapsed="0.004867"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.679130" level="INFO">Length is 9.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:17.677999" elapsed="0.001227"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.680405" level="INFO">${ticker_data} = {'t': 1779962654406, 's': 'btc_usdt', 'c': '73408.60', 'h': '78844.40', 'l': '72608.80', 'a': '253429', 'v': '1893929', 'o': '76171.40', 'r': '-0.0362'}</msg>
<var>${ticker_data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.679466" elapsed="0.000981"/>
</kw>
<kw name="验证单个Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.681389" elapsed="0.000678"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.682250" elapsed="0.000201"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.682606" elapsed="0.000196"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.682957" elapsed="0.000189"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.683308" elapsed="0.000194"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.683658" elapsed="0.000198"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.684016" elapsed="0.000202"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.684379" elapsed="0.000155"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.684655" elapsed="0.000147"/>
</kw>
<kw name="验证单个Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.685830" elapsed="0.000321"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.686284" elapsed="0.000210"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.686859" level="INFO">${timestamp_str} = 1779962654406</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:17.686638" elapsed="0.000257"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.687164" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:17.687255" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:17.687032" elapsed="0.000251"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.687408" elapsed="0.000312"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.685007" elapsed="0.002846"/>
</kw>
<kw name="验证单个Ticker交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:17.688808" elapsed="0.000148"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.689172" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:17.689059" elapsed="0.000157"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.689318" elapsed="0.000143"/>
</kw>
<kw name="Should End With" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_usdt</arg>
<doc>Fails if the string ``str1`` does not end with the string ``str2``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.689580" elapsed="0.000143"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.688038" elapsed="0.001746"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.690812" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.690602" elapsed="0.000239"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.690958" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.691367" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.691874" elapsed="0.000126"/>
</kw>
<msg time="2026-05-28T18:04:17.692084" level="INFO">${price_float} = 73408.60</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.691652" elapsed="0.000457"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.692233" elapsed="0.000277"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.689945" elapsed="0.002630"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.693530" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.693370" elapsed="0.000183"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.693647" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.693940" elapsed="0.000119"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.694345" elapsed="0.000105"/>
</kw>
<msg time="2026-05-28T18:04:17.694522" level="INFO">${price_float} = 78844.40</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.694169" elapsed="0.000375"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.694649" elapsed="0.000222"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.692728" elapsed="0.002202"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.695974" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.695809" elapsed="0.000188"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.696091" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.696392" elapsed="0.000113"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.696783" elapsed="0.000100"/>
</kw>
<msg time="2026-05-28T18:04:17.696952" level="INFO">${price_float} = 72608.80</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.696612" elapsed="0.000361"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.697076" elapsed="0.000227"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.695060" elapsed="0.002297"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.698670" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.698384" elapsed="0.000321"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.698835" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.699232" elapsed="0.000152"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.699744" elapsed="0.000133"/>
</kw>
<msg time="2026-05-28T18:04:17.699970" level="INFO">${price_float} = 76171.40</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.699521" elapsed="0.000477"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.700125" elapsed="0.000280"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.697480" elapsed="0.003003"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.701576" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.701371" elapsed="0.000234"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.701724" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.702093" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${amount}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.702536" elapsed="0.000109"/>
</kw>
<msg time="2026-05-28T18:04:17.702725" level="INFO">${amount_float} = 253429</msg>
<var>${amount_float}</var>
<arg>'${amount_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${amount}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${amount}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.702345" elapsed="0.000403"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${amount_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.702854" elapsed="0.000233"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.700666" elapsed="0.002477"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.704010" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.703839" elapsed="0.000194"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.704127" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.704424" elapsed="0.000120"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${amount}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.704832" elapsed="0.000127"/>
</kw>
<msg time="2026-05-28T18:04:17.705043" level="INFO">${amount_float} = 1893929</msg>
<var>${amount_float}</var>
<arg>'${amount_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${amount}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${amount}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.704652" elapsed="0.000416"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${amount_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.705178" elapsed="0.000231"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.703278" elapsed="0.002189"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.706322" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.706153" elapsed="0.000193"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.706441" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.706710" elapsed="0.000119"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${rate}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.707120" elapsed="0.000109"/>
</kw>
<msg time="2026-05-28T18:04:17.707299" level="INFO">${rate_float} = -0.0362</msg>
<var>${rate_float}</var>
<arg>'${rate_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${rate}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${rate}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.706943" elapsed="0.000378"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${rate_float} &gt;= -1 and ${rate_float} &lt;= 1</arg>
<arg>涨跌幅应该在-1到1之间</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.707467" elapsed="0.000246"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.705596" elapsed="0.002173"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.680898" elapsed="0.026919"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${ticker_data['s']}</arg>
<arg>btc_usdt</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:17.707921" elapsed="0.000485"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（BTC交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:17.275095" elapsed="0.433450"/>
</test>
<test id="s1-s2-s2-s6-t2" name="获取期货U本位单个Ticker数据_ETH" line="30">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.711398" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.710831" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.711959" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.711533" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:17.711512" elapsed="0.000519"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:17.712060" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T18:04:17.712221" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:17.710118" elapsed="0.002124"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:17.914789" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=eth_usdt 
 path_url=/v1/future-u/market/public/q/ticker?symbol=eth_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:17.915149" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=eth_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:17 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'f68e96c3fafcb6571236a29fc3f7d83d', 'X-Transparent': '00-f68e96c3fafcb6571236a29fc3f7d83d-9d160c353d7ef73a-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f336d1584c9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1771066847342,"s":"eth_usdt","c":"2076.94","h":"2090.30","l":"1945.28","a":"26772406","v":"543280201","o":"1953.68","r":"0.0630"},"ts":1779962657886} 
 </msg>
<msg time="2026-05-28T18:04:17.915314" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:17.915677" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:17.712799" elapsed="0.202938"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:17.915945" elapsed="0.000110"/>
</return>
<msg time="2026-05-28T18:04:17.916417" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/ticker</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=eth_usdt</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:17.712357" elapsed="0.204121"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.919220" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:17.917957" elapsed="0.001419"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.920612" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.919670" elapsed="0.000968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.920888" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:17.920756" elapsed="0.000169"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:17.917028" elapsed="0.004026"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.921624" level="INFO">Length is 9.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:17.921162" elapsed="0.000502"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.922207" level="INFO">${ticker_data} = {'t': 1771066847342, 's': 'eth_usdt', 'c': '2076.94', 'h': '2090.30', 'l': '1945.28', 'a': '26772406', 'v': '543280201', 'o': '1953.68', 'r': '0.0630'}</msg>
<var>${ticker_data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.921761" elapsed="0.000474"/>
</kw>
<kw name="验证单个Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.922762" elapsed="0.000119"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.922972" elapsed="0.000106"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.923255" elapsed="0.000146"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.923482" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.923654" elapsed="0.000096"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.923830" elapsed="0.000099"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.924005" elapsed="0.000220"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.924432" elapsed="0.000247"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.924833" elapsed="0.000180"/>
</kw>
<kw name="验证单个Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.926027" elapsed="0.000185"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.926294" elapsed="0.000146"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.926683" level="INFO">${timestamp_str} = 1771066847342</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:17.926530" elapsed="0.000174"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.926871" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:17.926926" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:17.926790" elapsed="0.000156"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.927023" elapsed="0.002459"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.925253" elapsed="0.004337"/>
</kw>
<kw name="验证单个Ticker交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:17.930328" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.930608" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:17.930513" elapsed="0.000128"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:17.930717" elapsed="0.000098"/>
</kw>
<kw name="Should End With" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_usdt</arg>
<doc>Fails if the string ``str1`` does not end with the string ``str2``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.930892" elapsed="0.000101"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.929763" elapsed="0.001275"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.932174" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.931934" elapsed="0.000272"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.932330" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.932738" elapsed="0.000173"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.933304" elapsed="0.000130"/>
</kw>
<msg time="2026-05-28T18:04:17.933521" level="INFO">${price_float} = 2076.94</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.933058" elapsed="0.000488"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.933664" elapsed="0.000267"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.931181" elapsed="0.002815"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.935135" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.934943" elapsed="0.000220"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.935273" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.935594" elapsed="0.000127"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.936035" elapsed="0.000115"/>
</kw>
<msg time="2026-05-28T18:04:17.936230" level="INFO">${price_float} = 2090.30</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.935842" elapsed="0.000412"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.936378" elapsed="0.000246"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.934276" elapsed="0.002411"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.937606" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.937448" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.937722" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.937999" elapsed="0.000107"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.938375" elapsed="0.000099"/>
</kw>
<msg time="2026-05-28T18:04:17.938542" level="INFO">${price_float} = 1945.28</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.938211" elapsed="0.000352"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.938665" elapsed="0.000212"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.936828" elapsed="0.002100"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.939758" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.939604" elapsed="0.000177"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.939871" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.940146" elapsed="0.000107"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.940520" elapsed="0.000098"/>
</kw>
<msg time="2026-05-28T18:04:17.940687" level="INFO">${price_float} = 1953.68</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.940355" elapsed="0.000353"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.940810" elapsed="0.000213"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.939049" elapsed="0.002027"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.942365" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.942085" elapsed="0.000316"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.942519" elapsed="0.000361"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.942995" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${amount}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.943440" elapsed="0.000111"/>
</kw>
<msg time="2026-05-28T18:04:17.943632" level="INFO">${amount_float} = 26772406</msg>
<var>${amount_float}</var>
<arg>'${amount_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${amount}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${amount}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.943247" elapsed="0.000466"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${amount_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.943841" elapsed="0.000283"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.941206" elapsed="0.002993"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.945291" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.945082" elapsed="0.000238"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.945439" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.945793" elapsed="0.000147"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${amount}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.946287" elapsed="0.000130"/>
</kw>
<msg time="2026-05-28T18:04:17.946509" level="INFO">${amount_float} = 543280201</msg>
<var>${amount_float}</var>
<arg>'${amount_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${amount}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${amount}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.946069" elapsed="0.000466"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${amount_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.946662" elapsed="0.000268"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.944385" elapsed="0.002612"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.948005" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:17.947796" elapsed="0.000238"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.948145" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.948466" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${rate}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:17.948963" elapsed="0.000126"/>
</kw>
<msg time="2026-05-28T18:04:17.949179" level="INFO">${rate_float} = 0.0630</msg>
<var>${rate_float}</var>
<arg>'${rate_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${rate}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${rate}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.948743" elapsed="0.000462"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${rate_float} &gt;= -1 and ${rate_float} &lt;= 1</arg>
<arg>涨跌幅应该在-1到1之间</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:17.949332" elapsed="0.000298"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.947148" elapsed="0.002548"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:17.922491" elapsed="0.027262"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${ticker_data['s']}</arg>
<arg>eth_usdt</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:17.949878" elapsed="0.000515"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（ETH交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:17.708756" elapsed="0.241770"/>
</test>
<test id="s1-s2-s2-s6-t3" name="获取期货U本位单个Ticker数据_SOL" line="53">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:17.953404" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:17.952784" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:17.954050" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:17.953566" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:17.953543" elapsed="0.000584"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:17.954161" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T18:04:17.954348" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:17.952097" elapsed="0.002277"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:18.110566" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=sol_usdt 
 path_url=/v1/future-u/market/public/q/ticker?symbol=sol_usdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:18.110963" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=sol_usdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:18 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '226703090124c78bd8acb321add1922c', 'X-Transparent': '00-226703090124c78bd8acb321add1922c-6476afc815dacf6b-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f34adf684c9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779174073714,"s":"sol_usdt","c":"85.15","h":"85.16","l":"85.13","a":"45","v":"383","o":"85.13","r":"0.0002"},"ts":1779962658081} 
 </msg>
<msg time="2026-05-28T18:04:18.111135" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:18.111493" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:17.954833" elapsed="0.156728"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:18.111767" elapsed="0.000115"/>
</return>
<msg time="2026-05-28T18:04:18.112250" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/ticker</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=sol_usdt</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:17.954526" elapsed="0.157781"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.114837" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:18.113636" elapsed="0.001339"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.116314" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.115259" elapsed="0.001110"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.116930" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:18.116630" elapsed="0.000396"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:18.112812" elapsed="0.004340"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.118420" level="INFO">Length is 9.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:18.117392" elapsed="0.001127"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.119582" level="INFO">${ticker_data} = {'t': 1779174073714, 's': 'sol_usdt', 'c': '85.15', 'h': '85.16', 'l': '85.13', 'a': '45', 'v': '383', 'o': '85.13', 'r': '0.0002'}</msg>
<var>${ticker_data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.118766" elapsed="0.000860"/>
</kw>
<kw name="验证单个Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.121087" elapsed="0.000229"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.121492" elapsed="0.000194"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.121851" elapsed="0.000189"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.122196" elapsed="0.000188"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.122541" elapsed="0.000189"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.122886" elapsed="0.000189"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.123243" elapsed="0.000157"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.123530" elapsed="0.000152"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.123807" elapsed="0.000149"/>
</kw>
<kw name="验证单个Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.124953" elapsed="0.000299"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.125382" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.126034" level="INFO">${timestamp_str} = 1779174073714</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.125810" elapsed="0.000257"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.126343" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:18.126432" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:18.126203" elapsed="0.000258"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.126592" elapsed="0.000303"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.124162" elapsed="0.002813"/>
</kw>
<kw name="验证单个Ticker交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.127832" elapsed="0.000148"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.128205" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:18.128082" elapsed="0.000171"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.128361" elapsed="0.000149"/>
</kw>
<kw name="Should End With" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_usdt</arg>
<doc>Fails if the string ``str1`` does not end with the string ``str2``.</doc>
<status status="PASS" start="2026-05-28T18:04:18.128622" elapsed="0.000154"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.127156" elapsed="0.001680"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.129889" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.129693" elapsed="0.000223"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.130027" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.130401" elapsed="0.000154"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.130916" elapsed="0.000128"/>
</kw>
<msg time="2026-05-28T18:04:18.131127" level="INFO">${price_float} = 85.15</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.130694" elapsed="0.000457"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.131275" elapsed="0.000260"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.128997" elapsed="0.002600"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.132491" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.132327" elapsed="0.000188"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.132612" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.132917" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.133343" elapsed="0.000251"/>
</kw>
<msg time="2026-05-28T18:04:18.133667" level="INFO">${price_float} = 85.16</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.133146" elapsed="0.000543"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.133794" elapsed="0.000225"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.131731" elapsed="0.002345"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.134933" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.134773" elapsed="0.000187"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.135057" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.135351" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.136009" elapsed="0.000143"/>
</kw>
<msg time="2026-05-28T18:04:18.136283" level="INFO">${price_float} = 85.13</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.135773" elapsed="0.000538"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.136443" elapsed="0.000293"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.134203" elapsed="0.002609"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.137890" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.137685" elapsed="0.000234"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.138034" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.138383" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.138897" elapsed="0.000145"/>
</kw>
<msg time="2026-05-28T18:04:18.139132" level="INFO">${price_float} = 85.13</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.138670" elapsed="0.000490"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.139294" elapsed="0.000280"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.136980" elapsed="0.002663"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.140684" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.140472" elapsed="0.000240"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.140833" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.141196" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${amount}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.141685" elapsed="0.000135"/>
</kw>
<msg time="2026-05-28T18:04:18.141910" level="INFO">${amount_float} = 45</msg>
<var>${amount_float}</var>
<arg>'${amount_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${amount}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${amount}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.141469" elapsed="0.000469"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${amount_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.142068" elapsed="0.000277"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.139797" elapsed="0.002613"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.143432" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.143221" elapsed="0.000240"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.143573" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.143921" elapsed="0.000121"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${amount}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.144327" elapsed="0.000121"/>
</kw>
<msg time="2026-05-28T18:04:18.144523" level="INFO">${amount_float} = 383</msg>
<var>${amount_float}</var>
<arg>'${amount_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${amount}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${amount}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.144150" elapsed="0.000395"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${amount_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.144651" elapsed="0.000223"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.142559" elapsed="0.002369"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.145763" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.145589" elapsed="0.000199"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.145886" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.146179" elapsed="0.000121"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${rate}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.146591" elapsed="0.000111"/>
</kw>
<msg time="2026-05-28T18:04:18.146774" level="INFO">${rate_float} = 0.0002</msg>
<var>${rate_float}</var>
<arg>'${rate_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${rate}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${rate}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.146411" elapsed="0.000384"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${rate_float} &gt;= -1 and ${rate_float} &lt;= 1</arg>
<arg>涨跌幅应该在-1到1之间</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.146902" elapsed="0.000239"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.145054" elapsed="0.002145"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.120067" elapsed="0.027180"/>
</kw>
<kw name="Should Be Equal" owner="BuiltIn">
<arg>${ticker_data['s']}</arg>
<arg>sol_usdt</arg>
<doc>Fails if the given objects are unequal.</doc>
<status status="PASS" start="2026-05-28T18:04:18.147351" elapsed="0.000470"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（SOL交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:17.950736" elapsed="0.197199"/>
</test>
<test id="s1-s2-s2-s6-t4" name="获取期货U本位单个Ticker数据_无效交易对" line="76">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.150770" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:18.150229" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.151310" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:18.150897" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:18.150880" elapsed="0.000500"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:18.151412" elapsed="0.000024"/>
</return>
<msg time="2026-05-28T18:04:18.151569" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:18.149510" elapsed="0.002079"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:18.304896" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=invalid_symbol 
 path_url=/v1/future-u/market/public/q/ticker?symbol=invalid_symbol 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:18.305328" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker?symbol=invalid_symbol 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:18 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'cb98598dd24cac69e9330d57de45995f', 'X-Transparent': '00-cb98598dd24cac69e9330d57de45995f-a8c5bc3265658cdc-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f35ef0e84c9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779962658276} 
 </msg>
<msg time="2026-05-28T18:04:18.305536" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:18.305966" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:18.151988" elapsed="0.154046"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:18.306266" elapsed="0.000141"/>
</return>
<msg time="2026-05-28T18:04:18.306783" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/ticker</arg>
<arg>headers=${headers}</arg>
<arg>params=symbol=invalid_symbol</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:18.151699" elapsed="0.155139"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.308764" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:18.307293" elapsed="0.001618"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.309202" elapsed="0.001204"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.json()}</arg>
<arg>msg</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.310695" elapsed="0.001121"/>
</kw>
<doc>验证期货U本位单个Ticker接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:18.148101" elapsed="0.164047"/>
</test>
<test id="s1-s2-s2-s6-t5" name="获取期货U本位单个Ticker数据_缺少参数" line="93">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.318723" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:18.317706" elapsed="0.001060"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.319720" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:18.318990" elapsed="0.000811"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:18.318948" elapsed="0.000894"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:18.319893" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T18:04:18.320161" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:18.316342" elapsed="0.003854"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:18.474135" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker 
 path_url=/v1/future-u/market/public/q/ticker 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:18.474498" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:18 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '227fe4cb53eb881acbb9dc74fef4c898', 'X-Transparent': '00-227fe4cb53eb881acbb9dc74fef4c898-c493b534eadfb98a-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f36ffd684c9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779962658447} 
 </msg>
<msg time="2026-05-28T18:04:18.474672" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:18.475035" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:18.321356" elapsed="0.153744"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:18.475333" elapsed="0.000113"/>
</return>
<msg time="2026-05-28T18:04:18.475796" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/ticker</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:18.320400" elapsed="0.155451"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.477560" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:18.476263" elapsed="0.001430"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.477966" elapsed="0.001159"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.json()}</arg>
<arg>msg</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.479370" elapsed="0.001035"/>
</kw>
<doc>验证期货U本位单个Ticker接口对缺少symbol参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:18.312662" elapsed="0.168087"/>
</test>
<doc>期货U本位单个Ticker接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:17.261534" elapsed="1.220049"/>
</suite>
<suite id="s1-s2-s2-s7" name="Future U Tickers" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_tickers.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.491738" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:18.491459" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.492324" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:18.492181" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:18.491908" elapsed="0.000504"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.492557" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:18.492447" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:18.491868" elapsed="0.000766"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.493418" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:18.493296" elapsed="0.000168"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.493710" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.493841" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.493965" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494089" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494212" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:18.493529" elapsed="0.000736"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494444" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494568" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494703" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494829" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.494951" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.495082" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.495206" elapsed="0.000027"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.495329" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.495451" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:18.494290" elapsed="0.001215"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.495892" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.495620" elapsed="0.000315"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.496264" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.496043" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.496598" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.496405" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.496930" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.496730" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.497262" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.497062" elapsed="0.000252"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.497610" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.497411" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.497950" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.497739" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.498356" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.498146" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.498717" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:18.498488" elapsed="0.000262"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:18.495530" elapsed="0.003251"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:18.493512" elapsed="0.005289"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.499033" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:18.498890" elapsed="0.000181"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:18.499537" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:18.499182" elapsed="0.000599"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:18.493008" elapsed="0.006842"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.500023" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:18.499947" elapsed="0.000114"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:18.491086" elapsed="0.009027"/>
</kw>
<test id="s1-s2-s2-s7-t1" name="获取期货U本位Tickers数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.502820" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:18.502051" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:18.503470" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:18.502966" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:18.502951" elapsed="0.000591"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:18.503576" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T18:04:18.503760" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:18.501342" elapsed="0.002440"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:18.950932" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true 
 path_url=/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:18.951190" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:18 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '34a513ba1a87ff073489a7252aaf82cd', 'X-Transparent': '00-34a513ba1a87ff073489a7252aaf82cd-04a37fe33476ee1f-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f39ffb709d4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779962656831,"s":"btc_usdt","c":"73894.70","h":"78844.40","l":"72608.80","a":"253436","v":"1893981","o":"76171.40","r":"-0.0298"},{"t":1771066847342,"s":"eth_usdt","c":"2076.94","h":"2090.30","l":"1945.28","a":"26772406","v":"543280201","o":"1953.68","r":"0.0630"},{"t":1779174073714,"s":"sol_usdt","c":"85.15","h":"85.16","l":"85.13","a":"45","v":"383","o":"85.13","r":"0.0002"},{"t":1779962657986,"s":"doge_usdt","c":"0.09866","h":"0.10363","l":"0.09707","a":"6759633","v":"6792614","o":"0.10175","r":"-0.0303"}],"ts":1779962658920} 
 </msg>
<msg time="2026-05-28T18:04:18.951347" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:18.951655" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:18.504238" elapsed="0.447452"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:18.951922" elapsed="0.000099"/>
</return>
<msg time="2026-05-28T18:04:18.952261" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/tickers</arg>
<arg>headers=${headers}</arg>
<arg>params=isPredict=true&amp;isDelivery=true</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:18.503919" elapsed="0.448370"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.954396" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:18.953199" elapsed="0.001335"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.955276" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.954783" elapsed="0.000519"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.955547" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:18.955417" elapsed="0.000169"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:18.952663" elapsed="0.003010"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.956262" level="INFO">Length is 4.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:18.955782" elapsed="0.000524"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.956853" level="INFO">${tickers_list} = [{'t': 1779962656831, 's': 'btc_usdt', 'c': '73894.70', 'h': '78844.40', 'l': '72608.80', 'a': '253436', 'v': '1893981', 'o': '76171.40', 'r': '-0.0298'}, {'t': 1771066847342, 's': 'eth_usdt', 'c': '2...</msg>
<var>${tickers_list}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:18.956407" elapsed="0.000474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.958283" elapsed="0.000299"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.958797" elapsed="0.000262"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.959270" elapsed="0.000142"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.959519" elapsed="0.000134"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.959763" elapsed="0.000139"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.960008" elapsed="0.000141"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.960255" elapsed="0.000131"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.960493" elapsed="0.000133"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.960732" elapsed="0.000132"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.962098" elapsed="0.000354"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.962616" elapsed="0.000254"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.963303" level="INFO">${timestamp_str} = 1779962656831</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.963037" elapsed="0.000307"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.963589" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:18.963946" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:18.963475" elapsed="0.000498"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.964081" elapsed="0.000257"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.961101" elapsed="0.003298"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.965217" elapsed="0.000150"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.965626" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:18.965491" elapsed="0.000185"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.965797" elapsed="0.000149"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.964546" elapsed="0.001466"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.967190" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.966956" elapsed="0.000266"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.967347" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.967806" elapsed="0.000161"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.966171" elapsed="0.001866"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.969011" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.968829" elapsed="0.000208"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.969149" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.969476" elapsed="0.000128"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.968173" elapsed="0.001508"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.970636" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.970446" elapsed="0.000216"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.970769" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.971097" elapsed="0.000130"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.969811" elapsed="0.001481"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.972225" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.972058" elapsed="0.000189"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.972341" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.972627" elapsed="0.000109"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.971422" elapsed="0.001376"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.973681" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.973506" elapsed="0.000200"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.973799" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.974091" elapsed="0.000115"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.972923" elapsed="0.001347"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.975176" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.975007" elapsed="0.000192"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.975296" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.975586" elapsed="0.000109"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.974387" elapsed="0.001362"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.976745" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.976554" elapsed="0.000218"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.976869" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.977136" elapsed="0.000107"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.975918" elapsed="0.001379"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.957687" elapsed="0.019656"/>
</kw>
<var name="${ticker}">{'t': 1779962656831, 's': 'btc_usdt', 'c': '73894.70', 'h': '78844.40', 'l': '72608.80', 'a': '253436', 'v': '1893981', 'o': '76171.40', 'r': '-0.0298'}</var>
<status status="PASS" start="2026-05-28T18:04:18.957231" elapsed="0.020205"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.978124" elapsed="0.000114"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.978325" elapsed="0.000101"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.978507" elapsed="0.000099"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.978687" elapsed="0.000097"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.978867" elapsed="0.000096"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.979043" elapsed="0.000098"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.979220" elapsed="0.000095"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.979395" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.979570" elapsed="0.000095"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.980607" elapsed="0.000268"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.981010" elapsed="0.000200"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.981532" level="INFO">${timestamp_str} = 1771066847342</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.981332" elapsed="0.000231"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.981812" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:18.981892" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:18.981687" elapsed="0.000232"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.982033" elapsed="0.000268"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.979778" elapsed="0.002596"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.983202" elapsed="0.000148"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.983597" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:18.983465" elapsed="0.000178"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.983755" elapsed="0.000167"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.982530" elapsed="0.001462"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.984925" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.984749" elapsed="0.000200"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.985044" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.985355" elapsed="0.000127"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.984141" elapsed="0.001405"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.986399" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.986225" elapsed="0.000198"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.986522" elapsed="0.000190"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.986820" elapsed="0.000122"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.985663" elapsed="0.001338"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.987862" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.987687" elapsed="0.000199"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.987986" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.988320" elapsed="0.000121"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.987118" elapsed="0.001383"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.989375" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.989113" elapsed="0.000284"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.989484" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.989743" elapsed="0.000105"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.988616" elapsed="0.001283"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.990633" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.990488" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.990739" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.991001" elapsed="0.000104"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.990000" elapsed="0.001157"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.991873" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.991728" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.991989" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.992239" elapsed="0.000104"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.991255" elapsed="0.001139"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.993098" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.992952" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.993198" elapsed="0.000136"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.993425" elapsed="0.000102"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.992492" elapsed="0.001086"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.977703" elapsed="0.015914"/>
</kw>
<var name="${ticker}">{'t': 1771066847342, 's': 'eth_usdt', 'c': '2076.94', 'h': '2090.30', 'l': '1945.28', 'a': '26772406', 'v': '543280201', 'o': '1953.68', 'r': '0.0630'}</var>
<status status="PASS" start="2026-05-28T18:04:18.977540" elapsed="0.016101"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.994091" elapsed="0.000106"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.994281" elapsed="0.000099"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.994463" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.994645" elapsed="0.000106"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.994830" elapsed="0.000100"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.995013" elapsed="0.000099"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.995193" elapsed="0.000103"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.995376" elapsed="0.000107"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.995568" elapsed="0.000103"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.996297" elapsed="0.000144"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.996529" elapsed="0.000132"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.996881" level="INFO">${timestamp_str} = 1779174073714</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.996745" elapsed="0.000156"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.997070" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:18.997128" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:18.996983" elapsed="0.000164"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.997229" elapsed="0.000177"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.995811" elapsed="0.001642"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:18.997957" elapsed="0.000091"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.998198" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:18.998119" elapsed="0.000204"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:18.998398" elapsed="0.000096"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.997542" elapsed="0.000992"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:18.999182" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:18.999050" elapsed="0.000150"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.999274" elapsed="0.000149"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:18.999503" elapsed="0.000093"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.998620" elapsed="0.001020"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.000287" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.000155" elapsed="0.000150"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.000380" elapsed="0.000145"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.000607" elapsed="0.000092"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.999726" elapsed="0.001018"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.001393" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.001264" elapsed="0.000148"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.001483" elapsed="0.000140"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.001707" elapsed="0.000088"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.000832" elapsed="0.001010"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.002483" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.002355" elapsed="0.000147"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.002574" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.002796" elapsed="0.000093"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.001929" elapsed="0.001005"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.003576" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.003452" elapsed="0.000142"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.003665" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.003910" elapsed="0.000097"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.003021" elapsed="0.001030"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.004697" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.004561" elapsed="0.000154"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.004786" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.005007" elapsed="0.000094"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.004139" elapsed="0.001008"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.005765" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.005638" elapsed="0.000146"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.005856" elapsed="0.000120"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.006055" elapsed="0.000088"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.005233" elapsed="0.000954"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:18.993869" elapsed="0.012351"/>
</kw>
<var name="${ticker}">{'t': 1779174073714, 's': 'sol_usdt', 'c': '85.15', 'h': '85.16', 'l': '85.13', 'a': '45', 'v': '383', 'o': '85.13', 'r': '0.0002'}</var>
<status status="PASS" start="2026-05-28T18:04:18.993729" elapsed="0.012509"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.006560" elapsed="0.000083"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.006709" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.006852" elapsed="0.000081"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.006998" elapsed="0.000160"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.007227" elapsed="0.000084"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.007375" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.007520" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.007663" elapsed="0.000082"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.007808" elapsed="0.000080"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.008346" elapsed="0.000119"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.008531" elapsed="0.000101"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.008806" level="INFO">${timestamp_str} = 1779962657986</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.008700" elapsed="0.000121"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.008956" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.009001" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.008886" elapsed="0.000130"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.009079" elapsed="0.000143"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.007981" elapsed="0.001278"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.009701" elapsed="0.000081"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.009916" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.009847" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.010003" elapsed="0.000083"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.009338" elapsed="0.000803"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.010712" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.010604" elapsed="0.000123"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.010786" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.010969" elapsed="0.000074"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.010218" elapsed="0.000862"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.011602" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.011494" elapsed="0.000124"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.011676" elapsed="0.000114"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.011856" elapsed="0.000073"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.011151" elapsed="0.000815"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.012483" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.012377" elapsed="0.000121"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.012557" elapsed="0.000115"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.012738" elapsed="0.000074"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.012036" elapsed="0.000812"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.013363" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.013256" elapsed="0.000121"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.013434" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.013615" elapsed="0.000075"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.012918" elapsed="0.000808"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.014797" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.014684" elapsed="0.000128"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.014873" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.015052" elapsed="0.000069"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.013796" elapsed="0.001359"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.015642" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.015545" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.015712" elapsed="0.000108"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.015880" elapsed="0.000079"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.015223" elapsed="0.000770"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.016464" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.016367" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.016533" elapsed="0.000115"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.016710" elapsed="0.000068"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.016058" elapsed="0.000754"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.006396" elapsed="0.010442"/>
</kw>
<var name="${ticker}">{'t': 1779962657986, 's': 'doge_usdt', 'c': '0.09866', 'h': '0.10363', 'l': '0.09707', 'a': '6759633', 'v': '6792614', 'o': '0.10175', 'r': '-0.0303'}</var>
<status status="PASS" start="2026-05-28T18:04:19.006291" elapsed="0.010563"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T18:04:18.956960" elapsed="0.059908"/>
</for>
<doc>验证期货U本位Tickers接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:18.500190" elapsed="0.516743"/>
</test>
<test id="s1-s2-s2-s7-t2" name="获取期货U本位Tickers数据_仅预测" line="29">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.018600" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.018242" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.018964" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.018686" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.018674" elapsed="0.000336"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:19.019027" elapsed="0.000015"/>
</return>
<msg time="2026-05-28T18:04:19.019131" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:19.017846" elapsed="0.001299"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:19.172860" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false 
 path_url=/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:19.173265" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'd30c935d7190c44f353234c89da63c62', 'X-Transparent': '00-d30c935d7190c44f353234c89da63c62-8526c4bb72122a34-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.013', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f3b4b7409d4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779962656831,"s":"btc_usdt","c":"73894.70","h":"78844.40","l":"72608.80","a":"253436","v":"1893981","o":"76171.40","r":"-0.0298"},{"t":1771066847342,"s":"eth_usdt","c":"2076.94","h":"2090.30","l":"1945.28","a":"26772406","v":"543280201","o":"1953.68","r":"0.0630"},{"t":1779174073714,"s":"sol_usdt","c":"85.15","h":"85.16","l":"85.13","a":"45","v":"383","o":"85.13","r":"0.0002"},{"t":1779962657986,"s":"doge_usdt","c":"0.09866","h":"0.10363","l":"0.09707","a":"6759633","v":"6792614","o":"0.10175","r":"-0.0303"}],"ts":1779962659143} 
 </msg>
<msg time="2026-05-28T18:04:19.173459" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:19.173907" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:19.019418" elapsed="0.154567"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:19.174234" elapsed="0.000121"/>
</return>
<msg time="2026-05-28T18:04:19.174747" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/tickers</arg>
<arg>headers=${headers}</arg>
<arg>params=isPredict=true&amp;isDelivery=false</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:19.019218" elapsed="0.155587"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.177467" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:19.176261" elapsed="0.001324"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.178684" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.177885" elapsed="0.000839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.179140" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.178910" elapsed="0.000294"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:19.175404" elapsed="0.003895"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.180295" level="INFO">Length is 4.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.179483" elapsed="0.000886"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.181322" level="INFO">${tickers_list} = [{'t': 1779962656831, 's': 'btc_usdt', 'c': '73894.70', 'h': '78844.40', 'l': '72608.80', 'a': '253436', 'v': '1893981', 'o': '76171.40', 'r': '-0.0298'}, {'t': 1771066847342, 's': 'eth_usdt', 'c': '2...</msg>
<var>${tickers_list}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.180539" elapsed="0.000828"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.182496" elapsed="0.000189"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.182819" elapsed="0.000162"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.183113" elapsed="0.000156"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.183396" elapsed="0.000631"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.184164" elapsed="0.000153"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.184446" elapsed="0.000150"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.184716" elapsed="0.000154"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.185003" elapsed="0.000147"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.185275" elapsed="0.000151"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.186398" elapsed="0.000284"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.186793" elapsed="0.000175"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.187295" level="INFO">${timestamp_str} = 1779962656831</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.187099" elapsed="0.000225"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.187557" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.187634" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.187443" elapsed="0.000214"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.187768" elapsed="0.000273"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.185632" elapsed="0.002473"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.188957" elapsed="0.000144"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.189319" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.189209" elapsed="0.000157"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.189477" elapsed="0.000136"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.188261" elapsed="0.001412"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.190698" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.190508" elapsed="0.000217"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.190829" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.191189" elapsed="0.000132"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.189815" elapsed="0.001575"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.192310" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.192137" elapsed="0.000196"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.192492" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.192793" elapsed="0.000113"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.191513" elapsed="0.001454"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.193827" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.193661" elapsed="0.000189"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.193945" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.194236" elapsed="0.000114"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.193084" elapsed="0.001329"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.195556" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.195320" elapsed="0.000267"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.195710" elapsed="0.000238"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.196075" elapsed="0.000146"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.194539" elapsed="0.001756"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.197489" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.197113" elapsed="0.000406"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.197634" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.197993" elapsed="0.000145"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.196448" elapsed="0.001759"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.199210" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.199010" elapsed="0.000229"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.199349" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.199699" elapsed="0.000143"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.198343" elapsed="0.001569"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.200893" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.200688" elapsed="0.000233"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.201035" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.201354" elapsed="0.000143"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.200049" elapsed="0.001519"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.182110" elapsed="0.019513"/>
</kw>
<var name="${ticker}">{'t': 1779962656831, 's': 'btc_usdt', 'c': '73894.70', 'h': '78844.40', 'l': '72608.80', 'a': '253436', 'v': '1893981', 'o': '76171.40', 'r': '-0.0298'}</var>
<status status="PASS" start="2026-05-28T18:04:19.181780" elapsed="0.019873"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.202242" elapsed="0.000152"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.202509" elapsed="0.000137"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.202758" elapsed="0.000189"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.203063" elapsed="0.000141"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.203317" elapsed="0.000127"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.203540" elapsed="0.000121"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.203760" elapsed="0.000116"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.203977" elapsed="0.000117"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.204191" elapsed="0.000123"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.204991" elapsed="0.000176"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.205264" elapsed="0.000151"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.205678" level="INFO">${timestamp_str} = 1771066847342</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.205516" elapsed="0.000186"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.205901" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.205966" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.205798" elapsed="0.000190"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.206082" elapsed="0.000211"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.204443" elapsed="0.001905"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.206995" elapsed="0.000119"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.207309" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.207209" elapsed="0.000137"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.207428" elapsed="0.000103"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.206463" elapsed="0.001110"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.208304" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.208158" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.208405" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.208760" elapsed="0.000105"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.207669" elapsed="0.001246"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.209633" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.209483" elapsed="0.000170"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.209735" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.209983" elapsed="0.000103"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.209013" elapsed="0.001124"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.210863" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.210708" elapsed="0.000179"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.210969" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.211219" elapsed="0.000106"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.210233" elapsed="0.001145"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.212095" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.211954" elapsed="0.000180"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.212218" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.212474" elapsed="0.000102"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.211476" elapsed="0.001150"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.213339" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.213193" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.213442" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.213695" elapsed="0.000104"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.212723" elapsed="0.001126"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.214567" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.214420" elapsed="0.000168"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.214669" elapsed="0.000165"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.214936" elapsed="0.000103"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.213949" elapsed="0.001140"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.215795" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.215649" elapsed="0.000167"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.215898" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.216097" elapsed="0.000089"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.215187" elapsed="0.001043"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.201945" elapsed="0.014319"/>
</kw>
<var name="${ticker}">{'t': 1771066847342, 's': 'eth_usdt', 'c': '2076.94', 'h': '2090.30', 'l': '1945.28', 'a': '26772406', 'v': '543280201', 'o': '1953.68', 'r': '0.0630'}</var>
<status status="PASS" start="2026-05-28T18:04:19.201758" elapsed="0.014526"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.216651" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.216819" elapsed="0.000090"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.216981" elapsed="0.000092"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.217143" elapsed="0.000093"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.217308" elapsed="0.000088"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.217467" elapsed="0.000090"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.217631" elapsed="0.000092"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.217793" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.217959" elapsed="0.000179"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.218641" elapsed="0.000123"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.218841" elapsed="0.000128"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.219160" level="INFO">${timestamp_str} = 1779174073714</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.219043" elapsed="0.000135"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.219346" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.219397" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.219269" elapsed="0.000144"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.219486" elapsed="0.000160"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.218234" elapsed="0.001454"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.220177" elapsed="0.000092"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.220417" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.220342" elapsed="0.000106"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.220518" elapsed="0.000091"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.219773" elapsed="0.000874"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.221284" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.221155" elapsed="0.000148"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.221375" elapsed="0.000145"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.221599" elapsed="0.000095"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.220732" elapsed="0.001006"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.222374" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.222246" elapsed="0.000146"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.222463" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.222687" elapsed="0.000092"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.221825" elapsed="0.000999"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.223471" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.223341" elapsed="0.000149"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.223561" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.223782" elapsed="0.000094"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.222921" elapsed="0.000999"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.224524" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.224410" elapsed="0.000131"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.224604" elapsed="0.000126"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.224802" elapsed="0.000079"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.224006" elapsed="0.000916"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.225486" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.225372" elapsed="0.000130"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.225566" elapsed="0.000127"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.225764" elapsed="0.000082"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.225000" elapsed="0.000885"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.226546" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.226339" elapsed="0.000223"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.226629" elapsed="0.000130"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.226830" elapsed="0.000084"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.225962" elapsed="0.000991"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.227507" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.227391" elapsed="0.000132"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.227588" elapsed="0.000108"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.227768" elapsed="0.000082"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.227031" elapsed="0.000859"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.216462" elapsed="0.011458"/>
</kw>
<var name="${ticker}">{'t': 1779174073714, 's': 'sol_usdt', 'c': '85.15', 'h': '85.16', 'l': '85.13', 'a': '45', 'v': '383', 'o': '85.13', 'r': '0.0002'}</var>
<status status="PASS" start="2026-05-28T18:04:19.216343" elapsed="0.011595"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.228256" elapsed="0.000085"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.228407" elapsed="0.000081"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.228553" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.228698" elapsed="0.000076"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.228831" elapsed="0.000074"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.228963" elapsed="0.000070"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.229092" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.229222" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.229355" elapsed="0.000073"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.229834" elapsed="0.000101"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.229997" elapsed="0.000093"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.230248" level="INFO">${timestamp_str} = 1779962657986</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.230150" elapsed="0.000112"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.230384" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.230425" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.230320" elapsed="0.000118"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.230497" elapsed="0.000131"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.229506" elapsed="0.001156"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.231063" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.231257" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.231195" elapsed="0.000085"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.231338" elapsed="0.000075"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.230732" elapsed="0.000712"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.231966" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.231861" elapsed="0.000120"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.232040" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.232236" elapsed="0.000076"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.231514" elapsed="0.000835"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.232941" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.232761" elapsed="0.000195"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.233016" elapsed="0.000122"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.233202" elapsed="0.000076"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.232419" elapsed="0.000896"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.233826" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.233724" elapsed="0.000117"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.233899" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.234084" elapsed="0.000074"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.233386" elapsed="0.000808"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.234711" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.234605" elapsed="0.000121"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.234788" elapsed="0.000122"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.234974" elapsed="0.000075"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.234264" elapsed="0.000822"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.235605" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.235501" elapsed="0.000120"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.235680" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.235861" elapsed="0.000074"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.235157" elapsed="0.000814"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.236492" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.236382" elapsed="0.000125"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.236566" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.236746" elapsed="0.000074"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.236041" elapsed="0.000814"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.237358" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.237253" elapsed="0.000120"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.237432" elapsed="0.000093"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.237583" elapsed="0.000067"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.236926" elapsed="0.000757"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.228093" elapsed="0.009615"/>
</kw>
<var name="${ticker}">{'t': 1779962657986, 's': 'doge_usdt', 'c': '0.09866', 'h': '0.10363', 'l': '0.09707', 'a': '6759633', 'v': '6792614', 'o': '0.10175', 'r': '-0.0303'}</var>
<status status="PASS" start="2026-05-28T18:04:19.227990" elapsed="0.009749"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T18:04:19.181494" elapsed="0.056260"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅预测交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:19.017037" elapsed="0.220780"/>
</test>
<test id="s1-s2-s2-s7-t3" name="获取期货U本位Tickers数据_仅交割" line="51">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.239557" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.239197" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.239915" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.239642" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.239630" elapsed="0.000331"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:19.239978" elapsed="0.000015"/>
</return>
<msg time="2026-05-28T18:04:19.240081" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:19.238787" elapsed="0.001308"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:19.380575" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true 
 path_url=/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:19.380949" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '384f8959b20eda7d2c532501319b0ae8', 'X-Transparent': '00-384f8959b20eda7d2c532501319b0ae8-dacb12b209c5aa19-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f3cae8d09d4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779962656831,"s":"btc_usdt","c":"73894.70","h":"78844.40","l":"72608.80","a":"253436","v":"1893981","o":"76171.40","r":"-0.0298"},{"t":1771066847342,"s":"eth_usdt","c":"2076.94","h":"2090.30","l":"1945.28","a":"26772406","v":"543280201","o":"1953.68","r":"0.0630"},{"t":1779174073714,"s":"sol_usdt","c":"85.15","h":"85.16","l":"85.13","a":"45","v":"383","o":"85.13","r":"0.0002"},{"t":1779962657986,"s":"doge_usdt","c":"0.09866","h":"0.10363","l":"0.09707","a":"6759633","v":"6792614","o":"0.10175","r":"-0.0303"}],"ts":1779962659350} 
 </msg>
<msg time="2026-05-28T18:04:19.381119" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:19.381478" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:19.240362" elapsed="0.141176"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:19.381760" elapsed="0.000112"/>
</return>
<msg time="2026-05-28T18:04:19.382246" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/tickers</arg>
<arg>headers=${headers}</arg>
<arg>params=isPredict=false&amp;isDelivery=true</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:19.240168" elapsed="0.142132"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.385479" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:19.383679" elapsed="0.001955"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.387032" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.385923" elapsed="0.001189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.387655" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.387358" elapsed="0.000386"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:19.382842" elapsed="0.005123"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.389255" level="INFO">Length is 4.</msg>
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.388210" elapsed="0.001137"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.390607" level="INFO">${tickers_list} = [{'t': 1779962656831, 's': 'btc_usdt', 'c': '73894.70', 'h': '78844.40', 'l': '72608.80', 'a': '253436', 'v': '1893981', 'o': '76171.40', 'r': '-0.0298'}, {'t': 1771066847342, 's': 'eth_usdt', 'c': '2...</msg>
<var>${tickers_list}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.389579" elapsed="0.001086"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.391946" elapsed="0.000225"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.392345" elapsed="0.000193"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.392704" elapsed="0.000184"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.393045" elapsed="0.000190"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.393392" elapsed="0.000184"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.393731" elapsed="0.000198"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.394088" elapsed="0.000193"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.394443" elapsed="0.000194"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.394794" elapsed="0.000196"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.396020" elapsed="0.000322"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.396473" elapsed="0.000200"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.397046" level="INFO">${timestamp_str} = 1779962656831</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.396817" elapsed="0.000262"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.397340" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.397429" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.397210" elapsed="0.000246"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.397579" elapsed="0.000305"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.395218" elapsed="0.002743"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.398923" elapsed="0.000161"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.399333" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.399204" elapsed="0.000177"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.399503" elapsed="0.000136"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.398147" elapsed="0.001551"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.400679" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.400483" elapsed="0.000222"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.400813" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.401183" elapsed="0.000152"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.399845" elapsed="0.001564"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.402560" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.402207" elapsed="0.000381"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.402695" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.403021" elapsed="0.000132"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.401540" elapsed="0.001726"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.404266" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.404085" elapsed="0.000207"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.404386" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.404674" elapsed="0.000118"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.403413" elapsed="0.001439"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.405717" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.405560" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.405835" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.406118" elapsed="0.000112"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.404983" elapsed="0.001309"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.407139" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.406978" elapsed="0.000184"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.407259" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.407545" elapsed="0.000109"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.406415" elapsed="0.001303"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.408546" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.408390" elapsed="0.000179"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.408771" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.409207" elapsed="0.000149"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.407828" elapsed="0.001602"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.410471" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.410264" elapsed="0.000235"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.410615" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.410933" elapsed="0.000139"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.409582" elapsed="0.001564"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.391470" elapsed="0.019733"/>
</kw>
<var name="${ticker}">{'t': 1779962656831, 's': 'btc_usdt', 'c': '73894.70', 'h': '78844.40', 'l': '72608.80', 'a': '253436', 'v': '1893981', 'o': '76171.40', 'r': '-0.0298'}</var>
<status status="PASS" start="2026-05-28T18:04:19.391093" elapsed="0.020141"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.411822" elapsed="0.000146"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.412083" elapsed="0.000141"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.412333" elapsed="0.000143"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.412585" elapsed="0.000156"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.412859" elapsed="0.000137"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.413094" elapsed="0.000112"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.413328" elapsed="0.000118"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.413538" elapsed="0.000121"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.413752" elapsed="0.000116"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.414539" elapsed="0.000292"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.414933" elapsed="0.000154"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.415342" level="INFO">${timestamp_str} = 1771066847342</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.415186" elapsed="0.000180"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.415567" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.415635" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.415464" elapsed="0.000196"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.415754" elapsed="0.000213"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.414001" elapsed="0.002020"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.416682" elapsed="0.000120"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.416998" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.416897" elapsed="0.000139"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.417131" elapsed="0.000119"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.416138" elapsed="0.001163"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.418134" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.417964" elapsed="0.000193"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.418251" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.418545" elapsed="0.000119"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.417415" elapsed="0.001308"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.419559" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.419389" elapsed="0.000194"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.419676" elapsed="0.000185"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.419966" elapsed="0.000118"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.418835" elapsed="0.001306"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.420981" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.420813" elapsed="0.000192"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.421096" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.421385" elapsed="0.000120"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.420253" elapsed="0.001311"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.422320" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.422176" elapsed="0.000164"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.422428" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.422674" elapsed="0.000101"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.421675" elapsed="0.001169"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.423568" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.423422" elapsed="0.000167"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.423670" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.423922" elapsed="0.000104"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.422942" elapsed="0.001133"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.424803" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.424657" elapsed="0.000167"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.424905" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.425153" elapsed="0.000102"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.424172" elapsed="0.001133"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.426087" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.425851" elapsed="0.000257"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.426190" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.426418" elapsed="0.000106"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.425401" elapsed="0.001172"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.411528" elapsed="0.015084"/>
</kw>
<var name="${ticker}">{'t': 1771066847342, 's': 'eth_usdt', 'c': '2076.94', 'h': '2090.30', 'l': '1945.28', 'a': '26772406', 'v': '543280201', 'o': '1953.68', 'r': '0.0630'}</var>
<status status="PASS" start="2026-05-28T18:04:19.411339" elapsed="0.015296"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.427042" elapsed="0.000103"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.427233" elapsed="0.000099"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.427414" elapsed="0.000103"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.427597" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.427779" elapsed="0.000100"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.427960" elapsed="0.000098"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.428138" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.428318" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.428503" elapsed="0.000098"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.429167" elapsed="0.000142"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.429392" elapsed="0.000130"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.429738" level="INFO">${timestamp_str} = 1779174073714</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.429608" elapsed="0.000151"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.429931" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.429989" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.429842" elapsed="0.000164"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.430086" elapsed="0.000178"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.428713" elapsed="0.001619"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.430857" elapsed="0.000088"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.431094" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.431016" elapsed="0.000106"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.431197" elapsed="0.000092"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.430430" elapsed="0.000899"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.431962" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.431833" elapsed="0.000147"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.432051" elapsed="0.000146"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.432276" elapsed="0.000091"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.431414" elapsed="0.000997"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.433048" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.432919" elapsed="0.000147"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.433136" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.433356" elapsed="0.000090"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.432497" elapsed="0.000992"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.434208" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.434078" elapsed="0.000148"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.434297" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.434519" elapsed="0.000092"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.433576" elapsed="0.001079"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.435264" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.435145" elapsed="0.000136"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.435345" elapsed="0.000129"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.435545" elapsed="0.000083"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.434740" elapsed="0.000928"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.436233" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.436118" elapsed="0.000132"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.436313" elapsed="0.000132"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.436516" elapsed="0.000082"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.435747" elapsed="0.000898"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.437213" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.437099" elapsed="0.000130"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.437292" elapsed="0.000124"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.437488" elapsed="0.000080"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.436726" elapsed="0.000895"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.438177" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.438065" elapsed="0.000132"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.438261" elapsed="0.000110"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.438441" elapsed="0.000080"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.437703" elapsed="0.000858"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.426838" elapsed="0.011752"/>
</kw>
<var name="${ticker}">{'t': 1779174073714, 's': 'sol_usdt', 'c': '85.15', 'h': '85.16', 'l': '85.13', 'a': '45', 'v': '383', 'o': '85.13', 'r': '0.0002'}</var>
<status status="PASS" start="2026-05-28T18:04:19.426705" elapsed="0.011903"/>
</iter>
<iter>
<kw name="验证Ticker数据结构">
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>t</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.438925" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439074" elapsed="0.000082"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439223" elapsed="0.000081"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439367" elapsed="0.000082"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439511" elapsed="0.000082"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439659" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439804" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.439945" elapsed="0.000084"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.440093" elapsed="0.000080"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.440623" elapsed="0.000115"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.440804" elapsed="0.000102"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.441668" level="INFO">${timestamp_str} = 1779962657986</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.440972" elapsed="0.000713"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.441828" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:19.441873" level="INFO">${timestamp_length} = 13</msg>
<var>${timestamp_length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:19.441756" elapsed="0.000131"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.441950" elapsed="0.000142"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.440257" elapsed="0.001873"/>
</kw>
<kw name="验证交易对符号格式">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.442570" elapsed="0.000078"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.442782" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.442712" elapsed="0.000095"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:19.442870" elapsed="0.000080"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.442206" elapsed="0.000779"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.443553" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.443438" elapsed="0.000131"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.443633" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.443815" elapsed="0.000074"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.443060" elapsed="0.000866"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.444437" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.444332" elapsed="0.000135"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.444526" elapsed="0.000127"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.444718" elapsed="0.000075"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.443996" elapsed="0.000833"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.445353" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.445243" elapsed="0.000124"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.445425" elapsed="0.000114"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.445605" elapsed="0.000074"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.444898" elapsed="0.000818"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.446232" level="INFO">${price_type} = float</msg>
<var>${price_type}</var>
<arg>type(${price}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.446127" elapsed="0.000119"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.446305" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.446485" elapsed="0.000074"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.445786" elapsed="0.000810"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.447108" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.447005" elapsed="0.000118"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.447181" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.447362" elapsed="0.000075"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.446666" elapsed="0.000806"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.447968" level="INFO">${amount_type} = int</msg>
<var>${amount_type}</var>
<arg>type(${amount}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.447871" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.448037" elapsed="0.000108"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.448204" elapsed="0.000069"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.447543" elapsed="0.000763"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.448778" level="INFO">${rate_type} = float</msg>
<var>${rate_type}</var>
<arg>type(${rate}).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.448678" elapsed="0.000114"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.448846" elapsed="0.000095"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.449000" elapsed="0.000134"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.448371" elapsed="0.000797"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T18:04:19.438762" elapsed="0.010432"/>
</kw>
<var name="${ticker}">{'t': 1779962657986, 's': 'doge_usdt', 'c': '0.09866', 'h': '0.10363', 'l': '0.09707', 'a': '6759633', 'v': '6792614', 'o': '0.10175', 'r': '-0.0303'}</var>
<status status="PASS" start="2026-05-28T18:04:19.438659" elapsed="0.010550"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T18:04:19.390809" elapsed="0.058414"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅交割交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T18:04:19.237916" elapsed="0.211365"/>
</test>
<doc>期货U本位Tickers接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:18.484119" elapsed="0.965312"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:11.820478" elapsed="7.629593"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:11.103315" elapsed="8.347253"/>
</suite>
<suite id="s1-s3" name="Invite" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/invite">
<suite id="s1-s3-s1" name="Profit Analysis" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/invite/profit_analysis.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.454151" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:19.454056" elapsed="0.000109"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.454359" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.454296" elapsed="0.000084"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.454206" elapsed="0.000192"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.454457" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.454409" elapsed="0.000072"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.454196" elapsed="0.000294"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.454867" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.454806" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455002" elapsed="0.000010"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455064" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455122" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455181" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455236" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.454921" elapsed="0.000339"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455345" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455401" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455457" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455511" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455566" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455621" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455675" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455730" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.455784" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.455270" elapsed="0.000536"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.455967" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.455862" elapsed="0.000125"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.456135" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.456039" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.456295" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.456205" elapsed="0.000108"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.456453" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.456362" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.456617" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.456521" elapsed="0.000113"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.456786" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.456690" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.456964" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.456866" elapsed="0.000116"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.457135" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.457035" elapsed="0.000118"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.457308" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:19.457203" elapsed="0.000123"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.455817" elapsed="0.001526"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.454912" elapsed="0.002440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.457470" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.457396" elapsed="0.000094"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:19.457668" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:19.457539" elapsed="0.000207"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:19.454684" elapsed="0.003093"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.457866" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.457825" elapsed="0.000061"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:19.453939" elapsed="0.003971"/>
</kw>
<test id="s1-s3-s1-t1" name="获取用户收益信息" line="13">
<kw name="Set Log Level" owner="BuiltIn">
<arg>INFO</arg>
<doc>Sets the log threshold to the specified level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.458511" elapsed="0.000108"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.458759" level="INFO">${access_token} = </msg>
<var>${access_token}</var>
<arg>\${ACCESS_TOKEN}</arg>
<arg>${EMPTY}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:19.458672" elapsed="0.000098"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.458908" level="INFO">${refresh_token} = </msg>
<var>${refresh_token}</var>
<arg>\${REFRESH_TOKEN}</arg>
<arg>${EMPTY}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:19.458824" elapsed="0.000096"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}' or '${refresh_token}' == '${EMPTY}'">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.459455" level="INFO">${env} = bitradex_test</msg>
<var>${env}</var>
<arg>\${TEST_ENV}</arg>
<arg>bitradex_test</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:19.459372" elapsed="0.000095"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.459605" level="INFO">${token_file} = /Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json</msg>
<var>${token_file}</var>
<arg>${EXECDIR}/.bitradex_tokens_${env}.json</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.459518" elapsed="0.000098"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T18:04:19.459850" level="FAIL">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</msg>
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-28T18:04:19.459735" elapsed="0.000151">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</status>
</kw>
<msg time="2026-05-28T18:04:19.459932" level="INFO">${token_file_exists} = False</msg>
<var>${token_file_exists}</var>
<arg>File Should Exist</arg>
<arg>${token_file}</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:19.459670" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.460123" level="INFO">${token_file} = /Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json</msg>
<var>${token_file}</var>
<arg>${TOKEN_FILE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.460052" elapsed="0.000083"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T18:04:19.460333" level="FAIL">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</msg>
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-28T18:04:19.460247" elapsed="0.000112">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</status>
</kw>
<msg time="2026-05-28T18:04:19.460399" level="INFO">${token_file_exists} = False</msg>
<var>${token_file_exists}</var>
<arg>File Should Exist</arg>
<arg>${token_file}</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:19.460185" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.459976" elapsed="0.000451"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.459968" elapsed="0.000468"/>
</if>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.460597" level="INFO">${token_file} = /Users/lihu/.bitradex_tokens.json</msg>
<var>${token_file}</var>
<arg>%{HOME}/.bitradex_tokens.json</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.460528" elapsed="0.000085"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T18:04:19.460729" level="INFO" html="true">File '&lt;a href="file:///Users/lihu/.bitradex_tokens.json"&gt;/Users/lihu/.bitradex_tokens.json&lt;/a&gt;' exists.</msg>
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-28T18:04:19.460661" elapsed="0.000090"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.460459" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.460453" elapsed="0.000331"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-28T18:04:19.460890" level="INFO" html="true">Getting file '&lt;a href="file:///Users/lihu/.bitradex_tokens.json"&gt;/Users/lihu/.bitradex_tokens.json&lt;/a&gt;'.</msg>
<msg time="2026-05-28T18:04:19.462094" level="INFO">${token_text} = {
  "accessToken": "eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3V...</msg>
<var>${token_text}</var>
<arg>${token_file}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-28T18:04:19.460828" elapsed="0.001279"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.462286" level="INFO">${token_json} = {'accessToken': 'eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudE...</msg>
<var>${token_json}</var>
<arg>json.loads($token_text)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.462157" elapsed="0.000142"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:19.462655" level="INFO">${access_token} = eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInV...</msg>
<var>${access_token}</var>
<arg>${token_json}</arg>
<arg>accessToken</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.462574" elapsed="0.000093"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.462331" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.462323" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="'${refresh_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:19.463107" level="INFO">${refresh_token} = eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJyZWZyZXNoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSI...</msg>
<var>${refresh_token}</var>
<arg>${token_json}</arg>
<arg>refreshToken</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.462961" elapsed="0.000158"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.462718" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.462711" elapsed="0.000436"/>
</if>
<status status="PASS" start="2026-05-28T18:04:19.458953" elapsed="0.004204"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.458945" elapsed="0.004220"/>
</if>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.463260" level="INFO">Length is 543.</msg>
<arg>${access_token}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.463206" elapsed="0.000073"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.463378" level="INFO">Length is 547.</msg>
<arg>${refresh_token}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:19.463324" elapsed="0.000073"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${access_token}' == 'REPLACE_ME'</arg>
<arg>Fail</arg>
<arg>accessToken 未配置，请修改 ${TOKEN_FILE} 中的 accessToken</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.463447" elapsed="0.000065"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${refresh_token}' == 'REPLACE_ME'</arg>
<arg>Fail</arg>
<arg>refreshToken 未配置，请修改 ${TOKEN_FILE} 中的 refreshToken</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:19.463565" elapsed="0.000061"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.463744" level="INFO">${user_id} = </msg>
<var>${user_id}</var>
<arg>${USER_ID}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.463676" elapsed="0.000079"/>
</kw>
<if>
<branch type="IF" condition="'${user_id}' == '${EMPTY}'">
<kw name="Split String" owner="String">
<msg time="2026-05-28T18:04:19.464107" level="INFO">${parts} = ['eyJhbGciOiJSUzI1NiJ9', 'eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMS...</msg>
<var>${parts}</var>
<arg>${access_token}</arg>
<arg>.</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.464025" elapsed="0.000095"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.464423" level="INFO">${payload_b64} = eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFA...</msg>
<var>${payload_b64}</var>
<arg>${parts[1]}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.464169" elapsed="0.000267"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.464693" level="INFO">${payload} = {'accountId': '58661579376', 'sub': 'bx001@yopmail.net', 'scope': 'auth', 'lastAuthTime': 1776349146309, 'signType': 'UP', 'accountLevel': '1', 'userName': 'bx001@yopmail.net', 'exp': 1778941146, 'dev...</msg>
<var>${payload}</var>
<arg>__import__('json').loads(__import__('base64').urlsafe_b64decode(($payload_b64 + '=' * (-len($payload_b64) % 4)).encode('utf-8')).decode('utf-8'))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:19.464485" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${payload}</arg>
<arg>userId</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.464820" elapsed="0.000066"/>
</kw>
<msg time="2026-05-28T18:04:19.464924" level="INFO">${has_user_id} = True</msg>
<var>${has_user_id}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${payload}</arg>
<arg>userId</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:19.464757" elapsed="0.000178"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.465266" level="INFO">${user_id} = 58661579376</msg>
<var>${user_id}</var>
<arg>${payload['userId']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.465027" elapsed="0.000251"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.464966" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${user_id}</var>
<arg>${payload['accountId']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.465349" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.465304" elapsed="0.000068"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.464959" elapsed="0.000421"/>
</if>
<status status="PASS" start="2026-05-28T18:04:19.463785" elapsed="0.001605"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.463778" elapsed="0.001633"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.465532" level="INFO">${user_id} = 58661579376</msg>
<var>${user_id}</var>
<arg>${user_id}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:19.465453" elapsed="0.000091"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.465703" level="INFO">&amp;{params} = { user-id=58661579376 }</msg>
<var>&amp;{params}</var>
<arg>user-id=${user_id}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.465595" elapsed="0.000121"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.466301" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.7(7051);iPhone | app-version-name=1.2.7 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7051 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.466004" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.466615" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.466369" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.466361" elapsed="0.000389"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:19.466766" elapsed="0.000012"/>
</return>
<msg time="2026-05-28T18:04:19.466857" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.7(7051);iPhone', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<arg>app_version=1.2.7</arg>
<arg>build_code=7051</arg>
<arg>token=${access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:19.465802" elapsed="0.001067"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>uid=${user_id}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.466920" elapsed="0.000081"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:19.866533" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/invite/public/user-team/profit/user?user-id=58661579376 
 path_url=/v1/invite/public/user-team/profit/user?user-id=58661579376 
 headers={'user-agent': 'BitradeX-Test 1.2.7(7051);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7051', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com', 'authorization': 'Bearer eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.KasfzVllhRMOWJ898b1ynWHBLpJZulHCGZuOqdTXBC65cya1UuG8BuoRXAECLO-qZO2pM0Ce5uPRSPqNaLdhu7qPfF0zIzRGGJi81cSMj9R1VNEctARZH55L8TttgYW66o0KP3kIXTBVQPwFfcGSG8qtOLt3b-ohbCH3IW373FY', 'token': 'eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.KasfzVllhRMOWJ898b1ynWHBLpJZulHCGZuOqdTXBC65cya1UuG8BuoRXAECLO-qZO2pM0Ce5uPRSPqNaLdhu7qPfF0zIzRGGJi81cSMj9R1VNEctARZH55L8TttgYW66o0KP3kIXTBVQPwFfcGSG8qtOLt3b-ohbCH3IW373FY', 'uid': '58661579376'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:19.867004" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/invite/public/user-team/profit/user?user-id=58661579376 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '617cc3e18b683449219c73786fc8f522', 'X-Transparent': '00-617cc3e18b683449219c73786fc8f522-6138695b62fe8774-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.002', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f3fccff02d6-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":401,"msg":"登录失效，请重试","msgInfo":{"template":"Token expire."},"ts":1779962659844} 
 </msg>
<msg time="2026-05-28T18:04:19.867213" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:19.867676" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:19.467050" elapsed="0.400699"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.868922" elapsed="0.001655"/>
</kw>
<msg time="2026-05-28T18:04:19.870783" level="INFO">${has_code} = True</msg>
<var>${has_code}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:19.868419" elapsed="0.002421"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.872508" level="INFO">${biz_code} = </msg>
<var>${biz_code}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.871115" elapsed="0.001448"/>
</kw>
<if>
<branch type="IF" condition="${has_code}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.874410" level="INFO">${biz_code} = 401</msg>
<var>${biz_code}</var>
<arg>${response.json()['code']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:19.873150" elapsed="0.001314"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:19.872805" elapsed="0.001741"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.872721" elapsed="0.001901"/>
</if>
<if>
<branch type="IF" condition="${response.status_code} == 401 or '${biz_code}' == '401'">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="刷新Token并重试" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.878290" level="INFO">Token已过期，尝试使用refreshToken刷新...</msg>
<arg>Token已过期，尝试使用refreshToken刷新...</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:19.878099" elapsed="0.000274"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:19.881129" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.7(7050);iPhone | app-version-name=1.2.7 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7050 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:19.880137" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:19.882098" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:19.881356" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:19.881328" elapsed="0.000888"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:19.882269" elapsed="0.000068"/>
</return>
<msg time="2026-05-28T18:04:19.882587" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.7(7050);iPhone', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<arg>app_version=1.2.7</arg>
<arg>build_code=7050</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:19.878738" elapsed="0.003885"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:20.034222" level="INFO">POST Request : url=https://app.bitradex-test.com/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJyZWZyZXNoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.opUYcgzMB-LCny9qGTiC-KMdtCukzJwtQaHPmWXPU5LMDRQCyW1-W_1kVNDAOws2lWsbI_w3szoJ0Ail8yUZx2mp3VkdjxRzyLhvTKPmS4r6wekhKUS8JWYYKotoeJbwu7i0RS3cn-DZ5pKqKG-dsTPjwiKl1pVaKGb43GoKFqU 
 path_url=/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJyZWZyZXNoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.opUYcgzMB-LCny9qGTiC-KMdtCukzJwtQaHPmWXPU5LMDRQCyW1-W_1kVNDAOws2lWsbI_w3szoJ0Ail8yUZx2mp3VkdjxRzyLhvTKPmS4r6wekhKUS8JWYYKotoeJbwu7i0RS3cn-DZ5pKqKG-dsTPjwiKl1pVaKGb43GoKFqU 
 headers={'user-agent': 'BitradeX-Test 1.2.7(7050);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7050', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com', 'Content-Length': '4'} 
 body=b'"{}"' 
 </msg>
<msg time="2026-05-28T18:04:20.034666" level="INFO">POST Response : url=https://app.bitradex-test.com/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJyZWZyZXNoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.opUYcgzMB-LCny9qGTiC-KMdtCukzJwtQaHPmWXPU5LMDRQCyW1-W_1kVNDAOws2lWsbI_w3szoJ0Ail8yUZx2mp3VkdjxRzyLhvTKPmS4r6wekhKUS8JWYYKotoeJbwu7i0RS3cn-DZ5pKqKG-dsTPjwiKl1pVaKGb43GoKFqU 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:20 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0', 'Strict-Transport-Security': 'max-age=31536000 ; includeSubDomains', 'X-Frame-Options': 'DENY, SAMEORIGIN', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'c7c066ea67b59675549d2f5d24b365ae', 'X-Transparent': '00-c7c066ea67b59675549d2f5d24b365ae-1cec3ec010b9d04f-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.017', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f40be6502d6-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008} 
 </msg>
<msg time="2026-05-28T18:04:20.034886" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:20.035327" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>api_session</arg>
<arg>url=/v1/uaa/authorize/token/refresh?refreshToken=${refresh_token}</arg>
<arg>headers=${headers}</arg>
<arg>json={}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:19.882779" elapsed="0.152614"/>
</kw>
<if>
<branch type="IF" condition="${resp.status_code} == 200 and ${resp.json()['code']} == 0">
<kw name="Set Variable" owner="BuiltIn">
<var>${new_access_token}</var>
<arg>${resp.json()['data']['accessToken']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.038449" elapsed="0.000075"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${new_refresh_token}</var>
<arg>${resp.json()['data']['refreshToken']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.038841" elapsed="0.000050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Token刷新成功！</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.039177" elapsed="0.000045"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ACCESS_TOKEN}</arg>
<arg>${new_access_token}</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.039602" elapsed="0.000066"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${REFRESH_TOKEN}</arg>
<arg>${new_refresh_token}</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.039945" elapsed="0.000045"/>
</kw>
<kw name="获取统一请求头" owner="common">
<var>${new_headers}</var>
<arg>token=${new_access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.040608" elapsed="0.000075"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<var>${has_user_id}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${params}</arg>
<arg>user-id</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.040959" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set To Dictionary" owner="Collections">
<arg>${new_headers}</arg>
<arg>uid=${params['user-id']}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.041413" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.041190" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-05-28T18:04:20.041143" elapsed="0.000463"/>
</if>
<if>
<branch type="IF" condition="'${method}' == 'GET'">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${final_resp}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${new_headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.041950" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.041727" elapsed="0.000363"/>
</branch>
<branch type="ELSE">
<kw name="POST On Session" owner="RequestsLibrary">
<var>${final_resp}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>json=${params}</arg>
<arg>headers=${new_headers}</arg>
<doc>Sends a POST request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.042349" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.042145" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-05-28T18:04:20.041692" elapsed="0.000836"/>
</if>
<return>
<value>${final_resp}</value>
<status status="NOT RUN" start="2026-05-28T18:04:20.042611" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-05-28T18:04:20.035837" elapsed="0.006851"/>
</branch>
<branch type="ELSE">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.044267" level="FAIL">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</msg>
<arg>Token刷新失败: ${resp.text}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.042878" elapsed="0.001538">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</kw>
<status status="FAIL" start="2026-05-28T18:04:20.042725" elapsed="0.001819">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</branch>
<status status="FAIL" start="2026-05-28T18:04:20.035744" elapsed="0.008849">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</if>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${refresh_token}</arg>
<arg>params=${params}</arg>
<doc>当Token过期时，自动使用refreshToken刷新并重试请求</doc>
<status status="FAIL" start="2026-05-28T18:04:19.876829" elapsed="0.167949">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</kw>
<msg time="2026-05-28T18:04:20.045020" level="INFO">${refresh_status} = FAIL</msg>
<msg time="2026-05-28T18:04:20.045098" level="INFO">${refresh_result} = Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</msg>
<var>${refresh_status}</var>
<var>${refresh_result}</var>
<arg>刷新Token并重试</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${refresh_token}</arg>
<arg>params=${params}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-05-28T18:04:19.876072" elapsed="0.169067"/>
</kw>
<if>
<branch type="IF" condition="'${refresh_status}' == 'PASS'">
<kw name="Set Variable" owner="BuiltIn">
<var>${response}</var>
<arg>${refresh_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.045606" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.045290" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Skip" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.046242" level="SKIP">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</msg>
<arg>Token已失效且refreshToken不可用: ${refresh_result}</arg>
<doc>Skips the rest of the current test.</doc>
<status status="SKIP" start="2026-05-28T18:04:20.045880" elapsed="0.000484">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</kw>
<status status="SKIP" start="2026-05-28T18:04:20.045735" elapsed="0.000721">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</branch>
<status status="SKIP" start="2026-05-28T18:04:20.045259" elapsed="0.001240">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</if>
<status status="SKIP" start="2026-05-28T18:04:19.874752" elapsed="0.171820">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</branch>
<status status="SKIP" start="2026-05-28T18:04:19.874715" elapsed="0.171905">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</if>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.046906" elapsed="0.000122"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${env}</var>
<arg>\${TEST_ENV}</arg>
<arg>bitradex_test</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.047195" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.047361" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${resp_code}</var>
<arg>${resp_json}</arg>
<arg>code</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.047512" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'bitradex_test' and ${resp_code} == 401">
<kw name="Skip" owner="BuiltIn">
<arg>测试环境该账号暂无权限/登录态不支持该接口，返回 code=401</arg>
<doc>Skips the rest of the current test.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.047762" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.047641" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-05-28T18:04:20.047601" elapsed="0.000254"/>
</if>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.048019" elapsed="0.000029"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.048241" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.048418" elapsed="0.000023"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>uid</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.048573" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>level</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.048717" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>totalEarnings</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.048856" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>用户 ${user_id} 的总收益为: ${data['totalEarnings']}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.049004" elapsed="0.000021"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.049205" elapsed="0.000030"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取用户收益信息</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.049438" elapsed="0.000028"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="SKIP" start="2026-05-28T18:04:19.457937" elapsed="0.591782">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779962660008}</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="SKIP" start="2026-05-28T18:04:19.451636" elapsed="0.598626"/>
</suite>
<status status="SKIP" start="2026-05-28T18:04:19.450946" elapsed="0.601080"/>
</suite>
<suite id="s1-s4" name="Spot" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot">
<suite id="s1-s4-s1" name="Balance" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/balance">
<suite id="s1-s4-s1-s1" name="Balance Currencies" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/balance/balance_currencies.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.060589" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:20.060316" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.061135" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.060978" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:20.060732" elapsed="0.000496"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.061363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.061255" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:20.060706" elapsed="0.000729"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.062344" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.062205" elapsed="0.000187"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.062637" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.062774" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.062901" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063024" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063149" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.062463" elapsed="0.000737"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063393" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063576" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063704" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063828" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.063951" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.064080" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.064201" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.064322" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.064432" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.063223" elapsed="0.001251"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.064799" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.064578" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.065133" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.064936" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.065463" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.065268" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.065791" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.065599" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.066124" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.065926" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.066460" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.066259" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.066807" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.066595" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.067143" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.066940" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.067482" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.067274" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:20.064494" elapsed="0.003056"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:20.062445" elapsed="0.005124"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.067802" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.067657" elapsed="0.000185"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:20.068237" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:20.067941" elapsed="0.000490"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:20.061764" elapsed="0.006734"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.068675" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.068594" elapsed="0.000118"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:20.059862" elapsed="0.008898"/>
</kw>
<test id="s1-s4-s1-s1-t1" name="获取余额货币列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.070062" level="INFO">&amp;{params} = { version=4a2bb64c7fc890df605105b750aac8b3 }</msg>
<var>&amp;{params}</var>
<arg>version=4a2bb64c7fc890df605105b750aac8b3</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.069869" elapsed="0.000219"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.071618" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.071014" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.072288" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.071785" elapsed="0.000558"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:20.071768" elapsed="0.000596"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:20.072397" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T18:04:20.072591" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:20.070278" elapsed="0.002338"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:20.528234" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 path_url=/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:20.528627" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:20 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '9e03b91b5806360d0937145e256dab01', 'X-Transparent': '00-9e03b91b5806360d0937145e256dab01-ad6a1dbdc88cac6f-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.005', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f43dcd60959-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"time":1779958994930,"version":"71992c959c8aedc17ae5bf3a3b9c4d37","currencies":[{"id":2,"currency":"btc","displayName":"BTC","fullName":"Bitcoin","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/36594.png","cmcLink":"https://coinmarketcap.com/currencies/bitcoin/","weight":99999,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2743,"currency":"usdn","displayName":"USDN","fullName":"SMARDEX USDN","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/35672.png","cmcLink":null,"weight":99999,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":5,"currency":"eth","displayName":"ETH","fullName":"Ethereum","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png","cmcLink":"https://coinmarketcap.com/currencies/ethereum/","weight":99998,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":11,"currency":"usdt","displayName":"USDT","fullName":"Tether USDt","logo":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/usdt.png","cmcLink":"https://coinmarketcap.com/currencies/tether/","weight":99997,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":1,"plates":[]},{"id":90,"currency":"xrp","displayName":"XRP","fullName":"XRP","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/52.png","cmcLink":"https://coinmarketcap.com/currencies/xrp/","weight":99996,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2714,"currency":"seth","displayName":"SETH","fullName":"sETH","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/5765.png","cmcLink":null,"weight":1000,"maxPrecision":8,"depositStatus":1,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2739,"currency":"pengu","displayName":"PENGU","fullName":"Pudgy Penguins","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/34466.png","cmcLink":null,"weight":999,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2744,"currency":"1000usdt","displayName":"1000USDT","fullName":null,"logo":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/1000usdt.png","cmcLink":null,"weight":999,"maxPrecision":1,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":1,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2745,"currency":"btxtest","displayName":"BTXTEST","fullName":null,"logo":null,"cmcLink":null,"weight":998,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":1,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2746,"currency":"btxtest2","displayName":"BTXTEST2","fullName":null,"logo":null,"cmcLink":null,"weight":997,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2740,"currency":"raysol","displayName":"RAYSOL","fullName":null,"logo":null,"cmcLink":null,"weight":980,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":28,"currency":"pepe","displayName":"PEPE","fullName":"Pepe","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/24478.png","cmcLink":null,"weight":978,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":1,"transferEnabled":0,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":48,"currency":"floki","displayName":"FLOKI","fullName":"FLOKI","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/10804.png","cmcLink":null,"weight":959,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":1,"transferEnabled":0,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2733,"currency":"btx","displayName":"BTX","fullName":"BitradexToken","logo":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/btx.png","cmcLink":null,"weight":100,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":0,"transferEnabled":1,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2719,"currency":"matic","displayName":"MATIC","fullName":"Polygon","logo":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/3890.png","cmcLink":null,"weight":70,"maxPrecision":6,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":15,"currency":"shib","displayName":"SHIB","fullName":"Shiba Inu","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png","cmcLink":null,"weight":30,"maxPrecision":10,"depositStatus":0,"withdrawStatus":0,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":6,"currency":"etc","displayName":"ETC","fullName":"Ethereum Classic","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/1321.png","cmcLink":"https://coinmarketcap.com/currencies/ethereum-classic/","weight":1,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":7,"currency":"eos","displayName":"EOS","fullName":"EOS","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/1765.png","cmcLink":"https://coinmarketcap.com/currencies/eos/","weight":1,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":73,"currency":"trx","displayName":"TRX","fullName":"TRON","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/1958.png","cmcLink":"https://coinmarketcap.com/currencies/tron/","weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":675,"currency":"bnb","displayName":"BNB","fullName":"BNB","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png","cmcLink":"","weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2741,"currency":"kkk","displayName":"KKK","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":0,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":0,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2748,"currency":"TRNSK","displayName":"TRNSK","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":18,"depositStatus":1,"withdrawStatus":1,"convertEnabled":0,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2749,"currency":"usdc","displayName":"USDC","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":1,"isChainExist":0,"ubcardEnabled":0,"plates":[]},{"id":2750,"currency":"pol2","displayName":"POL2","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2751,"currency":"pol","displayName":"POL","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":0,"transferEnabled":0,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2752,"currency":"pol4","displayName":"POL4","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":0,"transferEnabled":0,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2753,"currency":"pol6","displayName":"POL6","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":2754,"currency":"pol7","displayName":"POL7","fullName":null,"logo":null,"cmcLink":null,"weight":1,"maxPrecision":8,"depositStatus":1,"withdrawStatus":0,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]},{"id":941,"currency":"sol","displayName":"SOL","fullName":"Solana","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/5426.png","cmcLink":"https://coinmarketcap.com/currencies/solana/","weight":1,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"ubcardEnabled":0,"plates":[]}]},"ts":1779962660498} 
 </msg>
<msg time="2026-05-28T18:04:20.529034" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:20.529386" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/balance/public/currencies</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:20.072713" elapsed="0.456737"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.531397" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:20.529951" elapsed="0.001602"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.533632" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779958994930, 'version': '71992c959c8aedc17ae5bf3a3b9c4d37', 'currencies': [{'id': 2, 'currency': 'btc', 'displayName': 'BTC', 'fullName'...</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:20.531880" elapsed="0.001817"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.533960" elapsed="0.000364"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.536877" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779958994930,
    "version": "71992c959c8aedc17ae5bf3a3b9c4d37",
    "currencies": [
      {
        "id": 2,
        "curr...</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:20.534606" elapsed="0.002331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.537610" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779958994930,
    "version": "71992c959c8aedc17ae5bf3a3b9c4d37",
    "currencies": [
      {
        "id": 2,
        "currency": "btc",
        "displayName": "BTC",
        "fullName": "Bitcoin",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/36594.png",
        "cmcLink": "https://coinmarketcap.com/currencies/bitcoin/",
        "weight": 99999,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2743,
        "currency": "usdn",
        "displayName": "USDN",
        "fullName": "SMARDEX USDN",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/35672.png",
        "cmcLink": null,
        "weight": 99999,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 5,
        "currency": "eth",
        "displayName": "ETH",
        "fullName": "Ethereum",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1027.png",
        "cmcLink": "https://coinmarketcap.com/currencies/ethereum/",
        "weight": 99998,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 11,
        "currency": "usdt",
        "displayName": "USDT",
        "fullName": "Tether USDt",
        "logo": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/usdt.png",
        "cmcLink": "https://coinmarketcap.com/currencies/tether/",
        "weight": 99997,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 1,
        "plates": []
      },
      {
        "id": 90,
        "currency": "xrp",
        "displayName": "XRP",
        "fullName": "XRP",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/52.png",
        "cmcLink": "https://coinmarketcap.com/currencies/xrp/",
        "weight": 99996,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2714,
        "currency": "seth",
        "displayName": "SETH",
        "fullName": "sETH",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/5765.png",
        "cmcLink": null,
        "weight": 1000,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2739,
        "currency": "pengu",
        "displayName": "PENGU",
        "fullName": "Pudgy Penguins",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/34466.png",
        "cmcLink": null,
        "weight": 999,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2744,
        "currency": "1000usdt",
        "displayName": "1000USDT",
        "fullName": null,
        "logo": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/1000usdt.png",
        "cmcLink": null,
        "weight": 999,
        "maxPrecision": 1,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 1,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2745,
        "currency": "btxtest",
        "displayName": "BTXTEST",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 998,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 1,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2746,
        "currency": "btxtest2",
        "displayName": "BTXTEST2",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 997,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2740,
        "currency": "raysol",
        "displayName": "RAYSOL",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 980,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 28,
        "currency": "pepe",
        "displayName": "PEPE",
        "fullName": "Pepe",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/24478.png",
        "cmcLink": null,
        "weight": 978,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 1,
        "transferEnabled": 0,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 48,
        "currency": "floki",
        "displayName": "FLOKI",
        "fullName": "FLOKI",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/10804.png",
        "cmcLink": null,
        "weight": 959,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 1,
        "transferEnabled": 0,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2733,
        "currency": "btx",
        "displayName": "BTX",
        "fullName": "BitradexToken",
        "logo": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/btx.png",
        "cmcLink": null,
        "weight": 100,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 0,
        "transferEnabled": 1,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2719,
        "currency": "matic",
        "displayName": "MATIC",
        "fullName": "Polygon",
        "logo": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/1/currency/3890.png",
        "cmcLink": null,
        "weight": 70,
        "maxPrecision": 6,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 15,
        "currency": "shib",
        "displayName": "SHIB",
        "fullName": "Shiba Inu",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png",
        "cmcLink": null,
        "weight": 30,
        "maxPrecision": 10,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 6,
        "currency": "etc",
        "displayName": "ETC",
        "fullName": "Ethereum Classic",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1321.png",
        "cmcLink": "https://coinmarketcap.com/currencies/ethereum-classic/",
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 7,
        "currency": "eos",
        "displayName": "EOS",
        "fullName": "EOS",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1765.png",
        "cmcLink": "https://coinmarketcap.com/currencies/eos/",
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 73,
        "currency": "trx",
        "displayName": "TRX",
        "fullName": "TRON",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1958.png",
        "cmcLink": "https://coinmarketcap.com/currencies/tron/",
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 675,
        "currency": "bnb",
        "displayName": "BNB",
        "fullName": "BNB",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/1839.png",
        "cmcLink": "",
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2741,
        "currency": "kkk",
        "displayName": "KKK",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 0,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2748,
        "currency": "TRNSK",
        "displayName": "TRNSK",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 18,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 0,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2749,
        "currency": "usdc",
        "displayName": "USDC",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 1,
        "isChainExist": 0,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2750,
        "currency": "pol2",
        "displayName": "POL2",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2751,
        "currency": "pol",
        "displayName": "POL",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2752,
        "currency": "pol4",
        "displayName": "POL4",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2753,
        "currency": "pol6",
        "displayName": "POL6",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 2754,
        "currency": "pol7",
        "displayName": "POL7",
        "fullName": null,
        "logo": null,
        "cmcLink": null,
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 1,
        "withdrawStatus": 0,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      },
      {
        "id": 941,
        "currency": "sol",
        "displayName": "SOL",
        "fullName": "Solana",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/5426.png",
        "cmcLink": "https://coinmarketcap.com/currencies/solana/",
        "weight": 1,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "ubcardEnabled": 0,
        "plates": []
      }
    ]
  },
  "ts": 1779962660498
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.537191" elapsed="0.000933"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:20.539851" level="INFO">${data} = {'time': 1779958994930, 'version': '71992c959c8aedc17ae5bf3a3b9c4d37', 'currencies': [{'id': 2, 'currency': 'btc', 'displayName': 'BTC', 'fullName': 'Bitcoin', 'logo': 'https://s2.coinmarketcap.com/st...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.538371" elapsed="0.001524"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.540080" elapsed="0.000925"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证货币列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.541223" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证货币字典结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($currency_dict, dict)</arg>
<arg>货币数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.542901" elapsed="0.000318"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:20.543649" level="INFO">${dict_keys} = ['currencies', 'time', 'version']</msg>
<var>${dict_keys}</var>
<arg>${currency_dict}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:20.543394" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.543992" level="INFO">货币字典包含字段: ['currencies', 'time', 'version']</msg>
<arg>货币字典包含字段: ${dict_keys}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.543822" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_dict}</arg>
<arg>currencies</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.544386" elapsed="0.000188"/>
</kw>
<msg time="2026-05-28T18:04:20.544673" level="INFO">${has_currencies} = True</msg>
<var>${has_currencies}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_dict}</arg>
<arg>currencies</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.544200" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.545275" level="FAIL">Dictionary does not contain key 'symbols'.</msg>
<arg>${currency_dict}</arg>
<arg>symbols</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.545003" elapsed="0.000418">Dictionary does not contain key 'symbols'.</status>
</kw>
<msg time="2026-05-28T18:04:20.545538" level="INFO">${has_symbols} = False</msg>
<var>${has_symbols}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_dict}</arg>
<arg>symbols</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.544846" elapsed="0.000721"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_dict}</arg>
<arg>version</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.545873" elapsed="0.000162"/>
</kw>
<msg time="2026-05-28T18:04:20.546133" level="INFO">${has_version} = True</msg>
<var>${has_version}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_dict}</arg>
<arg>version</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.545712" elapsed="0.000451"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.546660" level="FAIL">Dictionary does not contain key 'timestamp'.</msg>
<arg>${currency_dict}</arg>
<arg>timestamp</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.546462" elapsed="0.000267">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T18:04:20.546836" level="INFO">${has_timestamp} = False</msg>
<var>${has_timestamp}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_dict}</arg>
<arg>timestamp</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.546308" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.547379" level="FAIL">Dictionary does not contain key 'count'.</msg>
<arg>${currency_dict}</arg>
<arg>count</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.547181" elapsed="0.000267">Dictionary does not contain key 'count'.</status>
</kw>
<msg time="2026-05-28T18:04:20.547547" level="INFO">${has_count} = False</msg>
<var>${has_count}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_dict}</arg>
<arg>count</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.546999" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.547870" level="INFO">货币数据包含货币列表(currencies): True</msg>
<arg>货币数据包含货币列表(currencies): ${has_currencies}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.547721" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.548151" level="INFO">货币数据包含交易对(symbols): False</msg>
<arg>货币数据包含交易对(symbols): ${has_symbols}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.548031" elapsed="0.000166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.548420" level="INFO">货币数据包含版本(version): True</msg>
<arg>货币数据包含版本(version): ${has_version}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.548302" elapsed="0.000166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.548709" level="INFO">货币数据包含时间戳(timestamp): False</msg>
<arg>货币数据包含时间戳(timestamp): ${has_timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.548593" elapsed="0.000161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.548974" level="INFO">货币数据包含数量(count): False</msg>
<arg>货币数据包含数量(count): ${has_count}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.548860" elapsed="0.000158"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证货币列表结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($currency_list, list)</arg>
<arg>货币数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.550229" elapsed="0.000242"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.550777" level="INFO">Length is 29.</msg>
<msg time="2026-05-28T18:04:20.550857" level="INFO">${list_length} = 29</msg>
<var>${list_length}</var>
<arg>${currency_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:20.550645" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.551110" level="INFO">货币列表包含 29 种货币</msg>
<arg>货币列表包含 ${list_length} 种货币</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.550988" elapsed="0.000163"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证货币项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($currency_item, dict)</arg>
<arg>货币项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.552439" elapsed="0.000187"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.552853" level="INFO">货币项内容: {'id': 2, 'currency': 'btc', 'displayName': 'BTC', 'fullName': 'Bitcoin', 'logo': 'https://s2.coinmarketcap.com/static/img/coins/64x64/36594.png', 'cmcLink': 'https://coinmarketcap.com/currencies/bitcoin/', 'weight': 99999, 'maxPrecision': 8, 'depositStatus': 1, 'withdrawStatus': 1, 'convertEnabled': 1, 'transferEnabled': 1, 'isChainExist': 1, 'ubcardEnabled': 0, 'plates': []}</msg>
<arg>货币项内容: ${currency_item}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.552729" elapsed="0.000168"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_item}</arg>
<arg>currency</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.553124" elapsed="0.000131"/>
</kw>
<msg time="2026-05-28T18:04:20.553332" level="INFO">${has_currency} = True</msg>
<var>${has_currency}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>currency</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.552993" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_item}</arg>
<arg>displayName</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.553577" elapsed="0.000128"/>
</kw>
<msg time="2026-05-28T18:04:20.553788" level="INFO">${has_displayName} = True</msg>
<var>${has_displayName}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>displayName</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.553459" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_item}</arg>
<arg>fullName</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.554027" elapsed="0.000117"/>
</kw>
<msg time="2026-05-28T18:04:20.554228" level="INFO">${has_fullName} = True</msg>
<var>${has_fullName}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>fullName</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.553915" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_item}</arg>
<arg>maxPrecision</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.554471" elapsed="0.000123"/>
</kw>
<msg time="2026-05-28T18:04:20.554666" level="INFO">${has_precision} = True</msg>
<var>${has_precision}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>maxPrecision</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.554353" elapsed="0.000333"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.554916" level="INFO">${has_confirms} = False</msg>
<var>${has_confirms}</var>
<arg>${False}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:20.554788" elapsed="0.000149"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.555315" level="FAIL">Dictionary does not contain key 'contractAddress'.</msg>
<arg>${currency_item}</arg>
<arg>contractAddress</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.555157" elapsed="0.000219">Dictionary does not contain key 'contractAddress'.</status>
</kw>
<msg time="2026-05-28T18:04:20.555464" level="INFO">${has_contractAddress} = False</msg>
<var>${has_contractAddress}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>contractAddress</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.555035" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.555851" level="FAIL">Dictionary does not contain key 'withdrawFee'.</msg>
<arg>${currency_item}</arg>
<arg>withdrawFee</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.555712" elapsed="0.000194">Dictionary does not contain key 'withdrawFee'.</status>
</kw>
<msg time="2026-05-28T18:04:20.555992" level="INFO">${has_withdrawFee} = False</msg>
<var>${has_withdrawFee}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>withdrawFee</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.555590" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_item}</arg>
<arg>depositStatus</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.556431" elapsed="0.000196"/>
</kw>
<msg time="2026-05-28T18:04:20.556734" level="INFO">${has_depositStatus} = True</msg>
<var>${has_depositStatus}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>depositStatus</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.556218" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${currency_item}</arg>
<arg>withdrawStatus</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.557040" elapsed="0.000159"/>
</kw>
<msg time="2026-05-28T18:04:20.557291" level="INFO">${has_withdrawStatus} = True</msg>
<var>${has_withdrawStatus}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>withdrawStatus</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.556896" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.557827" level="FAIL">Dictionary does not contain key 'networkList'.</msg>
<arg>${currency_item}</arg>
<arg>networkList</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.557624" elapsed="0.000273">Dictionary does not contain key 'networkList'.</status>
</kw>
<msg time="2026-05-28T18:04:20.558002" level="INFO">${has_networkList} = False</msg>
<var>${has_networkList}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>networkList</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.557441" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.558672" level="FAIL">Dictionary does not contain key 'isMarginTradingAllowed'.</msg>
<arg>${currency_item}</arg>
<arg>isMarginTradingAllowed</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.558315" elapsed="0.000417">Dictionary does not contain key 'isMarginTradingAllowed'.</status>
</kw>
<msg time="2026-05-28T18:04:20.558843" level="INFO">${has_isMarginTradingAllowed} = False</msg>
<var>${has_isMarginTradingAllowed}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>isMarginTradingAllowed</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.558150" elapsed="0.000719"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.559324" level="FAIL">Dictionary does not contain key 'isDebitEnabled'.</msg>
<arg>${currency_item}</arg>
<arg>isDebitEnabled</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.559143" elapsed="0.000238">Dictionary does not contain key 'isDebitEnabled'.</status>
</kw>
<msg time="2026-05-28T18:04:20.559487" level="INFO">${has_isDebitEnabled} = False</msg>
<var>${has_isDebitEnabled}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>isDebitEnabled</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.558995" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.559968" level="FAIL">Dictionary does not contain key 'debitEnabled'.</msg>
<arg>${currency_item}</arg>
<arg>debitEnabled</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.559787" elapsed="0.000240">Dictionary does not contain key 'debitEnabled'.</status>
</kw>
<msg time="2026-05-28T18:04:20.560131" level="INFO">${has_debitEnabled} = False</msg>
<var>${has_debitEnabled}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>debitEnabled</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.559640" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.560546" level="FAIL">Dictionary does not contain key 'ipoPurchasingAllowed'.</msg>
<arg>${currency_item}</arg>
<arg>ipoPurchasingAllowed</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.560392" elapsed="0.000202">Dictionary does not contain key 'ipoPurchasingAllowed'.</status>
</kw>
<msg time="2026-05-28T18:04:20.560682" level="INFO">${has_ipoPurchasingAllowed} = False</msg>
<var>${has_ipoPurchasingAllowed}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>ipoPurchasingAllowed</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.560262" elapsed="0.000442"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.561074" level="FAIL">Dictionary does not contain key 'ipoSellingAllowed'.</msg>
<arg>${currency_item}</arg>
<arg>ipoSellingAllowed</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.560927" elapsed="0.000194">Dictionary does not contain key 'ipoSellingAllowed'.</status>
</kw>
<msg time="2026-05-28T18:04:20.561203" level="INFO">${has_ipoSellingAllowed} = False</msg>
<var>${has_ipoSellingAllowed}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>ipoSellingAllowed</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.560807" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.561607" level="FAIL">Dictionary does not contain key 'isLegalMoney'.</msg>
<arg>${currency_item}</arg>
<arg>isLegalMoney</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.561452" elapsed="0.000204">Dictionary does not contain key 'isLegalMoney'.</status>
</kw>
<msg time="2026-05-28T18:04:20.561738" level="INFO">${has_isLegalMoney} = False</msg>
<var>${has_isLegalMoney}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>isLegalMoney</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.561331" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:20.562142" level="FAIL">Dictionary does not contain key 'trading'.</msg>
<arg>${currency_item}</arg>
<arg>trading</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:20.561996" elapsed="0.000196">Dictionary does not contain key 'trading'.</status>
</kw>
<msg time="2026-05-28T18:04:20.562271" level="INFO">${has_trading} = False</msg>
<var>${has_trading}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${currency_item}</arg>
<arg>trading</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:20.561875" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.562531" level="INFO">货币包含币种标识(currency): True</msg>
<arg>货币包含币种标识(currency): ${has_currency}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.562397" elapsed="0.000172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.562776" level="INFO">货币包含展示名称(displayName): True</msg>
<arg>货币包含展示名称(displayName): ${has_displayName}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.562660" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.563021" level="INFO">货币包含全名(fullName): True</msg>
<arg>货币包含全名(fullName): ${has_fullName}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.562907" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.563258" level="INFO">货币包含精度(precision): True</msg>
<arg>货币包含精度(precision): ${has_precision}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.563150" elapsed="0.000163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.563518" level="INFO">货币包含确认数(confirms): False</msg>
<arg>货币包含确认数(confirms): ${has_confirms}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.563404" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.563770" level="INFO">货币包含合约地址(contractAddress): False</msg>
<arg>货币包含合约地址(contractAddress): ${has_contractAddress}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.563654" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.564012" level="INFO">货币包含提现费用(withdrawFee): False</msg>
<arg>货币包含提现费用(withdrawFee): ${has_withdrawFee}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.563900" elapsed="0.000148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.564381" level="INFO">货币包含充值状态(depositStatus): True</msg>
<arg>货币包含充值状态(depositStatus): ${has_depositStatus}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.564143" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.564632" level="INFO">货币包含提现状态(withdrawStatus): True</msg>
<arg>货币包含提现状态(withdrawStatus): ${has_withdrawStatus}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.564514" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.564871" level="INFO">货币包含网络列表(networkList): False</msg>
<arg>货币包含网络列表(networkList): ${has_networkList}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.564758" elapsed="0.000151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.565118" level="INFO">货币包含保证金交易允许(isMarginTradingAllowed): False</msg>
<arg>货币包含保证金交易允许(isMarginTradingAllowed): ${has_isMarginTradingAllowed}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.565001" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.565359" level="INFO">货币包含借贷启用(isDebitEnabled): False</msg>
<arg>货币包含借贷启用(isDebitEnabled): ${has_isDebitEnabled}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.565243" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.565596" level="INFO">货币包含借贷启用(debitEnabled): False</msg>
<arg>货币包含借贷启用(debitEnabled): ${has_debitEnabled}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.565486" elapsed="0.000148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.565844" level="INFO">货币包含IPO购买允许(ipoPurchasingAllowed): False</msg>
<arg>货币包含IPO购买允许(ipoPurchasingAllowed): ${has_ipoPurchasingAllowed}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.565729" elapsed="0.000151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.566089" level="INFO">货币包含IPO销售允许(ipoSellingAllowed): False</msg>
<arg>货币包含IPO销售允许(ipoSellingAllowed): ${has_ipoSellingAllowed}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.565972" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.566328" level="INFO">货币包含法币标记(isLegalMoney): False</msg>
<arg>货币包含法币标记(isLegalMoney): ${has_isLegalMoney}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.566216" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.566566" level="INFO">货币包含交易状态(trading): False</msg>
<arg>货币包含交易状态(trading): ${has_trading}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.566459" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证货币符号">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($symbol, str)</arg>
<arg>货币符号应该是字符串格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.567582" elapsed="0.000233"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.568057" level="INFO">Length is 3.</msg>
<arg>${symbol}</arg>
<arg>货币符号不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:20.567922" elapsed="0.000181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.568308" level="INFO">货币符号: btc</msg>
<arg>货币符号: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.568199" elapsed="0.000145"/>
</kw>
<arg>${currency_item['currency']}</arg>
<doc>验证货币符号格式</doc>
<status status="PASS" start="2026-05-28T18:04:20.566917" elapsed="0.001477"/>
</kw>
<arg>${has_currency}</arg>
<arg>验证货币符号</arg>
<arg>${currency_item['currency']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.566703" elapsed="0.001731"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证货币名称">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($name, str)</arg>
<arg>货币名称应该是字符串格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.569278" elapsed="0.000171"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.569638" level="INFO">Length is 3.</msg>
<arg>${name}</arg>
<arg>货币名称不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T18:04:20.569531" elapsed="0.000144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.569850" level="INFO">货币名称: BTC</msg>
<arg>货币名称: ${name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.569755" elapsed="0.000128"/>
</kw>
<arg>${currency_item['displayName']}</arg>
<doc>验证货币名称格式</doc>
<status status="PASS" start="2026-05-28T18:04:20.568726" elapsed="0.001199"/>
</kw>
<arg>${has_displayName}</arg>
<arg>验证货币名称</arg>
<arg>${currency_item['displayName']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.568536" elapsed="0.001423"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证货币精度">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($precision, (int, float))</arg>
<arg>货币精度应该是数字格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.570710" elapsed="0.000190"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${precision} &gt;= 0</arg>
<arg>精度应该是非负数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.570984" elapsed="0.000186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.571381" level="INFO">货币精度: 8</msg>
<arg>货币精度: ${precision}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.571255" elapsed="0.000162"/>
</kw>
<arg>${currency_item['maxPrecision']}</arg>
<doc>验证货币精度格式</doc>
<status status="PASS" start="2026-05-28T18:04:20.570206" elapsed="0.001253"/>
</kw>
<arg>${has_precision}</arg>
<arg>验证货币精度</arg>
<arg>${currency_item['maxPrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.570047" elapsed="0.001447"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证充值状态">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($deposit_status, (str, bool, int))</arg>
<arg>充值状态应该是字符串、布尔值或整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.572274" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.572656" level="INFO">充值状态: 1</msg>
<arg>充值状态: ${deposit_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.572554" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($deposit_status, str)</arg>
<arg>Should Be True</arg>
<arg>$deposit_status.upper() in ['ENABLED', 'DISABLED', 'ACTIVE', 'INACTIVE', 'TRUE', 'FALSE']</arg>
<arg>充值状态应该是有效值</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.572772" elapsed="0.000131"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Should Be True" owner="BuiltIn">
<arg>$deposit_status in [0, 1]</arg>
<arg>充值状态整数值应为0或1</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.573167" elapsed="0.000164"/>
</kw>
<arg>isinstance($deposit_status, int)</arg>
<arg>Should Be True</arg>
<arg>$deposit_status in [0, 1]</arg>
<arg>充值状态整数值应为0或1</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.572997" elapsed="0.000376"/>
</kw>
<arg>${currency_item['depositStatus']}</arg>
<doc>验证充值状态值</doc>
<status status="PASS" start="2026-05-28T18:04:20.571750" elapsed="0.001670"/>
</kw>
<arg>${has_depositStatus}</arg>
<arg>验证充值状态</arg>
<arg>${currency_item['depositStatus']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.571582" elapsed="0.001871"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证提现状态">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($withdraw_status, (str, bool, int))</arg>
<arg>提现状态应该是字符串、布尔值或整数格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.574222" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.574599" level="INFO">提现状态: 1</msg>
<arg>提现状态: ${withdraw_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.574500" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($withdraw_status, str)</arg>
<arg>Should Be True</arg>
<arg>$withdraw_status.upper() in ['ENABLED', 'DISABLED', 'ACTIVE', 'INACTIVE', 'TRUE', 'FALSE']</arg>
<arg>提现状态应该是有效值</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.574817" elapsed="0.000131"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Should Be True" owner="BuiltIn">
<arg>$withdraw_status in [0, 1]</arg>
<arg>提现状态整数值应为0或1</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.575213" elapsed="0.000161"/>
</kw>
<arg>isinstance($withdraw_status, int)</arg>
<arg>Should Be True</arg>
<arg>$withdraw_status in [0, 1]</arg>
<arg>提现状态整数值应为0或1</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.575042" elapsed="0.000374"/>
</kw>
<arg>${currency_item['withdrawStatus']}</arg>
<doc>验证提现状态值</doc>
<status status="PASS" start="2026-05-28T18:04:20.573707" elapsed="0.001756"/>
</kw>
<arg>${has_withdrawStatus}</arg>
<arg>验证提现状态</arg>
<arg>${currency_item['withdrawStatus']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.573541" elapsed="0.001955"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_networkList}</arg>
<arg>验证网络列表</arg>
<arg>${currency_item['networkList']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.575583" elapsed="0.000090"/>
</kw>
<arg>${currency_list[0]}</arg>
<doc>验证单个货币的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:20.551734" elapsed="0.023989"/>
</kw>
<arg>${list_length} &gt; 0</arg>
<arg>验证货币项结构</arg>
<arg>${currency_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.551259" elapsed="0.024498"/>
</kw>
<arg>${currency_dict['currencies']}</arg>
<doc>验证货币列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:20.549389" elapsed="0.026414"/>
</kw>
<arg>${has_currencies}</arg>
<arg>验证货币列表结构</arg>
<arg>${currency_dict['currencies']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.549130" elapsed="0.026706"/>
</kw>
<arg>${data}</arg>
<doc>验证货币字典的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:20.542348" elapsed="0.033533"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证货币字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:20.541685" elapsed="0.034229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.576392" level="INFO">获取余额货币列表 /v1/spot/balance/public/currencies status=200</msg>
<arg>获取余额货币列表 /v1/spot/balance/public/currencies status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.576002" elapsed="0.000425"/>
</kw>
<doc>验证余额货币列表接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T18:04:20.068825" elapsed="0.507706"/>
</test>
<doc>余额货币列表接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:20.056295" elapsed="0.520477"/>
</suite>
<suite id="s1-s4-s1-s2" name="Balance Price Convert" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/balance/balance_price_convert.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.580533" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:20.580395" elapsed="0.000157"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.580824" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.580738" elapsed="0.000116"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:20.580608" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.580981" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.580912" elapsed="0.000105"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:20.580593" elapsed="0.000437"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.581481" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.581395" elapsed="0.000117"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.581678" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.581765" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.581846" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.581933" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.582011" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.581556" elapsed="0.000489"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.582163" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.582237" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.582308" elapsed="0.001017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.583397" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.583475" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.583545" elapsed="0.000010"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.583619" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.583688" elapsed="0.000010"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.583756" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.582060" elapsed="0.001726"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.584000" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.583856" elapsed="0.000172"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.584228" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.584097" elapsed="0.000158"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.584456" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.584324" elapsed="0.000156"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.584680" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.584546" elapsed="0.000158"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.584901" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.584771" elapsed="0.000153"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.585122" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.584988" elapsed="0.000158"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.585353" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.585211" elapsed="0.000165"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.585585" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.585442" elapsed="0.000167"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.585815" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:20.585675" elapsed="0.000164"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:20.583800" elapsed="0.002060"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:20.581545" elapsed="0.004346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.586047" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.585950" elapsed="0.000124"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:20.586318" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:20.586140" elapsed="0.000283"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:20.581226" elapsed="0.005238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.586582" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:20.586528" elapsed="0.000080"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:20.580242" elapsed="0.006408"/>
</kw>
<test id="s1-s4-s1-s2-t1" name="获取货币价格转换" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.587494" level="INFO">&amp;{params} = { converts=usd,btc,usdt }</msg>
<var>&amp;{params}</var>
<arg>converts=usd,btc,usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.587375" elapsed="0.000137"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.588525" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.588112" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:20.588954" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:20.588626" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:20.588615" elapsed="0.000390"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:20.589026" elapsed="0.000022"/>
</return>
<msg time="2026-05-28T18:04:20.589154" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:20.587626" elapsed="0.001544"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:20.990403" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/balance/public/price/currency/convert?converts=usd%2Cbtc%2Cusdt 
 path_url=/v1/spot/balance/public/price/currency/convert?converts=usd%2Cbtc%2Cusdt 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:20.990909" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/balance/public/price/currency/convert?converts=usd%2Cbtc%2Cusdt 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:20 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'a9d764c5ebb5c2ba77661b95d07def84', 'X-Transparent': '00-a9d764c5ebb5c2ba77661b95d07def84-5767fb6dc9598edb-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f466f780655-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"btc":"0.00000012769011875037571741401972","usd":"0.00888489629591665797","usdt":"0.0089"},"ksm":{"btc":"0.00006370158733164811070991545336","usd":"4.432465118412355212","usdt":"4.44"},"vanry":{"btc":"0.00000006434721152757697669684027","usd":"0.0044773887513692371905","usdt":"0.004485"},"pyth":{"btc":"0.00000055380208806342726878440011","usd":"0.03853449404745876378","usdt":"0.0386"},"bal":{"btc":"0.00001387374661029363131902888365","usd":"0.9653589570956638491","usdt":"0.967"},"fio":{"btc":"0.00000001348637209273631172687399","usd":"0.000938404777321534662","usdt":"0.00094"},"mbox":{"btc":"0.00000015064564571673539694912438","usd":"0.01048218102327246165","usdt":"0.0105"},"theta":{"btc":"0.00000261119119242341354711815597","usd":"0.1816911377367226686","usdt":"0.182"},"vib":{"btc":"0.00000003199426570936380335205213","usd":"0.002226215588752151379","usdt":"0.00223"},"fis":{"btc":"0.00000027403160316091867445031197","usd":"0.01906758643280990643","usdt":"0.0191"},"vic":{"btc":"0.00000075179350814827950477467787","usd":"0.05231107482090257052","usdt":"0.0524"},"bar":{"btc":"0.00000523672958920080189394575236","usd":"0.3643805784280427145","usdt":"0.365"},"stpt":{"btc":"0.00000101033013060690539553879419","usd":"0.070300494062747309466","usdt":"0.07042"},"rad":{"btc":"0.00000373027313203344792445450853","usd":"0.259558768195318098","usdt":"0.26"},"bat":{"btc":"0.00000146054540323463461042103449","usd":"0.10162724077801300914","usdt":"0.1018"},"cake":{"btc":"0.00001919655942561828201123127851","usd":"1.3357293532512908274","usdt":"1.338"},"ssv":{"btc":"0.00003367288861877885491805665969","usd":"2.3430170344400445231","usdt":"2.347"},"ape":{"btc":"0.0000017804880603282726439415558","usd":"0.12388939666553452293","usdt":"0.1241"},"qi":{"btc":"0.00000002109039040034295557287741","usd":"0.001467505343258144631","usdt":"0.00147"},"farm":{"btc":"0.00008321378525305383831475442106","usd":"5.79015713666478834","usdt":"5.8"},"ctk":{"btc":"0.00000216786257788559223609644707","usd":"0.15084357643966371003","usdt":"0.1511"},"band":{"btc":"0.00000269727441854726234537479848","usd":"0.1876809554643069324","usdt":"0.188"},"iotx":{"btc":"0.00000005695840128527995484647846","usd":"0.003963262729751587881","usdt":"0.00397"},"near":{"btc":"0.00007562411414980116926846044022","usd":"5.2620548736827757483","usdt":"5.271"},"shib":{"btc":"0.00000000012209470905232554552733","usd":"0.000008495558143623680823","usdt":"0.00000851"},"xmr":{"btc":"0.00170301315681680872551057754815","usd":"118.49856071070868551","usdt":"118.7"},"dock":{"btc":"0.00000005595409698050171886681763","usd":"0.00389338152292977147","usdt":"0.0039"},"astr":{"btc":"0.00000010179341489145120393847976","usd":"0.0070829594628683919435","usdt":"0.007095"},"waves":{"btc":"0.00001543759188487688448735788915","usd":"1.0741739791467779748","usdt":"1.076"},"reef":{"btc":"0.00000000987087659553466220009501","usd":"0.0006868324327629955824","usdt":"0.000688"},"iris":{"btc":"0.00000007474893468420870648618457","usd":"0.005201158393452335733","usdt":"0.00521"},"apt":{"btc":"0.0000133429000491965637297795882","usd":"0.928421747775560889","usdt":"0.93"},"stg":{"btc":"0.00000227259716966960827397536212","usd":"0.15813118800822456432","usdt":"0.1584"},"ai":{"btc":"0.00000034433290449539519302657002","usd":"0.0239592709103370552","usdt":"0.024"},"combo":{"btc":"0.00000039598284016970447198055552","usd":"0.02755316154688761348","usdt":"0.0276"},"dent":{"btc":"0.00000000054519376545104238895874","usd":"0.0000379355122747003374","usdt":"0.000038"},"kda":{"btc":"0.0000000860832261238487982566425","usd":"0.0059898177275842638","usdt":"0.006"},"metis":{"btc":"0.00004361550123608339111669886897","usd":"3.034840981976026992","usdt":"3.04"},"glm":{"btc":"0.00000184074631861496680272120556","usd":"0.12808226907484350759","usdt":"0.1283"},"loka":{"btc":"0.00000177474917858668272405777964","usd":"0.12349007548369557201","usdt":"0.1237"},"ray":{"btc":"0.00001017216788696813299399325595","usd":"0.7077967948095405057","usdt":"0.709"},"wld":{"btc":"0.00000442898198407202067030425686","usd":"0.30817612208421037251","usdt":"0.3087"},"agld":{"btc":"0.00000308464893610458193752968975","usd":"0.2146351352384361195","usdt":"0.215"},"iost":{"btc":"0.00000001427546833220492571089322","usd":"0.0009933114398243904135","usdt":"0.000995"},"zro":{"btc":"0.00001645624339400909526672815878","usd":"1.1450534889231917631","usdt":"1.147"},"wing":{"btc":"0.00000467718861939578470527757608","usd":"0.3254467631987449998","usdt":"0.326"},"dgb":{"btc":"0.00000004677188619395784705277576","usd":"0.003254467631987449998","usdt":"0.00326"},"bb":{"btc":"0.00000038593979712192211218394723","usd":"0.02685434947866944937","usdt":"0.0269"},"zrx":{"btc":"0.00000141463434930191525135082516","usd":"0.09843267132330140178","usdt":"0.0986"},"sui":{"btc":"0.0000132396001778479451718716172","usd":"0.92123396650245977244","usdt":"0.9228"},"bsw":{"btc":"0.00000016068868876451775674573268","usd":"0.01118099309149062576","usdt":"0.0112"},"omg":{"btc":"0.00000549497926757234828871567987","usd":"0.3823500316107955059","usdt":"0.383"},"blur":{"btc":"0.00000029799143443205658996507747","usd":"0.020734752366987526521","usdt":"0.02077"},"jst":{"btc":"0.00000136614079858548042833291655","usd":"0.095058407336762266506","usdt":"0.09522"},"pol":{"btc":"0.00000126355828745456061041041756","usd":"0.087920541211391018811","usdt":"0.08807"},"pivx":{"btc":"0.00000083787673427212830303132038","usd":"0.05830089254848683432","usdt":"0.0584"},"gmt":{"btc":"0.00000014935439732487766497527475","usd":"0.010392333757358697693","usdt":"0.01041"},"nkn":{"btc":"0.00000010473459178401603787891505","usd":"0.00728761156856085429","usdt":"0.0073"},"porto":{"btc":"0.0000097130573476409394032911626","usd":"0.6758511002624244321","usdt":"0.677"},"rsr":{"btc":"0.0000000227546661054040323391725","usd":"0.0015833084859914403978","usdt":"0.001586"},"sc":{"btc":"0.00000001251076219666602534663204","usd":"0.0008705201764089130056","usdt":"0.000872"},"twt":{"btc":"0.00000629124910921794967258962304","usd":"0.43775584559094994605","usdt":"0.4385"},"arb":{"btc":"0.00000147776204845940437007236299","usd":"0.1028252043235298619","usdt":"0.103"},"btc":{"btc":"1","usd":"69581.705952407651836227","usdt":"69699.99"},"cvc":{"btc":"0.00000039024395842811455209677935","usd":"0.02715384036504866256","usdt":"0.0272"},"ardr":{"btc":"0.00000051119089113212211364736207","usd":"0.035569534272304553199","usdt":"0.03563"},"vite":{"btc":"0.00000001233859574441832775011876","usd":"0.000858540540953744478","usdt":"0.00086"},"gmx":{"btc":"0.00008723100247216678223339773793","usd":"6.069681963952053984","usdt":"6.08"},"sei":{"btc":"0.00000098766154772762521199787834","usd":"0.068723175394483453332","usdt":"0.06884"},"matic":{"btc":"0.00000544332933189803900976169437","usd":"0.37875614097424494762","usdt":"0.3794"},"audio":{"btc":"0.00000026743188915809026658396938","usd":"0.018608367073695112872","usdt":"0.01864"},"ark":{"btc":"0.00000209038767437412831766546882","usd":"0.14545274048483787261","usdt":"0.1457"},"cvp":{"btc":"0.00000048637022759974571015003015","usd":"0.03384247016085109047","usdt":"0.0339"},"key":{"btc":"0.00000001797704705553042403592884","usd":"0.0012508736021105137569","usdt":"0.001253"},"btt":{"btc":"0","usd":"0","usdt":"0"},"cvx":{"btc":"0.00002170732018756387196038335156","usd":"1.5104323703058318549","usdt":"1.513"},"flm":{"btc":"0.00000023959831271137915514765497","usd":"0.01667165934177620091","usdt":"0.0167"},"one":{"btc":"0.00000002568149579361489147989835","usd":"0.001786962288729305367","usdt":"0.00179"},"btx":{"btc":"0.00000258106206328006646772833109","usd":"0.17959470153206817627","usdt":"0.1799"},"ong":{"btc":"0.00000088565292477086438606375697","usd":"0.061625241387296100729","usdt":"0.06173"},"gno":{"btc":"0.00162453394900056657109993846484","usd":"113.037843549061031679","usdt":"113.23"},"storj":{"btc":"0.00000145767596236383965047914641","usd":"0.10142758018709353368","usdt":"0.1016"},"gns":{"btc":"0.00000668579722895225666459923452","usd":"0.4652091768423778218","usdt":"0.466"},"people":{"btc":"0.00000008823530677694501821305857","usd":"0.006139563170773870395","usdt":"0.00615"},"tnsr":{"btc":"0.00000050645631369531042974324674","usd":"0.03524009429728741869","usdt":"0.0353"},"bttc":{"btc":"0.00000000000444763334973218790993","usd":"0.000000309473915925186963","usdt":"0.00000031"},"vtho":{"btc":"0.00000000675753325072213066314644","usd":"0.0004702006916153647083","usdt":"0.000471"},"polyx":{"btc":"0.00000068579636811999542611125195","usd":"0.04771888122975463494","usdt":"0.0478"},"t":{"btc":"0.00000006786227659430080262565317","usd":"0.004721972975245594629","usdt":"0.00473"},"ont":{"btc":"0.00000074964142749518328481826181","usd":"0.052161329377712963925","usdt":"0.05225"},"mana":{"btc":"0.00000118794852050911341594166656","usd":"0.08265948464066284044","usdt":"0.0828"},"cfx":{"btc":"0.00000073400297474935075313497176","usd":"0.051073179157201822668","usdt":"0.05116"},"w":{"btc":"0.00000016212340919991523671667672","usd":"0.01128082338695036349","usdt":"0.0113"},"dodo":{"btc":"0.00000026126259128588110270891","usd":"0.018179096803218240633","usdt":"0.01821"},"ankr":{"btc":"0.00000006370158733164811070991545","usd":"0.004432465118412355212","usdt":"0.00444"},"mina":{"btc":"0.00000078479207816242154410639083","usd":"0.05460717161647653831","usdt":"0.0547"},"sfp":{"btc":"0.00000377761890640156476349566191","usd":"0.26285316794548944309","usdt":"0.2633"},"dia":{"btc":"0.00000231133462142534023319085125","usd":"0.16082660598563748303","usdt":"0.1611"},"aca":{"btc":"0.00000002582496783715463947699275","usd":"0.00179694531827527914","usdt":"0.0018"},"algo":{"btc":"0.00000151793422065053380925879616","usd":"0.10562045259640251834","usdt":"0.1058"},"asr":{"btc":"0.00001443328758009864850769705993","usd":"1.0042927723249615638","usdt":"1.006"},"df":{"btc":"0.00000002352941514051867152348228","usd":"0.0016372168455396987... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T18:04:20.991470" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:20.991836" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/balance/public/price/currency/convert</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:20.589235" elapsed="0.402667"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.993833" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:20.992433" elapsed="0.001545"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:20.997384" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.00888489629591665797', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00006370158733164811070...</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:20.994300" elapsed="0.003153"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:20.997730" elapsed="0.032008"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.031707" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.00888489629591665797",
      "usdt": "0.0089"
    },
   ...</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:21.029919" elapsed="0.001816"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.032028" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.00888489629591665797",
      "usdt": "0.0089"
    },
    "ksm": {
      "btc": "0.00006370158733164811070991545336",
      "usd": "4.432465118412355212",
      "usdt": "4.44"
    },
    "vanry": {
      "btc": "0.00000006434721152757697669684027",
      "usd": "0.0044773887513692371905",
      "usdt": "0.004485"
    },
    "pyth": {
      "btc": "0.00000055380208806342726878440011",
      "usd": "0.03853449404745876378",
      "usdt": "0.0386"
    },
    "bal": {
      "btc": "0.00001387374661029363131902888365",
      "usd": "0.9653589570956638491",
      "usdt": "0.967"
    },
    "fio": {
      "btc": "0.00000001348637209273631172687399",
      "usd": "0.000938404777321534662",
      "usdt": "0.00094"
    },
    "mbox": {
      "btc": "0.00000015064564571673539694912438",
      "usd": "0.01048218102327246165",
      "usdt": "0.0105"
    },
    "theta": {
      "btc": "0.00000261119119242341354711815597",
      "usd": "0.1816911377367226686",
      "usdt": "0.182"
    },
    "vib": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.002226215588752151379",
      "usdt": "0.00223"
    },
    "fis": {
      "btc": "0.00000027403160316091867445031197",
      "usd": "0.01906758643280990643",
      "usdt": "0.0191"
    },
    "vic": {
      "btc": "0.00000075179350814827950477467787",
      "usd": "0.05231107482090257052",
      "usdt": "0.0524"
    },
    "bar": {
      "btc": "0.00000523672958920080189394575236",
      "usd": "0.3643805784280427145",
      "usdt": "0.365"
    },
    "stpt": {
      "btc": "0.00000101033013060690539553879419",
      "usd": "0.070300494062747309466",
      "usdt": "0.07042"
    },
    "rad": {
      "btc": "0.00000373027313203344792445450853",
      "usd": "0.259558768195318098",
      "usdt": "0.26"
    },
    "bat": {
      "btc": "0.00000146054540323463461042103449",
      "usd": "0.10162724077801300914",
      "usdt": "0.1018"
    },
    "cake": {
      "btc": "0.00001919655942561828201123127851",
      "usd": "1.3357293532512908274",
      "usdt": "1.338"
    },
    "ssv": {
      "btc": "0.00003367288861877885491805665969",
      "usd": "2.3430170344400445231",
      "usdt": "2.347"
    },
    "ape": {
      "btc": "0.0000017804880603282726439415558",
      "usd": "0.12388939666553452293",
      "usdt": "0.1241"
    },
    "qi": {
      "btc": "0.00000002109039040034295557287741",
      "usd": "0.001467505343258144631",
      "usdt": "0.00147"
    },
    "farm": {
      "btc": "0.00008321378525305383831475442106",
      "usd": "5.79015713666478834",
      "usdt": "5.8"
    },
    "ctk": {
      "btc": "0.00000216786257788559223609644707",
      "usd": "0.15084357643966371003",
      "usdt": "0.1511"
    },
    "band": {
      "btc": "0.00000269727441854726234537479848",
      "usd": "0.1876809554643069324",
      "usdt": "0.188"
    },
    "iotx": {
      "btc": "0.00000005695840128527995484647846",
      "usd": "0.003963262729751587881",
      "usdt": "0.00397"
    },
    "near": {
      "btc": "0.00007562411414980116926846044022",
      "usd": "5.2620548736827757483",
      "usdt": "5.271"
    },
    "shib": {
      "btc": "0.00000000012209470905232554552733",
      "usd": "0.000008495558143623680823",
      "usdt": "0.00000851"
    },
    "xmr": {
      "btc": "0.00170301315681680872551057754815",
      "usd": "118.49856071070868551",
      "usdt": "118.7"
    },
    "dock": {
      "btc": "0.00000005595409698050171886681763",
      "usd": "0.00389338152292977147",
      "usdt": "0.0039"
    },
    "astr": {
      "btc": "0.00000010179341489145120393847976",
      "usd": "0.0070829594628683919435",
      "usdt": "0.007095"
    },
    "waves": {
      "btc": "0.00001543759188487688448735788915",
      "usd": "1.0741739791467779748",
      "usdt": "1.076"
    },
    "reef": {
      "btc": "0.00000000987087659553466220009501",
      "usd": "0.0006868324327629955824",
      "usdt": "0.000688"
    },
    "iris": {
      "btc": "0.00000007474893468420870648618457",
      "usd": "0.005201158393452335733",
      "usdt": "0.00521"
    },
    "apt": {
      "btc": "0.0000133429000491965637297795882",
      "usd": "0.928421747775560889",
      "usdt": "0.93"
    },
    "stg": {
      "btc": "0.00000227259716966960827397536212",
      "usd": "0.15813118800822456432",
      "usdt": "0.1584"
    },
    "ai": {
      "btc": "0.00000034433290449539519302657002",
      "usd": "0.0239592709103370552",
      "usdt": "0.024"
    },
    "combo": {
      "btc": "0.00000039598284016970447198055552",
      "usd": "0.02755316154688761348",
      "usdt": "0.0276"
    },
    "dent": {
      "btc": "0.00000000054519376545104238895874",
      "usd": "0.0000379355122747003374",
      "usdt": "0.000038"
    },
    "kda": {
      "btc": "0.0000000860832261238487982566425",
      "usd": "0.0059898177275842638",
      "usdt": "0.006"
    },
    "metis": {
      "btc": "0.00004361550123608339111669886897",
      "usd": "3.034840981976026992",
      "usdt": "3.04"
    },
    "glm": {
      "btc": "0.00000184074631861496680272120556",
      "usd": "0.12808226907484350759",
      "usdt": "0.1283"
    },
    "loka": {
      "btc": "0.00000177474917858668272405777964",
      "usd": "0.12349007548369557201",
      "usdt": "0.1237"
    },
    "ray": {
      "btc": "0.00001017216788696813299399325595",
      "usd": "0.7077967948095405057",
      "usdt": "0.709"
    },
    "wld": {
      "btc": "0.00000442898198407202067030425686",
      "usd": "0.30817612208421037251",
      "usdt": "0.3087"
    },
    "agld": {
      "btc": "0.00000308464893610458193752968975",
      "usd": "0.2146351352384361195",
      "usdt": "0.215"
    },
    "iost": {
      "btc": "0.00000001427546833220492571089322",
      "usd": "0.0009933114398243904135",
      "usdt": "0.000995"
    },
    "zro": {
      "btc": "0.00001645624339400909526672815878",
      "usd": "1.1450534889231917631",
      "usdt": "1.147"
    },
    "wing": {
      "btc": "0.00000467718861939578470527757608",
      "usd": "0.3254467631987449998",
      "usdt": "0.326"
    },
    "dgb": {
      "btc": "0.00000004677188619395784705277576",
      "usd": "0.003254467631987449998",
      "usdt": "0.00326"
    },
    "bb": {
      "btc": "0.00000038593979712192211218394723",
      "usd": "0.02685434947866944937",
      "usdt": "0.0269"
    },
    "zrx": {
      "btc": "0.00000141463434930191525135082516",
      "usd": "0.09843267132330140178",
      "usdt": "0.0986"
    },
    "sui": {
      "btc": "0.0000132396001778479451718716172",
      "usd": "0.92123396650245977244",
      "usdt": "0.9228"
    },
    "bsw": {
      "btc": "0.00000016068868876451775674573268",
      "usd": "0.01118099309149062576",
      "usdt": "0.0112"
    },
    "omg": {
      "btc": "0.00000549497926757234828871567987",
      "usd": "0.3823500316107955059",
      "usdt": "0.383"
    },
    "blur": {
      "btc": "0.00000029799143443205658996507747",
      "usd": "0.020734752366987526521",
      "usdt": "0.02077"
    },
    "jst": {
      "btc": "0.00000136614079858548042833291655",
      "usd": "0.095058407336762266506",
      "usdt": "0.09522"
    },
    "pol": {
      "btc": "0.00000126355828745456061041041756",
      "usd": "0.087920541211391018811",
      "usdt": "0.08807"
    },
    "pivx": {
      "btc": "0.00000083787673427212830303132038",
      "usd": "0.05830089254848683432",
      "usdt": "0.0584"
    },
    "gmt": {
      "btc": "0.00000014935439732487766497527475",
      "usd": "0.010392333757358697693",
      "usdt": "0.01041"
    },
    "nkn": {
      "btc": "0.00000010473459178401603787891505",
      "usd": "0.00728761156856085429",
      "usdt": "0.0073"
    },
    "porto": {
      "btc": "0.0000097130573476409394032911626",
      "usd": "0.6758511002624244321",
      "usdt": "0.677"
    },
    "rsr": {
      "btc": "0.0000000227546661054040323391725",
      "usd": "0.0015833084859914403978",
      "usdt": "0.001586"
    },
    "sc": {
      "btc": "0.00000001251076219666602534663204",
      "usd": "0.0008705201764089130056",
      "usdt": "0.000872"
    },
    "twt": {
      "btc": "0.00000629124910921794967258962304",
      "usd": "0.43775584559094994605",
      "usdt": "0.4385"
    },
    "arb": {
      "btc": "0.00000147776204845940437007236299",
      "usd": "0.1028252043235298619",
      "usdt": "0.103"
    },
    "btc": {
      "btc": "1",
      "usd": "69581.705952407651836227",
      "usdt": "69699.99"
    },
    "cvc": {
      "btc": "0.00000039024395842811455209677935",
      "usd": "0.02715384036504866256",
      "usdt": "0.0272"
    },
    "ardr": {
      "btc": "0.00000051119089113212211364736207",
      "usd": "0.035569534272304553199",
      "usdt": "0.03563"
    },
    "vite": {
      "btc": "0.00000001233859574441832775011876",
      "usd": "0.000858540540953744478",
      "usdt": "0.00086"
    },
    "gmx": {
      "btc": "0.00008723100247216678223339773793",
      "usd": "6.069681963952053984",
      "usdt": "6.08"
    },
    "sei": {
      "btc": "0.00000098766154772762521199787834",
      "usd": "0.068723175394483453332",
      "usdt": "0.06884"
    },
    "matic": {
      "btc": "0.00000544332933189803900976169437",
      "usd": "0.37875614097424494762",
      "usdt": "0.3794"
    },
    "audio": {
      "btc": "0.00000026743188915809026658396938",
      "usd": "0.018608367073695112872",
      "usdt": "0.01864"
    },
    "ark": {
      "btc": "0.00000209038767437412831766546882",
      "usd": "0.14545274048483787261",
      "usdt": "0.1457"
    },
    "cvp": {
      "btc": "0.00000048637022759974571015003015",
      "usd": "0.03384247016085109047",
      "usdt": "0.0339"
    },
    "key": {
      "btc": "0.00000001797704705553042403592884",
      "usd": "0.0012508736021105137569",
      "usdt": "0.001253"
    },
    "btt": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "cvx": {
      "btc": "0.00002170732018756387196038335156",
      "usd": "1.5104323703058318549",
      "usdt": "1.513"
    },
    "flm": {
      "btc": "0.00000023959831271137915514765497",
      "usd": "0.01667165934177620091",
      "usdt": "0.0167"
    },
    "one": {
      "btc": "0.00000002568149579361489147989835",
      "usd": "0.001786962288729305367",
      "usdt": "0.00179"
    },
    "btx": {
      "btc": "0.00000258106206328006646772833109",
      "usd": "0.17959470153206817627",
      "usdt": "0.1799"
    },
    "ong": {
      "btc": "0.00000088565292477086438606375697",
      "usd": "0.061625241387296100729",
      "usdt": "0.06173"
    },
    "gno": {
      "btc": "0.00162453394900056657109993846484",
      "usd": "113.037843549061031679",
      "usdt": "113.23"
    },
    "storj": {
      "btc": "0.00000145767596236383965047914641",
      "usd": "0.10142758018709353368",
      "usdt": "0.1016"
    },
    "gns": {
      "btc": "0.00000668579722895225666459923452",
      "usd": "0.4652091768423778218",
      "usdt": "0.466"
    },
    "people": {
      "btc": "0.00000008823530677694501821305857",
      "usd": "0.006139563170773870395",
      "usdt": "0.00615"
    },
    "tnsr": {
      "btc": "0.00000050645631369531042974324674",
      "usd": "0.03524009429728741869",
      "usdt": "0.0353"
    },
    "bttc": {
      "btc": "0.00000000000444763334973218790993",
      "usd": "0.000000309473915925186963",
      "usdt": "0.00000031"
    },
    "vtho": {
      "btc": "0.00000000675753325072213066314644",
      "usd": "0.0004702006916153647083",
      "usdt": "0.000471"
    },
    "polyx": {
      "btc": "0.00000068579636811999542611125195",
      "usd": "0.04771888122975463494",
      "usdt": "0.0478"
    },
    "t": {
      "btc": "0.00000006786227659430080262565317",
      "usd": "0.004721972975245594629",
      "usdt": "0.00473"
    },
    "ont": {
      "btc": "0.00000074964142749518328481826181",
      "usd": "0.052161329377712963925",
      "usdt": "0.05225"
    },
    "mana": {
      "btc": "0.00000118794852050911341594166656",
      "usd": "0.08265948464066284044",
      "usdt": "0.0828"
    },
    "cfx": {
      "btc": "0.00000073400297474935075313497176",
      "usd": "0.051073179157201822668",
      "usdt": "0.05116"
    },
    "w": {
      "btc": "0.00000016212340919991523671667672",
      "usd": "0.01128082338695036349",
      "usdt": "0.0113"
    },
    "dodo": {
      "btc": "0.00000026126259128588110270891",
      "usd": "0.018179096803218240633",
      "usdt": "0.01821"
    },
    "ankr": {
      "btc": "0.00000006370158733164811070991545",
      "usd": "0.004432465118412355212",
      "usdt": "0.00444"
    },
    "mina": {
      "btc": "0.00000078479207816242154410639083",
      "usd": "0.05460717161647653831",
      "usdt": "0.0547"
    },
    "sfp": {
      "btc": "0.00000377761890640156476349566191",
      "usd": "0.26285316794548944309",
      "usdt": "0.2633"
    },
    "dia": {
      "btc": "0.00000231133462142534023319085125",
      "usd": "0.16082660598563748303",
      "usdt": "0.1611"
    },
    "aca": {
      "btc": "0.00000002582496783715463947699275",
      "usd": "0.00179694531827527914",
      "usdt": "0.0018"
    },
    "algo": {
      "btc": "0.00000151793422065053380925879616",
      "usd": "0.10562045259640251834",
      "usdt": "0.1058"
    },
    "asr": {
      "btc": "0.00001443328758009864850769705993",
      "usd": "1.0042927723249615638",
      "usdt": "1.006"
    },
    "df": {
      "btc": "0.00000002352941514051867152348228",
      "usd": "0.001637216845539698772",
      "usdt": "0.00164"
    },
    "ast": {
      "btc": "0.00000037446203363874227241639489",
      "usd": "0.02605570711499154753",
      "usdt": "0.0261"
    },
    "jup": {
      "btc": "0.00000258249678371546394769927514",
      "usd": "0.179694531827527914",
      "usdt": "0.18"
    },
    "dusk": {
      "btc": "0.00000170875203855839864539435372",
      "usd": "0.11889788189254763643",
      "usdt": "0.1191"
    },
    "doge": {
      "btc": "0.00000141678642995501147130724122",
      "usd": "0.098582416766491008375",
      "usdt": "0.09875"
    },
    "bel": {
      "btc": "0.00000137015801580459337225155986",
      "usd": "0.09533793216404953215",
      "usdt": "0.0955"
    },
    "acm": {
      "btc": "0.00000520803518049285229452687152",
      "usd": "0.3623839725188479599",
      "usdt": "0.363"
    },
    "juv": {
      "btc": "0.00000572453453723594508406672655",
      "usd": "0.3983228788843535427",
      "usdt": "0.399"
    },
    "bome": {
      "btc": "0.00000000707317174650957625675413",
      "usd": "0.0004921633566165070089",
      "usdt": "0.000493"
    },
    "tia": {
      "btc": "0.00000602008694692782595808119915",
      "usd": "0.41888791974905951508",
      "usdt": "0.4196"
    },
    "ata": {
      "btc": "0.0000000172166452247697596513285",
      "usd": "0.00119796354551685276",
      "usdt": "0.0012"
    },
    "nmr": {
      "btc": "0.00011908179613799083758835546461",
      "usd": "8.28591452315823159",
      "usdt": "8.3"
    },
    "loom": {
      "btc": "0.00000069311344234052257396306657",
      "usd": "0.048228015736599297363",
      "usdt": "0.04831"
    },
    "paxg": {
      "btc": "0.06312138638757336980966568287886",
      "usd": "4392.093746928437273988",
      "usdt": "4399.56"
    },
    "lit": {
      "btc": "0.00001065997283500327618411423015",
      "usd": "0.7417390952658513339",
      "usdt": "0.743"
    },
    "woo": {
      "btc": "0.00000304160732304265753840136849",
      "usd": "0.2116402263746439876",
      "usdt": "0.212"
    },
    "rei": {
      "btc": "0.00000005753228945943894683485607",
      "usd": "0.004003194847935482973",
      "usdt": "0.00401"
    },
    "rare": {
      "btc": "0.00000021233862443882703569971818",
      "usd": "0.01477488372804118404",
      "usdt": "0.0148"
    },
    "zec": {
      "btc": "0.00766025934867422506086442767065",
      "usd": "533.013913518631688016",
      "usdt": "533.92"
    },
    "ren": {
      "btc": "0.00000061319951408888293958148344",
      "usd": "0.042667468279491905802",
      "usdt": "0.04274"
    },
    "atm": {
      "btc": "0.00001407460747124927851496104949",
      "usd": "0.9793351984600271313",
      "usdt": "0.981"
    },
    "hbar": {
      "btc": "0.00000120215225281954846765401258",
      "usd": "0.083647804565714243967",
      "usdt": "0.08379"
    },
    "rep": {
      "btc": "0.00006786227659430080262565317441",
      "usd": "4.721972975245594629",
      "usdt": "4.73"
    },
    "elf": {
      "btc": "0.00000325968482922307449398486284",
      "usd": "0.22681443128452412256",
      "usdt": "0.2272"
    },
    "pepe": {
      "btc": "0.00000000004835007867289507502081",
      "usd": "0.000003364280956993161501",
      "usdt": "0.00000337"
    },
    "icx": {
      "btc": "0.00000050071743195372050985947057",
      "usd": "0.03484077311544846777",
      "usdt": "0.0349"
    },
    "req": {
      "btc": "0.00000099713070260124857980610901",
      "usd": "0.06938205534451772235",
      "usdt": "0.0695"
    },
    "xai": {
      "btc": "0.00000013428983275320412528036231",
      "usd": "0.009344115655031451528",
      "usdt": "0.00936"
    },
    "strax": {
      "btc": "0.00000016370160167885246468471516",
      "usd": "0.011390636711956074993",
      "usdt": "0.01141"
    },
    "chess": {
      "btc": "0.00000004031564423466918718352757",
      "usd": "0.002805231302418630213",
      "usdt": "0.00281"
    },
    "tusd": {
      "btc": "0.00001434433491310400474949852934",
      "usd": "0.99810329400645782454",
      "usdt": "0.9998"
    },
    "ctsi": {
      "btc": "0.00000039010048638457480409968495",
      "usd": "0.027143857335502688787",
      "usdt": "0.02719"
    },
    "sxp": {
      "btc": "0.00000003156384957874455936076892",
      "usd": "0.00219626650011423006",
      "usdt": "0.0022"
    },
    "rvn": {
      "btc": "0.00000007274032607465223452686292",
      "usd": "0.005061395979808702911",
      "usdt": "0.00507"
    },
    "chr": {
      "btc": "0.00000027474896337861741443578399",
      "usd": "0.019117501580539775295",
      "usdt": "0.01915"
    },
    "fida": {
      "btc": "0.00000041420378969925246761154485",
      "usd": "0.028821006299226282651",
      "usdt": "0.02887"
    },
    "ntrn": {
      "btc": "0.00000002295552696635967953510467",
      "usd": "0.00159728472735580368",
      "usdt": "0.0016"
    },
    "sand": {
      "btc": "0.00000096327130032586805249182963",
      "usd": "0.067026060371667911922",
      "usdt": "0.06714"
    },
    "osmo": {
      "btc": "0.000000790530959904011463990167",
      "usd": "0.05500649279831548923",
      "usdt": "0.0551"
    },
    "kava": {
      "btc": "0.00000077618375555003666428072658",
      "usd": "0.05400818984371811193",
      "usdt": "0.0541"
    },
    "ocean": {
      "btc": "0.00000878479322593876986209036759",
      "usd": "0.61126089909997412079",
      "usdt": "0.6123"
    },
    "vidt": {
      "btc": "0.00000001649928500707101966585648",
      "usd": "0.001148048397786983895",
      "usdt": "0.00115"
    },
    "adx": {
      "btc": "0.00000103873759522777549896348622",
      "usd": "0.07227713391285011652",
      "usdt": "0.0724"
    },
    "chz": {
      "btc": "0.00000049053091686239840206576787",
      "usd": "0.034131978017684329887",
      "usdt": "0.03419"
    },
    "xrp": {
      "btc": "0.00003067001874749192933887078031",
      "usd": "2.13407222604281345421",
      "usdt": "2.1377"
    },
    "c98": {
      "btc": "0.00000027977048490250859433408814",
      "usd": "0.01946690761464885735",
      "usdt": "0.0195"
    },
    "psg": {
      "btc": "0.00001625538253305344807079599294",
      "usd": "1.1310772475588284809",
      "usdt": "1.133"
    },
    "perp": {
      "btc": "0.00000179340054424684996368005218",
      "usd": "0.1247878693246721625",
      "usdt": "0.125"
    },
    "for": {
      "btc": "0.00000004390244532316288711088768",
      "usd": "0.003054807041067974538",
      "usdt": "0.00306"
    },
    "uma": {
      "btc": "0.00000608321464608531507680273699",
      "usd": "0.4232804527492879752",
      "usdt": "0.424"
    },
    "syn": {
      "btc": "0.00000058106177633597938823233691",
      "usd": "0.04043126966119378065",
      "usdt": "0.0405"
    },
    "jasmy": {
      "btc": "0.00000007618365511960618645712862",
      "usd": "0.005300988688912073463",
      "usdt": "0.00531"
    },
    "sys": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.002226215588752151379",
      "usdt": "0.00223"
    },
    "lunc": {
      "btc": "0.00000000121133446360609233946805",
      "usd": "0.000084286718456656565439",
      "usdt": "0.00008443"
    },
    "luna": {
      "btc": "0.00000084648505688451318285698463",
      "usd": "0.0588998743212452607",
      "usdt": "0.059"
    },
    "auction": {
      "btc": "0.00006298422711394937072444343249",
      "usd": "4.382549970682486347",
      "usdt": "4.39"
    },
    "not": {
      "btc": "0.00000000622668668962506307389714",
      "usd": "0.0004332634822952617482",
      "usdt": "0.000434"
    },
    "gal": {
      "btc": "0.00003647059346780394086139754109",
      "usd": "2.5376861105865330966",
      "usdt": "2.542"
    },
    "yfii": {
      "btc": "0.00624820749615602527346130178785",
      "usd": "434.76093672715781415",
      "usdt": "435.5"
    },
    "alpha": {
      "btc": "0.00000013916788223355555718157205",
      "usd": "0.00968353865959455981",
      "usdt": "0.0097"
    },
    "tko": {
      "btc": "0.00000071879493813413746544296491",
      "usd": "0.05001497802532860273",
      "usdt": "0.0501"
    },
    "pixel": {
      "btc": "0.00000009067433151712073416366344",
      "usd": "0.006309274673055424536",
      "usdt": "0.00632"
    },
    "nexo": {
      "btc": "0.00001172166595719741136261282103",
      "usd": "0.8156135139060572541",
      "usdt": "0.817"
    },
    "bico": {
      "btc": "0.00000033428986144761283322996173",
      "usd": "0.02326045884211889109",
      "usdt": "0.0233"
    },
    "troy": {
      "btc": "0.00000000098995710042426117995139",
      "usd": "0.0000688829038672190337",
      "usdt": "0.000069"
    },
    "mask": {
      "btc": "0.0000060975618504392898765121774",
      "usd": "0.4242787557038853525",
      "usdt": "0.425"
    },
    "enj": {
      "btc": "0.00000054261126866732692501103659",
      "usd": "0.037755817742872809486",
      "usdt": "0.03782"
    },
    "aave": {
      "btc": "0.00116527993762983323240075070312",
      "usd": "81.082165972398984306",
      "usdt": "81.22"
    },
    "wan": {
      "btc": "0.00000077905319642083162422261467",
      "usd": "0.05420785043463758739",
      "usdt": "0.0543"
    },
    "gm": {
      "btc": "0.01025179487113269313238065026746",
      "usd": "713.337376207555949715",
      "usdt": "714.55"
    },
    "oax": {
      "btc": "0.00000051362991587229782959796694",
      "usd": "0.03573924577458610734",
      "usdt": "0.0358"
    },
    "btxtest2": {
      "btc": "0.00000529124896574590613284162594",
      "usd": "0.36817412965551274824",
      "usdt": "0.3688"
    },
    "orn": {
      "btc": "0.00001510760618473546409404075955",
      "usd": "1.0512130111910382969",
      "usdt": "1.053"
    },
    "ens": {
      "btc": "0.00008263989707889484632637680436",
      "usd": "5.750225018480893248",
      "usdt": "5.76"
    },
    "pda": {
      "btc": "0.00000014017218653833379316123288",
      "usd": "0.009753419866416376221",
      "usdt": "0.00977"
    },
    "bond": {
      "btc": "0.00003087518376975376897471577829",
      "usd": "2.1483479582935559496",
      "usdt": "2.152"
    },
    "tlm": {
      "btc": "0.00000001919655942561828201123128",
      "usd": "0.0013357293532512908274",
      "usdt": "0.001338"
    },
    "kp3r": {
      "btc": "0.00023644192775350469921157807914",
      "usd": "16.452032691764777904",
      "usdt": "16.48"
    },
    "lqty": {
      "btc": "0.00000340028743189202753113737893",
      "usd": "0.2365978002395784201",
      "usdt": "0.237"
    },
    "ckb": {
      "btc": "0.00000001807747748600824763389493",
      "usd": "0.001257861722792695398",
      "usdt": "0.00126"
    },
    "bigtime": {
      "btc": "0.00000015968438445973952076607185",
      "usd": "0.011111111884668809349",
      "usdt": "0.01113"
    },
    "yfi": {
      "btc": "0.03331420850992948492532064925691",
      "usd": "2318.0594605751100906",
      "usdt": "2322"
    },
    "xtz": {
      "btc": "0.00000444332918842599547001369728",
      "usd": "0.30917442503880774981",
      "usdt": "0.3097"
    },
    "dexe": {
      "btc": "0.00023842184195435322157148085674",
      "usd": "16.5897984994992159714",
      "usdt": "16.618"
    },
    "meme": {
      "btc": "0.00000000680057486378405506227476",
      "usd": "0.0004731956004791568402",
      "usdt": "0.000474"
    },
    "dego": {
      "btc": "0.00000040172172191129439186433169",
      "usd": "0.0279524827287265644",
      "usdt": "0.028"
    },
    "eos": {
      "btc": "0.00001118938467566494629339258155",
      "usd": "0.77857647429049455627",
      "usdt": "0.7799"
    },
    "alice": {
      "btc": "0.00000172166452247697596513285009",
      "usd": "0.119796354551685276",
      "usdt": "0.12"
    },
    "ooki": {
      "btc": "0.00000000170731731812300116542341",
      "usd": "0.0001187980515970878987",
      "usdt": "0.000119"
    },
    "rif": {
      "btc": "0.0000009383071647499519009974033",
      "usd": "0.06528901323066847542",
      "usdt": "0.0654"
    },
    "rune": {
      "btc": "0.00000596843701125351667912721365",
      "usd": "0.4152940291125089568",
      "usdt": "0.416"
    },
    "hook": {
      "btc": "0.00000011190819396100343773363526",
      "usd": "0.00778676304585954294",
      "usdt": "0.0078"
    },
    "skl": {
      "btc": "0.00000008048781642579862636996074",
      "usd": "0.005600479575291286653",
      "usdt": "0.00561"
    },
    "alpaca": {
      "btc": "0.00000321951265703194505479842967",
      "usd": "0.22401918301165146612",
      "usdt": "0.2244"
    },
    "tom2": {
      "btc": "0.01002482209825281180097730286387",
      "usd": "697.544223465825440829",
      "usdt": "698.73"
    },
    "gtc": {
      "btc": "0.00000134863720927363117268739924",
      "usd": "0.0938404777321534662",
      "usdt": "0.094"
    },
    "tom3": {
      "btc": "0.01002381779394803356499764203465",
      "usd": "697.474342259003624418",
      "usdt": "698.66"
    },
    "xec": {
      "btc": "0.00000000009569585304101191406197",
      "usd": "0.000006658680707164506591",
      "usdt": "0.00000667"
    },
    "ygg": {
      "btc": "0.00000049210910934133563003380632",
      "usd": "0.03424179134269004139",
      "usdt": "0.0343"
    },
    "1inch": {
      "btc": "0.00000121520820878166553538960336",
      "usd": "0.08455626025439785731",
      "usdt": "0.0847"
    },
    "id": {
      "btc": "0.00000038020091538033219230017106",
      "usd": "0.02645502829683049845",
      "usdt": "0.0265"
    },
    "portal": {
      "btc": "0.00000010918222513374822578884158",
      "usd": "0.007597085484486041253",
      "usdt": "0.00761"
    },
    "zil": {
      "btc": "0.00000005423243245802474290168478",
      "usd": "0.003773585168378086194",
      "usdt": "0.00378"
    },
    "axs": {
      "btc": "0.00001576757758501830488067501875",
      "usd": "1.0971349471025176527",
      "usdt": "1.099"
    },
    "btxtest": {
      "btc": "0.00000134863720927363117268739923",
      "usd": "0.0938404777321534662",
      "usdt": "0.094"
    },
    "comp": {
      "btc": "0.00024892399554146277495879124229",
      "usd": "17.320556262264496155",
      "usdt": "17.35"
    },
    "io": {
      "btc": "0.00000231850822360232763304557146",
      "usd": "0.16132575746293617168",
      "usdt": "0.1616"
    },
    "xvg": {
      "btc": "0.00000004443329188425995470013697",
      "usd": "0.0030917442503880774981",
      "usdt": "0.003097"
    },
    "iq": {
      "btc": "0.00000001486370371071789249898027",
      "usd": "0.0010342418609628828828",
      "usdt": "0.001036"
    },
    "pundix": {
      "btc": "0.00000191391706082023828123935168",
      "usd": "0.13317361414329013182",
      "usdt": "0.1334"
    },
    "unfi": {
      "btc": "0.00001923960103868020641035959976",
      "usd": "1.3387242621150829593",
      "usdt": "1.341"
    },
    "cream": {
      "btc": "0.00003012912914334707938982487659",
      "usd": "2.09643620465449233",
      "usdt": "2.1"
    },
    "forth": {
      "btc": "0.00000340028743189202753113737893",
      "usd": "0.2365978002395784201",
      "usdt": "0.237"
    },
    "clv": {
      "btc": "0.00000042137739187623986746626506",
      "usd": "0.029320157776524971301",
      "usdt": "0.02937"
    },
    "powr": {
      "btc": "0.00000085222393862610310274076079",
      "usd": "0.05929919550308421162",
      "usdt": "0.0594"
    },
    "zk": {
      "btc": "0.00000019397420286573929207163444",
      "usd": "0.013497055946156541096",
      "usdt": "0.01352"
    },
    "ctxc": {
      "btc": "0.00000090961275604200230157852246",
      "usd": "0.06329240732147372082",
      "usdt": "0.0634"
    },
    "ghst": {
      "btc": "0.00000154949807022927836861956508",
      "usd": "0.1078167190965167484",
      "usdt": "0.108"
    },
    "xvs": {
      "btc": "0.00003758967540741397523873389365",
      "usd": "2.615553741045128526",
      "usdt": "2.62"
    },
    "slp": {
      "btc": "0.00000000855093379496898062682649",
      "usd": "0.0005949885609400368708",
      "usdt": "0.000596"
    },
    "hft": {
      "btc": "0.00000015208036615213287692006842",
      "usd": "0.01058201131873219938",
      "usdt": "0.0106"
    },
    "beamx": {
      "btc": "0.00000002397417847549189031447494",
      "usd": "0.0016681642371322174683",
      "usdt": "0.001671"
    },
    "idex": {
      "btc": "0.00000002855093666440985142178643",
      "usd": "0.001986622879648780827",
      "usdt": "0.00199"
    },
    "hive": {
      "btc": "0.00000082639897078894846326376804",
      "usd": "0.05750225018480893248",
      "usdt": "0.0576"
    },
    "kmd": {
      "btc": "0.0000002338594309697892352638788",
      "usd": "0.01627233815993724999",
      "usdt": "0.0163"
    },
    "city": {
      "btc": "0.00000615495066785518907534993907",
      "usd": "0.4282719675222748617",
      "usdt": "0.429"
    },
    "steem": {
      "btc": "0.00000073400297474935075313497176",
      "usd": "0.051073179157201822668",
      "usdt": "0.05116"
    },
    "celr": {
      "btc": "0.00000003342898614476128332299617",
      "usd": "0.002326045884211889109",
      "usdt": "0.00233"
    },
    "dot": {
      "btc": "0.00010489241103190976067571889175",
      "usd": "7.2985929010614254403",
      "usdt": "7.311"
    },
    "celo": {
      "btc": "0.00000103758981887945751498673099",
      "usd": "0.072197269676482326336",
      "usdt": "0.07232"
    },
    "rdnt": {
      "btc": "0.00000004705883028103734304696457",
      "usd": "0.003274433691079397544",
      "usdt": "0.00328"
    },
    "ton": {
      "btc": "0.00002606887031117221107205323846",
      "usd": "1.8139164685034345541",
      "usdt": "1.817"
    },
    "pros": {
      "btc": "0.00000053371600196786254919118353",
      "usd": "0.03713686991102243556",
      "usdt": "0.0372"
    },
    "prom": {
      "btc": "0.0000151506477977973884931690808",
      "usd": "1.0542079200548304288",
      "usdt": "1.056"
    },
    "ftm": {
      "btc": "0.00001003443472516997491678262795",
      "usd": "0.69821308644540568362",
      "usdt": "0.6994"
    },
    "knc": {
      "btc": "0.0000019626975556237526002514491",
      "usd": "0.13656784418892121464",
      "usdt": "0.1368"
    },
    "mav": {
      "btc": "0.00000017819227807636701239124998",
      "usd": "0.012398922696099426066",
      "usdt": "0.01242"
    },
    "bifi": {
      "btc": "0.00046054525976259107067303739929",
      "usd": "32.04552484257581133",
      "usdt": "32.1"
    },
    "ftt": {
      "btc": "0.00000423529472529336087422681122",
      "usd": "0.29469903219714577896",
      "usdt": "0.2952"
    },
    "rlc": {
      "btc": "0.00000624103389397903787360658158",
      "usd": "0.4342617852498591255",
      "usdt": "0.435"
    },
    "pha": {
      "btc": "0.0000005911048193837617480289452",
      "usd": "0.04113008172941194476",
      "usdt": "0.0412"
    },
    "manta": {
      "btc": "0.00000109096141907624376990584934",
      "usd": "0.075910956667584569892",
      "usdt": "0.07604"
    },
    "phb": {
      "btc": "0.00000021520806530962199564160626",
      "usd": "0.0149745443189606595",
      "usdt": "0.015"
    },
    "xaut": {
      "btc": "0.06301435624309271780383325736489",
      "usd": "4384.64640688714083933",
      "usdt": "4392.1"
    },
    "blz": {
      "btc": "0.00000083500729340133334308943229",
      "usd": "0.05810123195756735886",
      "usdt": "0.0582"
    },
    "lpt": {
      "btc": "0.00003011478193899310459011543617",
      "usd": "2.0954379016998949527",
      "usdt": "2.099"
    },
    "gft": {
      "btc": "0.00000002812052053379060743050322",
      "usd": "0.001956673791010859508",
      "usdt": "0.00196"
    },
    "api3": {
      "btc": "0.00000436585428491453155158271902",
      "usd": "0.30378358908398191239",
      "usdt": "0.3043"
    },
    "voxel": {
      "btc": "0.00000020086086095564719593216584",
      "usd": "0.0139762413643632822",
      "usdt": "0.014"
    },
    "waxp": {
      "btc": "0.00000008407461751429232629732085",
      "usd": "0.005850055313940630978",
      "usdt": "0.00586"
    },
    "mbl": {
      "btc": "0.00000001215208208781665535389603",
      "usd": "0.0008455626025439785731",
      "usdt": "0.000847"
    },
    "snt": {
      "btc": "0.00000039024395842811455209677935",
      "usd": "0.02715384036504866256",
      "usdt": "0.0272"
    },
    "glmr": {
      "btc": "0.00000017503589311849255645517309",
      "usd": "0.01217929604608800306",
      "usdt": "0.0122"
    },
    "rose": {
      "btc": "0.00000012998567144701168536753018",
      "usd": "0.009044624768652238338",
      "usdt": "0.00906"
    },
    "snx": {
      "btc": "0.00000428981410183846511312268481",
      "usd": "0.2984925834246158127",
      "usdt": "0.299"
    },
    "atom": {
      "btc": "0.00002946915774306423860319061739",
      "usd": "2.0505142687430129742",
      "usdt": "2.054"
    },
    "fun": {
      "btc": "0.00000000490674388905938150062862",
      "usd": "0.0003414196104723030366",
      "usdt": "0.000342"
    },
    "arkm": {
      "btc": "0.00000195265451257597024045484081",
      "usd": "0.13586903212070305053",
      "usdt": "0.1361"
    },
    "magic": {
      "btc": "0.00000081348648687037114352527167",
      "usd": "0.05660377752567129291",
      "usdt": "0.0567"
    },
    "quick": {
      "btc": "0.00000011219513804808293372782406",
      "usd": "0.007806729104951490486",
      "usdt": "0.00782"
    },
    "data": {
      "btc": "0.00000001262553983149782374430757",
      "usd": "0.000878506600045692024",
      "usdt": "0.00088"
    },
    "cos": {
      "btc": "0.00000001682927070721244005917361",
      "usd": "0.0011710093657427235729",
      "usdt": "0.001173"
    },
    "usd": {
      "btc": "0.000014371593600823",
      "usd": "1",
      "usdt": "1.001699930261457685"
    },
    "qkc": {
      "btc": "0.00000003868006293831606001665137",
      "usd": "0.0026914247655945292008",
      "usdt": "0.002696"
    },
    "pyr": {
      "btc": "0.00000340028743189202753113737893",
      "usd": "0.2365978002395784201",
      "usdt": "0.237"
    },
    "dai": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "sol": {
      "btc": "0.00123256832604997504303802626055",
      "usd": "85.764206829460683843",
      "usdt": "85.91"
    },
    "high": {
      "btc": "0.00000185078936166274916251781385",
      "usd": "0.1287810811430616717",
      "usdt": "0.129"
    },
    "burger": {
      "btc": "0.00000024677191488836655500237518",
      "usd": "0.01717081081907488956",
      "usdt": "0.0172"
    },
    "lazio": {
      "btc": "0.00000720229658569534945413908955",
      "usd": "0.5011480832078834046",
      "usdt": "0.502"
    },
    "dar": {
      "btc": "0.00000311434764911730977292823141",
      "usd": "0.216701622354452690511",
      "usdt": "0.21707"
    },
    "etc": {
      "btc": "0.00011764707570259335761741142287",
      "usd": "8.18608422769849386",
      "usdt": "8.2"
    },
    "ogn": {
      "btc": "0.0000002955524096918808740144726",
      "usd": "0.02056504086470597238",
      "usdt": "0.0206"
    },
    "bnb": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "usdt": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "0.9983029545973773",
      "usdt": "1"
    },
    "eth": {
      "btc": "0.02862525518296344088428133203462",
      "usd": "1991.794088953595241414",
      "usdt": "1995.18"
    },
    "neo": {
      "btc": "0.00003832138282946669002391535494",
      "usd": "2.6664671917295947683",
      "usdt": "2.671"
    },
    "lrc": {
      "btc": "0.00000026958396981118648654038544",
      "usd": "0.018758112516884719467",
      "usdt": "0.01879"
    },
    "ordi": {
      "btc": "0.00038436160464298488421590878268",
      "usd": "26.744536153663737867",
      "usdt": "26.79"
    },
    "saga": {
      "btc": "0.00000026269731172127858267985404",
      "usd": "0.018278927098677978363",
      "usdt": "0.01831"
    },
    "usdn": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "0.9983029545973773",
      "usdt": "1"
    },
    "pengu": {
      "btc": "0.00000011344334482687874130254538",
      "usd": "0.0078935814620014623111",
      "usdt": "0.007907"
    },
    "lista": {
      "btc": "0.00000090100443342961742175285821",
      "usd": "0.06269342554871529444",
      "usdt": "0.0628"
    },
    "spell": {
      "btc": "0.00000000212769040569446279691001",
      "usd": "0.00014804832816679105359",
      "usdt": "0.0001483"
    },
    "tao": {
      "btc": "0.00376470642248298744375716553187",
      "usd": "261.95469528635180352",
      "usdt": "262.4"
    },
    "mtl": {
      "btc": "0.00000394548119734306992009611479",
      "usd": "0.2745333125142787575",
      "usdt": "0.275"
    },
    "trb": {
      "btc": "0.00023400290301332898326097320817",
      "usd": "16.282321189483223763",
      "usdt": "16.31"
    },
    "alt": {
      "btc": "0.00000010358681543569805390215981",
      "usd": "0.007207747332193064106",
      "usdt": "0.00722"
    },
    "bnt": {
      "btc": "0.00000460975675893210314664320612",
      "usd": "0.32075473931213732649",
      "usdt": "0.3213"
    },
    "oxt": {
      "btc": "0.00000013486372092736311726873992",
      "usd": "0.00938404777321534662",
      "usdt": "0.0094"
    },
    "lever": {
      "btc": "0.00000000251076076194558994915207",
      "usd": "0.0001747030170545410275",
      "usdt": "0.000175"
    },
    "usdc": {
      "btc": "0.00001436442099919956946909174592",
      "usd": "0.99950091814289415276",
      "usdt": "1.0012"
    },
    "utk": {
      "btc": "0.00000011406027461409965769005132",
      "usd": "0.007936508489049149535",
      "usdt": "0.00795"
    },
    "bnx": {
      "btc": "0.00002556528343834769560225187981",
      "usd": "1.77887603479706661087",
      "usdt": "1.7819"
    },
    "aergo": {
      "btc": "0.00000091104747647739978154946651",
      "usd": "0.06339223761693345855",
      "usdt": "0.0635"
    },
    "ilv": {
      "btc": "0.00005652798515466071085519524465",
      "usd": "3.933313641113666562",
      "usdt": "3.94"
    },
    "hifi": {
      "btc": "0.00000182209495295479956309893301",
      "usd": "0.1267844752338669171",
      "usdt": "0.127"
    },
    "egld": {
      "btc": "0.00005078910341307079097141907768",
      "usd": "3.533992459274715642",
      "usdt": "3.54"
    },
    "tru": {
      "btc": "0.00000003299857001414203933171296",
      "usd": "0.00229609679557396779",
      "usdt": "0.0023"
    },
    "alpine": {
      "btc": "0.00000569584012852799548464784572",
      "usd": "0.3963262729751587881",
      "usdt": "0.397"
    },
    "amb": {
      "btc": "0.00000000459110539327193590702093",
      "usd": "0.000319456945471160736",
      "usdt": "0.00032"
    },
    "edu": {
      "btc": "0.00000062410338939790378736065816",
      "usd": "0.04342617852498591255",
      "usdt": "0.0435"
    },
    "nfp": {
      "btc": "0.00000013601149727568110124549516",
      "usd": "0.009463912009583136804",
      "usdt": "0.00948"
    },
    "ustc": {
      "btc": "0.00000008766141860278602622468095",
      "usd": "0.006099631052589975303",
      "usdt": "0.00611"
    },
    "trx": {
      "btc": "0.00000507891034130707909714190777",
      "usd": "0.3533992459274715642",
      "usdt": "0.354"
    },
    "dash": {
      "btc": "0.00056987095693987904445897338005",
      "usd": "39.652593356607826356",
      "usdt": "39.72"
    },
    "nuls": {
      "btc": "0.00000037015787233254983250356277",
      "usd": "0.02575621622861233434",
      "usdt": "0.0258"
    },
    "mdx": {
      "btc": "0.0000004949785502121305899756944",
      "usd": "0.03444145193360951685",
      "usdt": "0.0345"
    },
    "joe": {
      "btc": "0.00000054519376545104238895873586",
      "usd": "0.0379355122747003374",
      "usdt": "0.038"
    },
    "pond": {
      "btc": "0.00000002539455170653539548570954",
      "usd": "0.001766996229637357821",
      "usdt": "0.00177"
    },
    "lina": {
      "btc": "0.00000000483500786728950750208142",
      "usd": "0.0003364280956993161501",
      "usdt": "0.000337"
    },
    "lsk": {
      "btc": "0.0000015638452745832531683290055",
      "usd": "0.1088150220511141257",
      "usdt": "0.109"
    },
    "amp": {
      "btc": "0.00000001050215358710955338731039",
      "usd": "0.0007307577627652801836",
      "usdt": "0.000732"
    },
    "pendle": {
      "btc": "0.0000223959859965546623464364916",
      "usd": "1.5583509121265059653",
      "usdt": "1.561"
    },
    "dydx": {
      "btc": "0.00000222152112216945798700975423",
      "usd": "0.154577229489857901132",
      "usdt": "0.15484"
    },
    "busd": {
      "btc": "0.00001435150851528099214935324955",
      "usd": "0.99860244548375651319",
      "usdt": "1.0003"
    },
    "akro": {
      "btc": "0.00000001407460747124927851496105",
      "usd": "0.0009793351984600271313",
      "usdt": "0.000981"
    },
    "alcx": {
      "btc": "0.00005839312172067743481742249891",
      "usd": "4.063093025211325611",
      "usdt": "4.07"
    },
    "qtum": {
      "btc": "0.00001228120692700242855128099731",
      "usd": "0.8545473291353549688",
      "usdt": "0.856"
    },
    "arpa": {
      "btc": "0.00000014246773923496976111474335",
      "usd": "0.009913148339151956589",
      "usdt": "0.00993"
    },
    "coti": {
      "btc": "0.0000001614060489822164967312047",
      "usd": "0.011230908239220494625",
      "usdt": "0.01125"
    },
    "dcr": {
      "btc": "0.00022812054922819931538010263703",
      "usd": "15.87301697809829907",
      "usdt": "15.9"
    },
    "og": {
      "btc": "0.00003967002003874032119660275418",
      "usd": "2.7603076694617482345",
      "usdt": "2.765"
    },
    "ethfi": {
      "btc": "0.00000533716001967862549191183528",
      "usd": "0.3713686991102243556",
      "usdt": "0.372"
    },
    "flux": {
      "btc": "0.00000097417517563488890027100434",
      "usd": "0.06778477061716191867",
      "usdt": "0.0679"
    },
    "ltc": {
      "btc": "0.00185667171544787883039868441832",
      "usd": "129.190385354446596393",
      "usdt": "129.41"
    },
    "win": {
      "btc": "0.00000000027560979563985590241835",
      "usd": "0.000019177399757815617933",
      "usdt": "0.00001921"
    },
    "beta": {
      "btc": "0.00000000516499356743092789539855",
      "usd": "0.000359389063655055828",
      "usdt": "0.00036"
    },
    "om": {
      "btc": "0.00000095982797128091410056156393",
      "usd": "0.06678646766256454137",
      "usdt": "0.0669"
    },
    "fxs": {
      "btc": "0.00001164992993542753736406561895",
      "usd": "0.8106219991330703676",
      "usdt": "0.812"
    },
    "pla": {
      "btc": "0.00000336728886187788549180566597",
      "usd": "0.23430170344400445231",
      "usdt": "0.2347"
    },
    "ant": {
      "btc": "0.00010626974264989134144782517185",
      "usd": "7.3944299847027736611",
      "usdt": "7.407"
    },
    "vgx": {
      "btc": "0.00000025824967837154639476992751",
      "usd": "0.0179694531827527914",
      "usdt": "0.018"
    },
    "lto": {
      "btc": "0.00000005451937654510423889587359",
      "usd": "0.00379355122747003374",
      "usdt": "0.0038"
    },
    "crv": {
      "btc": "0.00000304160732304265753840136849",
      "usd": "0.2116402263746439876",
      "usdt": "0.212"
    },
    "aeur": {
      "btc": "0.00001646772115749227510649571112",
      "usd": "1.14585213128686966494",
      "usdt": "1.1478"
    },
    "movr": {
      "btc": "0.00002563845418055296708077002594",
      "usd": "1.7839673798655132351",
      "usdt": "1.787"
    },
    "srm": {
      "btc": "0.00000350674368819852054498142683",
      "usd": "0.244005208162690959666",
      "usdt": "0.24442"
    },
    "badger": {
      "btc": "0.00001093256971772879737859359808",
      "usd": "0.7607068514032015026",
      "usdt": "0.762"
    },
    "rpl": {
      "btc": "0.00002324247105343917552929347623",
      "usd": "1.617250786447751226",
      "usdt": "1.62"
    },
    "super": {
      "btc": "0.00000158967024242040780780599825",
      "usd": "0.11061196736938940484",
      "usdt": "0.1108"
    },
    "aevo": {
      "btc": "0.00000033142042057681787328807364",
      "usd": "0.02306079825119941563",
      "usdt": "0.0231"
    },
    "pols": {
      "btc": "0.00000441750422058884083053670452",
      "usd": "0.30737747972053247067",
      "usdt": "0.3079"
    },
    "cyber": {
      "btc": "0.00000626972830268698747302546241",
      "usd": "0.4362583911590538801",
      "usdt": "0.437"
    },
    "qnt": {
      "btc": "0.00100631291338779245162015087807",
      "usd": "70.020969235460043822",
      "usdt": "70.14"
    },
    "ldo": {
      "btc": "0.00000455667210282239638771827657",
      "usd": "0.31706101838012703048",
      "usdt": "0.3176"
    },
    "bake": {
      "btc": "0.00000074461990597129210491995766",
      "usd": "0.05181192334360388187",
      "usdt": "0.0519"
    },
    "agix": {
      "btc": "0.00000881061819377592450156736034",
      "usd": "0.61305784441824939993",
      "usdt": "0.6141"
    },
    "xlm": {
      "btc": "0.0000024849357941084353096750803",
      "usd": "0.17290607173626574836",
      "usdt": "0.1732"
    },
    "stmx": {
      "btc": "0.00000006549498787589496067359551",
      "usd": "0.0045572529877370273745",
      "usdt": "0.004565"
    },
    "front": {
      "btc": "0.00001262553983149782374430756733",
      "usd": "0.878506600045692024",
      "usdt": "0.88"
    },
    "gala": {
      "btc": "0.00000004332855714900389512251006",
      "usd": "0.003014874922884079446",
      "usdt": "0.00302"
    },
    "rndr": {
      "btc": "0.00010086084660844284195736613449",
      "usd": "7.018069770819562419",
      "usdt": "7.03"
    }
  },
  "ts": 1779962660904
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.031837" elapsed="0.000595"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:21.033621" level="INFO">${data} = {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.00888489629591665797', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00006370158733164811070991545336', 'usd': '4.432465118412355212', 'usdt': '4...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.032530" elapsed="0.001115"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.033738" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证价格转换列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.034046" elapsed="0.000137"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证价格转换字典结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($convert_dict, dict)</arg>
<arg>价格转换数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.034882" elapsed="0.000168"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:21.035368" level="INFO">${dict_keys} = ['1inch', 'aave', 'aca', 'acm', 'adx', 'aergo', 'aeur', 'aevo', 'agix', 'agld', 'ai', 'akro', 'alcx', 'algo', 'alice', 'alpaca', 'alpha', 'alpine', 'alt', 'amb', 'amp', 'ankr', 'ant', 'ape', 'api3', '...</msg>
<var>${dict_keys}</var>
<arg>${convert_dict}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:21.035141" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.035609" level="INFO">价格转换字典包含字段: ['1inch', 'aave', 'aca', 'acm', 'adx', 'aergo', 'aeur', 'aevo', 'agix', 'agld', 'ai', 'akro', 'alcx', 'algo', 'alice', 'alpaca', 'alpha', 'alpine', 'alt', 'amb', 'amp', 'ankr', 'ant', 'ape', 'api3', 'apt', 'arb', 'ardr', 'ark', 'arkm', 'arpa', 'asr', 'ast', 'astr', 'ata', 'atm', 'atom', 'auction', 'audio', 'axs', 'badger', 'bake', 'bal', 'band', 'bar', 'bat', 'bb', 'beamx', 'bel', 'beta', 'bico', 'bifi', 'bigtime', 'blur', 'blz', 'bnb', 'bnt', 'bnx', 'bome', 'bond', 'bsw', 'btc', 'btt', 'bttc', 'btx', 'btxtest', 'btxtest2', 'burger', 'busd', 'c98', 'cake', 'celo', 'celr', 'cfx', 'chess', 'chr', 'chz', 'city', 'ckb', 'clv', 'combo', 'comp', 'cos', 'coti', 'cream', 'crv', 'ctk', 'ctsi', 'ctxc', 'cvc', 'cvp', 'cvx', 'cyber', 'dai', 'dar', 'dash', 'data', 'dcr', 'dego', 'dent', 'dexe', 'df', 'dgb', 'dia', 'dock', 'dodo', 'doge', 'dot', 'dusk', 'dydx', 'edu', 'egld', 'elf', 'enj', 'ens', 'eos', 'etc', 'eth', 'ethfi', 'farm', 'fida', 'fio', 'fis', 'flm', 'flux', 'for', 'forth', 'front', 'ftm', 'ftt', 'fun', 'fxs', 'gal', 'gala', 'gft', 'ghst', 'glm', 'glmr', 'gm', 'gmt', 'gmx', 'gno', 'gns', 'gtc', 'hbar', 'hft', 'hifi', 'high', 'hive', 'hook', 'icx', 'id', 'idex', 'ilv', 'io', 'iost', 'iotx', 'iq', 'iris', 'jasmy', 'joe', 'jst', 'jup', 'juv', 'kava', 'kda', 'key', 'kmd', 'knc', 'kp3r', 'ksm', 'lazio', 'ldo', 'lever', 'lina', 'lista', 'lit', 'loka', 'loom', 'lpt', 'lqty', 'lrc', 'lsk', 'ltc', 'lto', 'luna', 'lunc', 'magic', 'mana', 'manta', 'mask', 'matic', 'mav', 'mbl', 'mbox', 'mdx', 'meme', 'metis', 'mina', 'movr', 'mtl', 'near', 'neo', 'nexo', 'nfp', 'nkn', 'nmr', 'not', 'ntrn', 'nuls', 'oax', 'ocean', 'og', 'ogn', 'om', 'omg', 'one', 'ong', 'ont', 'ooki', 'ordi', 'orn', 'osmo', 'oxt', 'paxg', 'pda', 'pendle', 'pengu', 'people', 'pepe', 'perp', 'pha', 'phb', 'pivx', 'pixel', 'pla', 'pol', 'pols', 'polyx', 'pond', 'portal', 'porto', 'powr', 'prom', 'pros', 'psg', 'pundix', 'pyr', 'pyth', 'qi', 'qkc', 'qnt', 'qtum', 'quick', 'rad', 'rare', 'ray', 'rdnt', 'reef', 'rei', 'ren', 'rep', 'req', 'rif', 'rlc', 'rndr', 'rose', 'rpl', 'rsr', 'rune', 'rvn', 'saga', 'sand', 'sc', 'sei', 'sfp', 'shib', 'skl', 'slp', 'snt', 'snx', 'sol', 'spell', 'srm', 'ssv', 'steem', 'stg', 'stmx', 'storj', 'stpt', 'strax', 'sui', 'super', 'sxp', 'syn', 'sys', 't', 'tao', 'theta', 'tia', 'tko', 'tlm', 'tnsr', 'tom2', 'tom3', 'ton', 'trb', 'troy', 'tru', 'trx', 'tusd', 'twt', 'uft', 'uma', 'unfi', 'usd', 'usdc', 'usdn', 'usdt', 'ustc', 'utk', 'vanry', 'vgx', 'vib', 'vic', 'vidt', 'vite', 'voxel', 'vtho', 'w', 'wan', 'waves', 'waxp', 'win', 'wing', 'wld', 'woo', 'xai', 'xaut', 'xec', 'xlm', 'xmr', 'xrp', 'xtz', 'xvg', 'xvs', 'yfi', 'yfii', 'ygg', 'zec', 'zil', 'zk', 'zro', 'zrx']</msg>
<arg>价格转换字典包含字段: ${dict_keys}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.035471" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.036020" level="FAIL">Dictionary does not contain key 'rates'.</msg>
<arg>${convert_dict}</arg>
<arg>rates</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.035858" elapsed="0.000225">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-05-28T18:04:21.036157" level="INFO">${has_rates} = False</msg>
<var>${has_rates}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>rates</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.035747" elapsed="0.000430"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.036510" level="FAIL">Dictionary does not contain key 'base'.</msg>
<arg>${convert_dict}</arg>
<arg>base</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.036376" elapsed="0.000176">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-05-28T18:04:21.036623" level="INFO">${has_base} = False</msg>
<var>${has_base}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>base</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.036269" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.036967" level="FAIL">Dictionary does not contain key 'timestamp'.</msg>
<arg>${convert_dict}</arg>
<arg>timestamp</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.036840" elapsed="0.000168">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T18:04:21.037077" level="INFO">${has_timestamp} = False</msg>
<var>${has_timestamp}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>timestamp</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.036733" elapsed="0.000363"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.037415" level="FAIL">Dictionary does not contain key 'date'.</msg>
<arg>${convert_dict}</arg>
<arg>date</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.037290" elapsed="0.000165">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-05-28T18:04:21.037523" level="INFO">${has_date} = False</msg>
<var>${has_date}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>date</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.037184" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.037865" level="FAIL">Dictionary does not contain key 'success'.</msg>
<arg>${convert_dict}</arg>
<arg>success</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.037753" elapsed="0.000149">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-05-28T18:04:21.037964" level="INFO">${has_success} = False</msg>
<var>${has_success}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>success</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.037653" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.038144" level="INFO">价格转换包含汇率(rates): False</msg>
<arg>价格转换包含汇率(rates): ${has_rates}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.038057" elapsed="0.000116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.038330" level="INFO">价格转换包含基础货币(base): False</msg>
<arg>价格转换包含基础货币(base): ${has_base}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.038244" elapsed="0.000113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.038513" level="INFO">价格转换包含时间戳(timestamp): False</msg>
<arg>价格转换包含时间戳(timestamp): ${has_timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.038425" elapsed="0.000118"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.038694" level="INFO">价格转换包含日期(date): False</msg>
<arg>价格转换包含日期(date): ${has_date}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.038612" elapsed="0.000111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.038877" level="INFO">价格转换包含成功标记(success): False</msg>
<arg>价格转换包含成功标记(success): ${has_success}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.038792" elapsed="0.000112"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_rates}</arg>
<arg>验证汇率结构</arg>
<arg>${convert_dict['rates']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.038978" elapsed="0.000075"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_base}</arg>
<arg>验证基础货币</arg>
<arg>${convert_dict['base']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.039133" elapsed="0.000071"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_success}</arg>
<arg>验证成功标记</arg>
<arg>${convert_dict['success']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.039282" elapsed="0.000164"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:21.034575" elapsed="0.004919"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证价格转换字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.034280" elapsed="0.005249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.039971" level="INFO">获取货币价格转换 /v1/spot/balance/public/price/currency/convert status=200</msg>
<arg>获取货币价格转换 /v1/spot/balance/public/price/currency/convert status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.039605" elapsed="0.000397"/>
</kw>
<doc>验证货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T18:04:20.586686" elapsed="0.453412"/>
</test>
<test id="s1-s4-s1-s2-t2" name="获取单一货币价格转换" line="37">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.041297" level="INFO">&amp;{params} = { converts=usd }</msg>
<var>&amp;{params}</var>
<arg>converts=usd</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.041151" elapsed="0.000165"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.042483" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.042004" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.042973" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.042599" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.042582" elapsed="0.000450"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:21.043056" elapsed="0.000021"/>
</return>
<msg time="2026-05-28T18:04:21.043196" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.041466" elapsed="0.001748"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:21.183523" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/balance/public/price/currency/convert?converts=usd 
 path_url=/v1/spot/balance/public/price/currency/convert?converts=usd 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:21.184059" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/balance/public/price/currency/convert?converts=usd 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:21 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'c84dbfced55b8b52826b347d5800b630', 'X-Transparent': '00-c84dbfced55b8b52826b347d5800b630-806e4914d488dbf3-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f47fb620655-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"usd":"0.00888489629591665797"},"ksm":{"usd":"4.432465118412355212"},"vanry":{"usd":"0.0044773887513692371905"},"pyth":{"usd":"0.03853449404745876378"},"bal":{"usd":"0.9653589570956638491"},"fio":{"usd":"0.000938404777321534662"},"mbox":{"usd":"0.01048218102327246165"},"theta":{"usd":"0.1816911377367226686"},"vib":{"usd":"0.002226215588752151379"},"fis":{"usd":"0.01906758643280990643"},"vic":{"usd":"0.05231107482090257052"},"bar":{"usd":"0.3643805784280427145"},"stpt":{"usd":"0.070300494062747309466"},"rad":{"usd":"0.259558768195318098"},"bat":{"usd":"0.10162724077801300914"},"cake":{"usd":"1.3357293532512908274"},"ssv":{"usd":"2.3430170344400445231"},"ape":{"usd":"0.12388939666553452293"},"qi":{"usd":"0.001467505343258144631"},"farm":{"usd":"5.79015713666478834"},"ctk":{"usd":"0.15084357643966371003"},"band":{"usd":"0.1876809554643069324"},"iotx":{"usd":"0.003963262729751587881"},"near":{"usd":"5.2620548736827757483"},"shib":{"usd":"0.000008495558143623680823"},"xmr":{"usd":"118.49856071070868551"},"dock":{"usd":"0.00389338152292977147"},"astr":{"usd":"0.0070829594628683919435"},"waves":{"usd":"1.0741739791467779748"},"reef":{"usd":"0.0006868324327629955824"},"iris":{"usd":"0.005201158393452335733"},"apt":{"usd":"0.928421747775560889"},"stg":{"usd":"0.15813118800822456432"},"ai":{"usd":"0.0239592709103370552"},"combo":{"usd":"0.02755316154688761348"},"dent":{"usd":"0.0000379355122747003374"},"kda":{"usd":"0.0059898177275842638"},"metis":{"usd":"3.034840981976026992"},"glm":{"usd":"0.12808226907484350759"},"loka":{"usd":"0.12349007548369557201"},"ray":{"usd":"0.7077967948095405057"},"wld":{"usd":"0.30817612208421037251"},"agld":{"usd":"0.2146351352384361195"},"iost":{"usd":"0.0009933114398243904135"},"zro":{"usd":"1.1450534889231917631"},"wing":{"usd":"0.3254467631987449998"},"dgb":{"usd":"0.003254467631987449998"},"bb":{"usd":"0.02685434947866944937"},"zrx":{"usd":"0.09843267132330140178"},"sui":{"usd":"0.92123396650245977244"},"bsw":{"usd":"0.01118099309149062576"},"omg":{"usd":"0.3823500316107955059"},"blur":{"usd":"0.020734752366987526521"},"jst":{"usd":"0.095058407336762266506"},"pol":{"usd":"0.087920541211391018811"},"pivx":{"usd":"0.05830089254848683432"},"gmt":{"usd":"0.010392333757358697693"},"nkn":{"usd":"0.00728761156856085429"},"porto":{"usd":"0.6758511002624244321"},"rsr":{"usd":"0.0015833084859914403978"},"sc":{"usd":"0.0008705201764089130056"},"twt":{"usd":"0.43775584559094994605"},"arb":{"usd":"0.1028252043235298619"},"btc":{"usd":"69581.705952407651836227"},"cvc":{"usd":"0.02715384036504866256"},"ardr":{"usd":"0.035569534272304553199"},"vite":{"usd":"0.000858540540953744478"},"gmx":{"usd":"6.069681963952053984"},"sei":{"usd":"0.068723175394483453332"},"matic":{"usd":"0.37875614097424494762"},"audio":{"usd":"0.018608367073695112872"},"ark":{"usd":"0.14545274048483787261"},"cvp":{"usd":"0.03384247016085109047"},"key":{"usd":"0.0012508736021105137569"},"btt":{"usd":"0"},"cvx":{"usd":"1.5104323703058318549"},"flm":{"usd":"0.01667165934177620091"},"one":{"usd":"0.001786962288729305367"},"btx":{"usd":"0.17959470153206817627"},"ong":{"usd":"0.061625241387296100729"},"gno":{"usd":"113.037843549061031679"},"storj":{"usd":"0.10142758018709353368"},"gns":{"usd":"0.4652091768423778218"},"people":{"usd":"0.006139563170773870395"},"tnsr":{"usd":"0.03524009429728741869"},"bttc":{"usd":"0.000000309473915925186963"},"vtho":{"usd":"0.0004702006916153647083"},"polyx":{"usd":"0.04771888122975463494"},"t":{"usd":"0.004721972975245594629"},"ont":{"usd":"0.052161329377712963925"},"mana":{"usd":"0.08265948464066284044"},"cfx":{"usd":"0.051073179157201822668"},"w":{"usd":"0.01128082338695036349"},"dodo":{"usd":"0.018179096803218240633"},"ankr":{"usd":"0.004432465118412355212"},"mina":{"usd":"0.05460717161647653831"},"sfp":{"usd":"0.26285316794548944309"},"dia":{"usd":"0.16082660598563748303"},"aca":{"usd":"0.00179694531827527914"},"algo":{"usd":"0.10562045259640251834"},"asr":{"usd":"1.0042927723249615638"},"df":{"usd":"0.001637216845539698772"},"ast":{"usd":"0.02605570711499154753"},"jup":{"usd":"0.179694531827527914"},"dusk":{"usd":"0.11889788189254763643"},"doge":{"usd":"0.098582416766491008375"},"bel":{"usd":"0.09533793216404953215"},"acm":{"usd":"0.3623839725188479599"},"juv":{"usd":"0.3983228788843535427"},"bome":{"usd":"0.0004921633566165070089"},"tia":{"usd":"0.41888791974905951508"},"ata":{"usd":"0.00119796354551685276"},"nmr":{"usd":"8.28591452315823159"},"loom":{"usd":"0.048228015736599297363"},"paxg":{"usd":"4392.093746928437273988"},"lit":{"usd":"0.7417390952658513339"},"woo":{"usd":"0.2116402263746439876"},"rei":{"usd":"0.004003194847935482973"},"rare":{"usd":"0.01477488372804118404"},"zec":{"usd":"533.013913518631688016"},"ren":{"usd":"0.042667468279491905802"},"atm":{"usd":"0.9793351984600271313"},"hbar":{"usd":"0.083647804565714243967"},"rep":{"usd":"4.721972975245594629"},"elf":{"usd":"0.22681443128452412256"},"pepe":{"usd":"0.000003364280956993161501"},"icx":{"usd":"0.03484077311544846777"},"req":{"usd":"0.06938205534451772235"},"xai":{"usd":"0.009344115655031451528"},"strax":{"usd":"0.011390636711956074993"},"chess":{"usd":"0.002805231302418630213"},"tusd":{"usd":"0.99810329400645782454"},"ctsi":{"usd":"0.027143857335502688787"},"sxp":{"usd":"0.00219626650011423006"},"rvn":{"usd":"0.005061395979808702911"},"chr":{"usd":"0.019117501580539775295"},"fida":{"usd":"0.028821006299226282651"},"ntrn":{"usd":"0.00159728472735580368"},"sand":{"usd":"0.067026060371667911922"},"osmo":{"usd":"0.05500649279831548923"},"kava":{"usd":"0.05400818984371811193"},"ocean":{"usd":"0.61126089909997412079"},"vidt":{"usd":"0.001148048397786983895"},"adx":{"usd":"0.07227713391285011652"},"chz":{"usd":"0.034131978017684329887"},"xrp":{"usd":"2.13407222604281345421"},"c98":{"usd":"0.01946690761464885735"},"psg":{"usd":"1.1310772475588284809"},"perp":{"usd":"0.1247878693246721625"},"for":{"usd":"0.003054807041067974538"},"uma":{"usd":"0.4232804527492879752"},"syn":{"usd":"0.04043126966119378065"},"jasmy":{"usd":"0.005300988688912073463"},"sys":{"usd":"0.002226215588752151379"},"lunc":{"usd":"0.000084286718456656565439"},"luna":{"usd":"0.0588998743212452607"},"auction":{"usd":"4.382549970682486347"},"not":{"usd":"0.0004332634822952617482"},"gal":{"usd":"2.5376861105865330966"},"yfii":{"usd":"434.76093672715781415"},"alpha":{"usd":"0.00968353865959455981"},"tko":{"usd":"0.05001497802532860273"},"pixel":{"usd":"0.006309274673055424536"},"nexo":{"usd":"0.8156135139060572541"},"bico":{"usd":"0.02326045884211889109"},"troy":{"usd":"0.0000688829038672190337"},"mask":{"usd":"0.4242787557038853525"},"enj":{"usd":"0.037755817742872809486"},"aave":{"usd":"81.082165972398984306"},"wan":{"usd":"0.05420785043463758739"},"gm":{"usd":"713.337376207555949715"},"oax":{"usd":"0.03573924577458610734"},"btxtest2":{"usd":"0.36817412965551274824"},"orn":{"usd":"1.0512130111910382969"},"ens":{"usd":"5.750225018480893248"},"pda":{"usd":"0.009753419866416376221"},"bond":{"usd":"2.1483479582935559496"},"tlm":{"usd":"0.0013357293532512908274"},"kp3r":{"usd":"16.452032691764777904"},"lqty":{"usd":"0.2365978002395784201"},"ckb":{"usd":"0.001257861722792695398"},"bigtime":{"usd":"0.011111111884668809349"},"yfi":{"usd":"2318.0594605751100906"},"xtz":{"usd":"0.30917442503880774981"},"dexe":{"usd":"16.5897984994992159714"},"meme":{"usd":"0.0004731956004791568402"},"dego":{"usd":"0.0279524827287265644"},"eos":{"usd":"0.77857647429049455627"},"alice":{"usd":"0.119796354551685276"},"ooki":{"usd":"0.0001187980515970878987"},"rif":{"usd":"0.06528901323066847542"},"rune":{"usd":"0.4152940291125089568"},"hook":{"usd":"0.00778676304585954294"},"skl":{"usd":"0.005600479575291286653"},"alpaca":{"usd":"0.22401918301165146612"},"tom2":{"usd":"697.544223465825440829"},"gtc":{"usd":"0.0938404777321534662"},"tom3":{"usd":"697.474342259003624418"},"xec":{"usd":"0.000006658680707164506591"},"ygg":{"usd":"0.03424179134269004139"},"1inch":{"usd":"0.08455626025439785731"},"id":{"usd":"0.02645502829683049845"},"portal":{"usd":"0.007597085484486041253"},"zil":{"usd":"0.003773585168378086194"},"axs":{"usd":"1.0971349471025176527"},"btxtest":{"usd":"0.0938404777321534662"},"comp":{"usd":"17.320556262264496155"},"io":{"usd":"0.16132575746293617168"},"xvg":{"usd":"0.0030917442503880774981"},"iq":{"usd":"0.0010342418609628828828"},"pundix":{"usd":"0.13317361414329013182"},"unfi":{"usd":"1.3387242621150829593"},"cream":{"usd":"2.09643620465449233"},"forth":{"usd":"0.2365978002395784201"},"clv":{"usd":"0.029320157776524971301"},"powr":{"usd":"0.05929919550308421162"},"zk":{"usd":"0.013497055946156541096"},"ctxc":{"usd":"0.06329240732147372082"},"ghst":{"usd":"0.1078167190965167484"},"xvs":{"usd":"2.615553741045128526"},"slp":{"usd":"0.0005949885609400368708"},"hft":{"usd":"0.01058201131873219938"},"beamx":{"usd":"0.0016681642371322174683"},"idex":{"usd":"0.001986622879648780827"},"hive":{"usd":"0.05750225018480893248"},"kmd":{"usd":"0.01627233815993724999"},"city":{"usd":"0.4282719675222748617"},"steem":{"usd":"0.051073179157201822668"},"celr":{"usd":"0.002326045884211889109"},"dot":{"usd":"7.2985929010614254403"},"celo":{"usd":"0.072197269676482326336"},"rdnt":{"usd":"0.003274433691079397544"},"ton":{"usd":"1.8139164685034345541"},"pros":{"usd":"0.03713686991102243556"},"prom":{"usd":"1.0542079200548304288"},"ftm":{"usd":"0.69821308644540568362"},"knc":{"usd":"0.13656784418892121464"},"mav":{"usd":"0.012398922696099426066"},"bifi":{"usd":"32.04552484257581133"},"ftt":{"usd":"0.29469903219714577896"},"rlc":{"usd":"0.4342617852498591255"},"pha":{"usd":"0.04113008172941194476"},"manta":{"usd":"0.075910956667584569892"},"phb":{"usd":"0.0149745443189606595"},"xaut":{"usd":"4384.64640688714083933"},"blz":{"usd":"0.05810123195756735886"},"lpt":{"usd":"2.0954379016998949527"},"gft":{"usd":"0.001956673791010859508"},"api3":{"usd":"0.30378358908398191239"},"voxel":{"usd":"0.0139762413643632822"},"waxp":{"usd":"0.005850055313940630978"},"mbl":{... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T18:04:21.184452" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:21.184793" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/balance/public/price/currency/convert</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:21.043286" elapsed="0.141570"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.186760" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:21.185362" elapsed="0.001553"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.189396" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'usd': '0.00888489629591665797'}, 'ksm': {'usd': '4.432465118412355212'}, 'vanry': {'usd': '0.0044773887513692371905'}, 'pyth': {'usd': '0...</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:21.187231" elapsed="0.002228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.189725" elapsed="0.000337"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.193760" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.00888489629591665797"
    },
    "ksm": {
      "usd": "4.432465118412355212"
    },
    "vanry": {
      "...</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:21.190310" elapsed="0.003497"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.194340" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.00888489629591665797"
    },
    "ksm": {
      "usd": "4.432465118412355212"
    },
    "vanry": {
      "usd": "0.0044773887513692371905"
    },
    "pyth": {
      "usd": "0.03853449404745876378"
    },
    "bal": {
      "usd": "0.9653589570956638491"
    },
    "fio": {
      "usd": "0.000938404777321534662"
    },
    "mbox": {
      "usd": "0.01048218102327246165"
    },
    "theta": {
      "usd": "0.1816911377367226686"
    },
    "vib": {
      "usd": "0.002226215588752151379"
    },
    "fis": {
      "usd": "0.01906758643280990643"
    },
    "vic": {
      "usd": "0.05231107482090257052"
    },
    "bar": {
      "usd": "0.3643805784280427145"
    },
    "stpt": {
      "usd": "0.070300494062747309466"
    },
    "rad": {
      "usd": "0.259558768195318098"
    },
    "bat": {
      "usd": "0.10162724077801300914"
    },
    "cake": {
      "usd": "1.3357293532512908274"
    },
    "ssv": {
      "usd": "2.3430170344400445231"
    },
    "ape": {
      "usd": "0.12388939666553452293"
    },
    "qi": {
      "usd": "0.001467505343258144631"
    },
    "farm": {
      "usd": "5.79015713666478834"
    },
    "ctk": {
      "usd": "0.15084357643966371003"
    },
    "band": {
      "usd": "0.1876809554643069324"
    },
    "iotx": {
      "usd": "0.003963262729751587881"
    },
    "near": {
      "usd": "5.2620548736827757483"
    },
    "shib": {
      "usd": "0.000008495558143623680823"
    },
    "xmr": {
      "usd": "118.49856071070868551"
    },
    "dock": {
      "usd": "0.00389338152292977147"
    },
    "astr": {
      "usd": "0.0070829594628683919435"
    },
    "waves": {
      "usd": "1.0741739791467779748"
    },
    "reef": {
      "usd": "0.0006868324327629955824"
    },
    "iris": {
      "usd": "0.005201158393452335733"
    },
    "apt": {
      "usd": "0.928421747775560889"
    },
    "stg": {
      "usd": "0.15813118800822456432"
    },
    "ai": {
      "usd": "0.0239592709103370552"
    },
    "combo": {
      "usd": "0.02755316154688761348"
    },
    "dent": {
      "usd": "0.0000379355122747003374"
    },
    "kda": {
      "usd": "0.0059898177275842638"
    },
    "metis": {
      "usd": "3.034840981976026992"
    },
    "glm": {
      "usd": "0.12808226907484350759"
    },
    "loka": {
      "usd": "0.12349007548369557201"
    },
    "ray": {
      "usd": "0.7077967948095405057"
    },
    "wld": {
      "usd": "0.30817612208421037251"
    },
    "agld": {
      "usd": "0.2146351352384361195"
    },
    "iost": {
      "usd": "0.0009933114398243904135"
    },
    "zro": {
      "usd": "1.1450534889231917631"
    },
    "wing": {
      "usd": "0.3254467631987449998"
    },
    "dgb": {
      "usd": "0.003254467631987449998"
    },
    "bb": {
      "usd": "0.02685434947866944937"
    },
    "zrx": {
      "usd": "0.09843267132330140178"
    },
    "sui": {
      "usd": "0.92123396650245977244"
    },
    "bsw": {
      "usd": "0.01118099309149062576"
    },
    "omg": {
      "usd": "0.3823500316107955059"
    },
    "blur": {
      "usd": "0.020734752366987526521"
    },
    "jst": {
      "usd": "0.095058407336762266506"
    },
    "pol": {
      "usd": "0.087920541211391018811"
    },
    "pivx": {
      "usd": "0.05830089254848683432"
    },
    "gmt": {
      "usd": "0.010392333757358697693"
    },
    "nkn": {
      "usd": "0.00728761156856085429"
    },
    "porto": {
      "usd": "0.6758511002624244321"
    },
    "rsr": {
      "usd": "0.0015833084859914403978"
    },
    "sc": {
      "usd": "0.0008705201764089130056"
    },
    "twt": {
      "usd": "0.43775584559094994605"
    },
    "arb": {
      "usd": "0.1028252043235298619"
    },
    "btc": {
      "usd": "69581.705952407651836227"
    },
    "cvc": {
      "usd": "0.02715384036504866256"
    },
    "ardr": {
      "usd": "0.035569534272304553199"
    },
    "vite": {
      "usd": "0.000858540540953744478"
    },
    "gmx": {
      "usd": "6.069681963952053984"
    },
    "sei": {
      "usd": "0.068723175394483453332"
    },
    "matic": {
      "usd": "0.37875614097424494762"
    },
    "audio": {
      "usd": "0.018608367073695112872"
    },
    "ark": {
      "usd": "0.14545274048483787261"
    },
    "cvp": {
      "usd": "0.03384247016085109047"
    },
    "key": {
      "usd": "0.0012508736021105137569"
    },
    "btt": {
      "usd": "0"
    },
    "cvx": {
      "usd": "1.5104323703058318549"
    },
    "flm": {
      "usd": "0.01667165934177620091"
    },
    "one": {
      "usd": "0.001786962288729305367"
    },
    "btx": {
      "usd": "0.17959470153206817627"
    },
    "ong": {
      "usd": "0.061625241387296100729"
    },
    "gno": {
      "usd": "113.037843549061031679"
    },
    "storj": {
      "usd": "0.10142758018709353368"
    },
    "gns": {
      "usd": "0.4652091768423778218"
    },
    "people": {
      "usd": "0.006139563170773870395"
    },
    "tnsr": {
      "usd": "0.03524009429728741869"
    },
    "bttc": {
      "usd": "0.000000309473915925186963"
    },
    "vtho": {
      "usd": "0.0004702006916153647083"
    },
    "polyx": {
      "usd": "0.04771888122975463494"
    },
    "t": {
      "usd": "0.004721972975245594629"
    },
    "ont": {
      "usd": "0.052161329377712963925"
    },
    "mana": {
      "usd": "0.08265948464066284044"
    },
    "cfx": {
      "usd": "0.051073179157201822668"
    },
    "w": {
      "usd": "0.01128082338695036349"
    },
    "dodo": {
      "usd": "0.018179096803218240633"
    },
    "ankr": {
      "usd": "0.004432465118412355212"
    },
    "mina": {
      "usd": "0.05460717161647653831"
    },
    "sfp": {
      "usd": "0.26285316794548944309"
    },
    "dia": {
      "usd": "0.16082660598563748303"
    },
    "aca": {
      "usd": "0.00179694531827527914"
    },
    "algo": {
      "usd": "0.10562045259640251834"
    },
    "asr": {
      "usd": "1.0042927723249615638"
    },
    "df": {
      "usd": "0.001637216845539698772"
    },
    "ast": {
      "usd": "0.02605570711499154753"
    },
    "jup": {
      "usd": "0.179694531827527914"
    },
    "dusk": {
      "usd": "0.11889788189254763643"
    },
    "doge": {
      "usd": "0.098582416766491008375"
    },
    "bel": {
      "usd": "0.09533793216404953215"
    },
    "acm": {
      "usd": "0.3623839725188479599"
    },
    "juv": {
      "usd": "0.3983228788843535427"
    },
    "bome": {
      "usd": "0.0004921633566165070089"
    },
    "tia": {
      "usd": "0.41888791974905951508"
    },
    "ata": {
      "usd": "0.00119796354551685276"
    },
    "nmr": {
      "usd": "8.28591452315823159"
    },
    "loom": {
      "usd": "0.048228015736599297363"
    },
    "paxg": {
      "usd": "4392.093746928437273988"
    },
    "lit": {
      "usd": "0.7417390952658513339"
    },
    "woo": {
      "usd": "0.2116402263746439876"
    },
    "rei": {
      "usd": "0.004003194847935482973"
    },
    "rare": {
      "usd": "0.01477488372804118404"
    },
    "zec": {
      "usd": "533.013913518631688016"
    },
    "ren": {
      "usd": "0.042667468279491905802"
    },
    "atm": {
      "usd": "0.9793351984600271313"
    },
    "hbar": {
      "usd": "0.083647804565714243967"
    },
    "rep": {
      "usd": "4.721972975245594629"
    },
    "elf": {
      "usd": "0.22681443128452412256"
    },
    "pepe": {
      "usd": "0.000003364280956993161501"
    },
    "icx": {
      "usd": "0.03484077311544846777"
    },
    "req": {
      "usd": "0.06938205534451772235"
    },
    "xai": {
      "usd": "0.009344115655031451528"
    },
    "strax": {
      "usd": "0.011390636711956074993"
    },
    "chess": {
      "usd": "0.002805231302418630213"
    },
    "tusd": {
      "usd": "0.99810329400645782454"
    },
    "ctsi": {
      "usd": "0.027143857335502688787"
    },
    "sxp": {
      "usd": "0.00219626650011423006"
    },
    "rvn": {
      "usd": "0.005061395979808702911"
    },
    "chr": {
      "usd": "0.019117501580539775295"
    },
    "fida": {
      "usd": "0.028821006299226282651"
    },
    "ntrn": {
      "usd": "0.00159728472735580368"
    },
    "sand": {
      "usd": "0.067026060371667911922"
    },
    "osmo": {
      "usd": "0.05500649279831548923"
    },
    "kava": {
      "usd": "0.05400818984371811193"
    },
    "ocean": {
      "usd": "0.61126089909997412079"
    },
    "vidt": {
      "usd": "0.001148048397786983895"
    },
    "adx": {
      "usd": "0.07227713391285011652"
    },
    "chz": {
      "usd": "0.034131978017684329887"
    },
    "xrp": {
      "usd": "2.13407222604281345421"
    },
    "c98": {
      "usd": "0.01946690761464885735"
    },
    "psg": {
      "usd": "1.1310772475588284809"
    },
    "perp": {
      "usd": "0.1247878693246721625"
    },
    "for": {
      "usd": "0.003054807041067974538"
    },
    "uma": {
      "usd": "0.4232804527492879752"
    },
    "syn": {
      "usd": "0.04043126966119378065"
    },
    "jasmy": {
      "usd": "0.005300988688912073463"
    },
    "sys": {
      "usd": "0.002226215588752151379"
    },
    "lunc": {
      "usd": "0.000084286718456656565439"
    },
    "luna": {
      "usd": "0.0588998743212452607"
    },
    "auction": {
      "usd": "4.382549970682486347"
    },
    "not": {
      "usd": "0.0004332634822952617482"
    },
    "gal": {
      "usd": "2.5376861105865330966"
    },
    "yfii": {
      "usd": "434.76093672715781415"
    },
    "alpha": {
      "usd": "0.00968353865959455981"
    },
    "tko": {
      "usd": "0.05001497802532860273"
    },
    "pixel": {
      "usd": "0.006309274673055424536"
    },
    "nexo": {
      "usd": "0.8156135139060572541"
    },
    "bico": {
      "usd": "0.02326045884211889109"
    },
    "troy": {
      "usd": "0.0000688829038672190337"
    },
    "mask": {
      "usd": "0.4242787557038853525"
    },
    "enj": {
      "usd": "0.037755817742872809486"
    },
    "aave": {
      "usd": "81.082165972398984306"
    },
    "wan": {
      "usd": "0.05420785043463758739"
    },
    "gm": {
      "usd": "713.337376207555949715"
    },
    "oax": {
      "usd": "0.03573924577458610734"
    },
    "btxtest2": {
      "usd": "0.36817412965551274824"
    },
    "orn": {
      "usd": "1.0512130111910382969"
    },
    "ens": {
      "usd": "5.750225018480893248"
    },
    "pda": {
      "usd": "0.009753419866416376221"
    },
    "bond": {
      "usd": "2.1483479582935559496"
    },
    "tlm": {
      "usd": "0.0013357293532512908274"
    },
    "kp3r": {
      "usd": "16.452032691764777904"
    },
    "lqty": {
      "usd": "0.2365978002395784201"
    },
    "ckb": {
      "usd": "0.001257861722792695398"
    },
    "bigtime": {
      "usd": "0.011111111884668809349"
    },
    "yfi": {
      "usd": "2318.0594605751100906"
    },
    "xtz": {
      "usd": "0.30917442503880774981"
    },
    "dexe": {
      "usd": "16.5897984994992159714"
    },
    "meme": {
      "usd": "0.0004731956004791568402"
    },
    "dego": {
      "usd": "0.0279524827287265644"
    },
    "eos": {
      "usd": "0.77857647429049455627"
    },
    "alice": {
      "usd": "0.119796354551685276"
    },
    "ooki": {
      "usd": "0.0001187980515970878987"
    },
    "rif": {
      "usd": "0.06528901323066847542"
    },
    "rune": {
      "usd": "0.4152940291125089568"
    },
    "hook": {
      "usd": "0.00778676304585954294"
    },
    "skl": {
      "usd": "0.005600479575291286653"
    },
    "alpaca": {
      "usd": "0.22401918301165146612"
    },
    "tom2": {
      "usd": "697.544223465825440829"
    },
    "gtc": {
      "usd": "0.0938404777321534662"
    },
    "tom3": {
      "usd": "697.474342259003624418"
    },
    "xec": {
      "usd": "0.000006658680707164506591"
    },
    "ygg": {
      "usd": "0.03424179134269004139"
    },
    "1inch": {
      "usd": "0.08455626025439785731"
    },
    "id": {
      "usd": "0.02645502829683049845"
    },
    "portal": {
      "usd": "0.007597085484486041253"
    },
    "zil": {
      "usd": "0.003773585168378086194"
    },
    "axs": {
      "usd": "1.0971349471025176527"
    },
    "btxtest": {
      "usd": "0.0938404777321534662"
    },
    "comp": {
      "usd": "17.320556262264496155"
    },
    "io": {
      "usd": "0.16132575746293617168"
    },
    "xvg": {
      "usd": "0.0030917442503880774981"
    },
    "iq": {
      "usd": "0.0010342418609628828828"
    },
    "pundix": {
      "usd": "0.13317361414329013182"
    },
    "unfi": {
      "usd": "1.3387242621150829593"
    },
    "cream": {
      "usd": "2.09643620465449233"
    },
    "forth": {
      "usd": "0.2365978002395784201"
    },
    "clv": {
      "usd": "0.029320157776524971301"
    },
    "powr": {
      "usd": "0.05929919550308421162"
    },
    "zk": {
      "usd": "0.013497055946156541096"
    },
    "ctxc": {
      "usd": "0.06329240732147372082"
    },
    "ghst": {
      "usd": "0.1078167190965167484"
    },
    "xvs": {
      "usd": "2.615553741045128526"
    },
    "slp": {
      "usd": "0.0005949885609400368708"
    },
    "hft": {
      "usd": "0.01058201131873219938"
    },
    "beamx": {
      "usd": "0.0016681642371322174683"
    },
    "idex": {
      "usd": "0.001986622879648780827"
    },
    "hive": {
      "usd": "0.05750225018480893248"
    },
    "kmd": {
      "usd": "0.01627233815993724999"
    },
    "city": {
      "usd": "0.4282719675222748617"
    },
    "steem": {
      "usd": "0.051073179157201822668"
    },
    "celr": {
      "usd": "0.002326045884211889109"
    },
    "dot": {
      "usd": "7.2985929010614254403"
    },
    "celo": {
      "usd": "0.072197269676482326336"
    },
    "rdnt": {
      "usd": "0.003274433691079397544"
    },
    "ton": {
      "usd": "1.8139164685034345541"
    },
    "pros": {
      "usd": "0.03713686991102243556"
    },
    "prom": {
      "usd": "1.0542079200548304288"
    },
    "ftm": {
      "usd": "0.69821308644540568362"
    },
    "knc": {
      "usd": "0.13656784418892121464"
    },
    "mav": {
      "usd": "0.012398922696099426066"
    },
    "bifi": {
      "usd": "32.04552484257581133"
    },
    "ftt": {
      "usd": "0.29469903219714577896"
    },
    "rlc": {
      "usd": "0.4342617852498591255"
    },
    "pha": {
      "usd": "0.04113008172941194476"
    },
    "manta": {
      "usd": "0.075910956667584569892"
    },
    "phb": {
      "usd": "0.0149745443189606595"
    },
    "xaut": {
      "usd": "4384.64640688714083933"
    },
    "blz": {
      "usd": "0.05810123195756735886"
    },
    "lpt": {
      "usd": "2.0954379016998949527"
    },
    "gft": {
      "usd": "0.001956673791010859508"
    },
    "api3": {
      "usd": "0.30378358908398191239"
    },
    "voxel": {
      "usd": "0.0139762413643632822"
    },
    "waxp": {
      "usd": "0.005850055313940630978"
    },
    "mbl": {
      "usd": "0.0008455626025439785731"
    },
    "snt": {
      "usd": "0.02715384036504866256"
    },
    "glmr": {
      "usd": "0.01217929604608800306"
    },
    "rose": {
      "usd": "0.009044624768652238338"
    },
    "snx": {
      "usd": "0.2984925834246158127"
    },
    "atom": {
      "usd": "2.0505142687430129742"
    },
    "fun": {
      "usd": "0.0003414196104723030366"
    },
    "arkm": {
      "usd": "0.13586903212070305053"
    },
    "magic": {
      "usd": "0.05660377752567129291"
    },
    "quick": {
      "usd": "0.007806729104951490486"
    },
    "data": {
      "usd": "0.000878506600045692024"
    },
    "cos": {
      "usd": "0.0011710093657427235729"
    },
    "usd": {
      "usd": "1"
    },
    "qkc": {
      "usd": "0.0026914247655945292008"
    },
    "pyr": {
      "usd": "0.2365978002395784201"
    },
    "dai": {
      "usd": "0"
    },
    "sol": {
      "usd": "85.764206829460683843"
    },
    "high": {
      "usd": "0.1287810811430616717"
    },
    "burger": {
      "usd": "0.01717081081907488956"
    },
    "lazio": {
      "usd": "0.5011480832078834046"
    },
    "dar": {
      "usd": "0.216701622354452690511"
    },
    "etc": {
      "usd": "8.18608422769849386"
    },
    "ogn": {
      "usd": "0.02056504086470597238"
    },
    "bnb": {
      "usd": "0"
    },
    "usdt": {
      "usd": "0.9983029545973773"
    },
    "eth": {
      "usd": "1991.794088953595241414"
    },
    "neo": {
      "usd": "2.6664671917295947683"
    },
    "lrc": {
      "usd": "0.018758112516884719467"
    },
    "ordi": {
      "usd": "26.744536153663737867"
    },
    "saga": {
      "usd": "0.018278927098677978363"
    },
    "usdn": {
      "usd": "0.9983029545973773"
    },
    "pengu": {
      "usd": "0.0078935814620014623111"
    },
    "lista": {
      "usd": "0.06269342554871529444"
    },
    "spell": {
      "usd": "0.00014804832816679105359"
    },
    "tao": {
      "usd": "261.95469528635180352"
    },
    "mtl": {
      "usd": "0.2745333125142787575"
    },
    "trb": {
      "usd": "16.282321189483223763"
    },
    "alt": {
      "usd": "0.007207747332193064106"
    },
    "bnt": {
      "usd": "0.32075473931213732649"
    },
    "oxt": {
      "usd": "0.00938404777321534662"
    },
    "lever": {
      "usd": "0.0001747030170545410275"
    },
    "usdc": {
      "usd": "0.99950091814289415276"
    },
    "utk": {
      "usd": "0.007936508489049149535"
    },
    "bnx": {
      "usd": "1.77887603479706661087"
    },
    "aergo": {
      "usd": "0.06339223761693345855"
    },
    "ilv": {
      "usd": "3.933313641113666562"
    },
    "hifi": {
      "usd": "0.1267844752338669171"
    },
    "egld": {
      "usd": "3.533992459274715642"
    },
    "tru": {
      "usd": "0.00229609679557396779"
    },
    "alpine": {
      "usd": "0.3963262729751587881"
    },
    "amb": {
      "usd": "0.000319456945471160736"
    },
    "edu": {
      "usd": "0.04342617852498591255"
    },
    "nfp": {
      "usd": "0.009463912009583136804"
    },
    "ustc": {
      "usd": "0.006099631052589975303"
    },
    "trx": {
      "usd": "0.3533992459274715642"
    },
    "dash": {
      "usd": "39.652593356607826356"
    },
    "nuls": {
      "usd": "0.02575621622861233434"
    },
    "mdx": {
      "usd": "0.03444145193360951685"
    },
    "joe": {
      "usd": "0.0379355122747003374"
    },
    "pond": {
      "usd": "0.001766996229637357821"
    },
    "lina": {
      "usd": "0.0003364280956993161501"
    },
    "lsk": {
      "usd": "0.1088150220511141257"
    },
    "amp": {
      "usd": "0.0007307577627652801836"
    },
    "pendle": {
      "usd": "1.5583509121265059653"
    },
    "dydx": {
      "usd": "0.154577229489857901132"
    },
    "busd": {
      "usd": "0.99860244548375651319"
    },
    "akro": {
      "usd": "0.0009793351984600271313"
    },
    "alcx": {
      "usd": "4.063093025211325611"
    },
    "qtum": {
      "usd": "0.8545473291353549688"
    },
    "arpa": {
      "usd": "0.009913148339151956589"
    },
    "coti": {
      "usd": "0.011230908239220494625"
    },
    "dcr": {
      "usd": "15.87301697809829907"
    },
    "og": {
      "usd": "2.7603076694617482345"
    },
    "ethfi": {
      "usd": "0.3713686991102243556"
    },
    "flux": {
      "usd": "0.06778477061716191867"
    },
    "ltc": {
      "usd": "129.190385354446596393"
    },
    "win": {
      "usd": "0.000019177399757815617933"
    },
    "beta": {
      "usd": "0.000359389063655055828"
    },
    "om": {
      "usd": "0.06678646766256454137"
    },
    "fxs": {
      "usd": "0.8106219991330703676"
    },
    "pla": {
      "usd": "0.23430170344400445231"
    },
    "ant": {
      "usd": "7.3944299847027736611"
    },
    "vgx": {
      "usd": "0.0179694531827527914"
    },
    "lto": {
      "usd": "0.00379355122747003374"
    },
    "crv": {
      "usd": "0.2116402263746439876"
    },
    "aeur": {
      "usd": "1.14585213128686966494"
    },
    "movr": {
      "usd": "1.7839673798655132351"
    },
    "srm": {
      "usd": "0.244005208162690959666"
    },
    "badger": {
      "usd": "0.7607068514032015026"
    },
    "rpl": {
      "usd": "1.617250786447751226"
    },
    "super": {
      "usd": "0.11061196736938940484"
    },
    "aevo": {
      "usd": "0.02306079825119941563"
    },
    "pols": {
      "usd": "0.30737747972053247067"
    },
    "cyber": {
      "usd": "0.4362583911590538801"
    },
    "qnt": {
      "usd": "70.020969235460043822"
    },
    "ldo": {
      "usd": "0.31706101838012703048"
    },
    "bake": {
      "usd": "0.05181192334360388187"
    },
    "agix": {
      "usd": "0.61305784441824939993"
    },
    "xlm": {
      "usd": "0.17290607173626574836"
    },
    "stmx": {
      "usd": "0.0045572529877370273745"
    },
    "front": {
      "usd": "0.878506600045692024"
    },
    "gala": {
      "usd": "0.003014874922884079446"
    },
    "rndr": {
      "usd": "7.018069770819562419"
    }
  },
  "ts": 1779962661153
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.194002" elapsed="0.000818"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:21.196496" level="INFO">${data} = {'uft': {'usd': '0.00888489629591665797'}, 'ksm': {'usd': '4.432465118412355212'}, 'vanry': {'usd': '0.0044773887513692371905'}, 'pyth': {'usd': '0.03853449404745876378'}, 'bal': {'usd': '0.9653589570...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.195003" elapsed="0.001527"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.196676" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证价格转换列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.197177" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证价格转换字典结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($convert_dict, dict)</arg>
<arg>价格转换数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.198533" elapsed="0.000270"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:21.199301" level="INFO">${dict_keys} = ['1inch', 'aave', 'aca', 'acm', 'adx', 'aergo', 'aeur', 'aevo', 'agix', 'agld', 'ai', 'akro', 'alcx', 'algo', 'alice', 'alpaca', 'alpha', 'alpine', 'alt', 'amb', 'amp', 'ankr', 'ant', 'ape', 'api3', '...</msg>
<var>${dict_keys}</var>
<arg>${convert_dict}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:21.198943" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.199677" level="INFO">价格转换字典包含字段: ['1inch', 'aave', 'aca', 'acm', 'adx', 'aergo', 'aeur', 'aevo', 'agix', 'agld', 'ai', 'akro', 'alcx', 'algo', 'alice', 'alpaca', 'alpha', 'alpine', 'alt', 'amb', 'amp', 'ankr', 'ant', 'ape', 'api3', 'apt', 'arb', 'ardr', 'ark', 'arkm', 'arpa', 'asr', 'ast', 'astr', 'ata', 'atm', 'atom', 'auction', 'audio', 'axs', 'badger', 'bake', 'bal', 'band', 'bar', 'bat', 'bb', 'beamx', 'bel', 'beta', 'bico', 'bifi', 'bigtime', 'blur', 'blz', 'bnb', 'bnt', 'bnx', 'bome', 'bond', 'bsw', 'btc', 'btt', 'bttc', 'btx', 'btxtest', 'btxtest2', 'burger', 'busd', 'c98', 'cake', 'celo', 'celr', 'cfx', 'chess', 'chr', 'chz', 'city', 'ckb', 'clv', 'combo', 'comp', 'cos', 'coti', 'cream', 'crv', 'ctk', 'ctsi', 'ctxc', 'cvc', 'cvp', 'cvx', 'cyber', 'dai', 'dar', 'dash', 'data', 'dcr', 'dego', 'dent', 'dexe', 'df', 'dgb', 'dia', 'dock', 'dodo', 'doge', 'dot', 'dusk', 'dydx', 'edu', 'egld', 'elf', 'enj', 'ens', 'eos', 'etc', 'eth', 'ethfi', 'farm', 'fida', 'fio', 'fis', 'flm', 'flux', 'for', 'forth', 'front', 'ftm', 'ftt', 'fun', 'fxs', 'gal', 'gala', 'gft', 'ghst', 'glm', 'glmr', 'gm', 'gmt', 'gmx', 'gno', 'gns', 'gtc', 'hbar', 'hft', 'hifi', 'high', 'hive', 'hook', 'icx', 'id', 'idex', 'ilv', 'io', 'iost', 'iotx', 'iq', 'iris', 'jasmy', 'joe', 'jst', 'jup', 'juv', 'kava', 'kda', 'key', 'kmd', 'knc', 'kp3r', 'ksm', 'lazio', 'ldo', 'lever', 'lina', 'lista', 'lit', 'loka', 'loom', 'lpt', 'lqty', 'lrc', 'lsk', 'ltc', 'lto', 'luna', 'lunc', 'magic', 'mana', 'manta', 'mask', 'matic', 'mav', 'mbl', 'mbox', 'mdx', 'meme', 'metis', 'mina', 'movr', 'mtl', 'near', 'neo', 'nexo', 'nfp', 'nkn', 'nmr', 'not', 'ntrn', 'nuls', 'oax', 'ocean', 'og', 'ogn', 'om', 'omg', 'one', 'ong', 'ont', 'ooki', 'ordi', 'orn', 'osmo', 'oxt', 'paxg', 'pda', 'pendle', 'pengu', 'people', 'pepe', 'perp', 'pha', 'phb', 'pivx', 'pixel', 'pla', 'pol', 'pols', 'polyx', 'pond', 'portal', 'porto', 'powr', 'prom', 'pros', 'psg', 'pundix', 'pyr', 'pyth', 'qi', 'qkc', 'qnt', 'qtum', 'quick', 'rad', 'rare', 'ray', 'rdnt', 'reef', 'rei', 'ren', 'rep', 'req', 'rif', 'rlc', 'rndr', 'rose', 'rpl', 'rsr', 'rune', 'rvn', 'saga', 'sand', 'sc', 'sei', 'sfp', 'shib', 'skl', 'slp', 'snt', 'snx', 'sol', 'spell', 'srm', 'ssv', 'steem', 'stg', 'stmx', 'storj', 'stpt', 'strax', 'sui', 'super', 'sxp', 'syn', 'sys', 't', 'tao', 'theta', 'tia', 'tko', 'tlm', 'tnsr', 'tom2', 'tom3', 'ton', 'trb', 'troy', 'tru', 'trx', 'tusd', 'twt', 'uft', 'uma', 'unfi', 'usd', 'usdc', 'usdn', 'usdt', 'ustc', 'utk', 'vanry', 'vgx', 'vib', 'vic', 'vidt', 'vite', 'voxel', 'vtho', 'w', 'wan', 'waves', 'waxp', 'win', 'wing', 'wld', 'woo', 'xai', 'xaut', 'xec', 'xlm', 'xmr', 'xrp', 'xtz', 'xvg', 'xvs', 'yfi', 'yfii', 'ygg', 'zec', 'zil', 'zk', 'zro', 'zrx']</msg>
<arg>价格转换字典包含字段: ${dict_keys}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.199460" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.200374" level="FAIL">Dictionary does not contain key 'rates'.</msg>
<arg>${convert_dict}</arg>
<arg>rates</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.200093" elapsed="0.000396">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-05-28T18:04:21.200600" level="INFO">${has_rates} = False</msg>
<var>${has_rates}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>rates</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.199917" elapsed="0.000720"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.201248" level="FAIL">Dictionary does not contain key 'base'.</msg>
<arg>${convert_dict}</arg>
<arg>base</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.200957" elapsed="0.000349">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-05-28T18:04:21.201398" level="INFO">${has_base} = False</msg>
<var>${has_base}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>base</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.200786" elapsed="0.000635"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.201844" level="FAIL">Dictionary does not contain key 'timestamp'.</msg>
<arg>${convert_dict}</arg>
<arg>timestamp</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.201683" elapsed="0.000215">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T18:04:21.201991" level="INFO">${has_timestamp} = False</msg>
<var>${has_timestamp}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>timestamp</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.201548" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.202459" level="FAIL">Dictionary does not contain key 'date'.</msg>
<arg>${convert_dict}</arg>
<arg>date</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.202294" elapsed="0.000222">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-05-28T18:04:21.202608" level="INFO">${has_date} = False</msg>
<var>${has_date}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>date</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.202145" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:21.203111" level="FAIL">Dictionary does not contain key 'success'.</msg>
<arg>${convert_dict}</arg>
<arg>success</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:21.202941" elapsed="0.000223">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-05-28T18:04:21.203251" level="INFO">${has_success} = False</msg>
<var>${has_success}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${convert_dict}</arg>
<arg>success</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:21.202794" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.203532" level="INFO">价格转换包含汇率(rates): False</msg>
<arg>价格转换包含汇率(rates): ${has_rates}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.203398" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.203810" level="INFO">价格转换包含基础货币(base): False</msg>
<arg>价格转换包含基础货币(base): ${has_base}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.203679" elapsed="0.000173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.204090" level="INFO">价格转换包含时间戳(timestamp): False</msg>
<arg>价格转换包含时间戳(timestamp): ${has_timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.203971" elapsed="0.000162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.204370" level="INFO">价格转换包含日期(date): False</msg>
<arg>价格转换包含日期(date): ${has_date}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.204248" elapsed="0.000165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.204644" level="INFO">价格转换包含成功标记(success): False</msg>
<arg>价格转换包含成功标记(success): ${has_success}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.204521" elapsed="0.000168"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_rates}</arg>
<arg>验证汇率结构</arg>
<arg>${convert_dict['rates']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.204800" elapsed="0.000115"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_base}</arg>
<arg>验证基础货币</arg>
<arg>${convert_dict['base']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.205033" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_success}</arg>
<arg>验证成功标记</arg>
<arg>${convert_dict['success']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.205276" elapsed="0.000105"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:21.198088" elapsed="0.007371"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证价格转换字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:21.197570" elapsed="0.007939"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.206181" level="INFO">获取单一货币价格转换 /v1/spot/balance/public/price/currency/convert status=200</msg>
<arg>获取单一货币价格转换 /v1/spot/balance/public/price/currency/convert status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.205619" elapsed="0.000600"/>
</kw>
<doc>验证单一货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T18:04:21.040251" elapsed="0.166140"/>
</test>
<doc>货币价格转换接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:20.577579" elapsed="0.629255"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:20.054631" elapsed="1.153439"/>
</suite>
<suite id="s1-s4-s2" name="Mark" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark">
<suite id="s1-s4-s2-s1" name="24H Market" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/24h_market.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.213935" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:21.213766" elapsed="0.000194"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.214556" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.214366" elapsed="0.000249"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:21.214056" elapsed="0.000600"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.214799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.214683" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.214028" elapsed="0.000849"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.215646" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.215503" elapsed="0.000194"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.215945" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.216082" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.216209" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.216343" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.216465" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.215768" elapsed="0.000786"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.216752" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.216881" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217006" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217127" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217247" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217366" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217486" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217611" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.217732" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.216578" elapsed="0.001206"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.218180" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.217911" elapsed="0.000317"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.218584" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.218346" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.218913" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.218720" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.219252" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.219048" elapsed="0.000239"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.219578" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.219385" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.219902" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.219711" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.220244" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.220035" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.220591" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.220376" elapsed="0.000250"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.220939" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.220724" elapsed="0.000251"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:21.217808" elapsed="0.003198"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.215749" elapsed="0.005275"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.221249" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.221108" elapsed="0.000181"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:21.221661" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:21.221392" elapsed="0.000431"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.215210" elapsed="0.006674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.222063" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.221983" elapsed="0.000119"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.213544" elapsed="0.008611"/>
</kw>
<test id="s1-s4-s2-s1-t1" name="获取24小时行情数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.224794" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.224237" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.225348" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.224937" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.224922" elapsed="0.000489"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:21.225440" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T18:04:21.225606" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.223493" elapsed="0.002133"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:21.744579" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/ticker/24h 
 path_url=/v1/spot/market/public/ticker/24h 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:21.744975" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/ticker/24h 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:21 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '22002a1ff5c7bc2cc2fb23eda2699715', 'X-Transparent': '00-22002a1ff5c7bc2cc2fb23eda2699715-555a8be4c3303371-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f4acbf3e2ea-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[{"s":"woo_usdt","t":1737084844329,"cv":"0.000","cr":"0.0000","o":"0.212","l":"0.212","h":"0.212","c":"0.212","q":"36559.55","v":"7750.6246"},{"s":"near_usdt","t":1737734307394,"cv":"-0.002","cr":"-0.0006","o":"3.227","l":"3.224","h":"3.227","c":"3.225","q":"1417.7","v":"4573.0788"},{"s":"btc_usdt","t":1779962660040,"cv":"-2369.78","cr":"-0.0312","o":"75891.40","l":"72728.85","h":"76174.15","c":"73521.62","q":"1926.700123","v":"143126789.75871597"},{"s":"btxtest2_usdt","t":1751265479402,"cv":"0.0000","cr":"0.0000","o":"0.3688","l":"0.3688","h":"0.3688","c":"0.3688","q":"271.1","v":"99.98168"},{"s":"ordi_usdt","t":1738896662752,"cv":"0.0000","cr":"0.0000","o":"17.7201","l":"17.7201","h":"17.7201","c":"17.7201","q":"0.01","v":"0.177201"},{"s":"gm_usdt","t":1737720707553,"cv":"0.00","cr":"0.0000","o":"688.26","l":"688.26","h":"688.26","c":"688.26","q":"0.343","v":"236.07318"},{"s":"btxtest_usdt","t":1755393000855,"cv":"0.0000","cr":"0.0000","o":"0.0942","l":"0.0942","h":"0.0942","c":"0.0942","q":"743.0","v":"69.9906"},{"s":"uni_usdt","t":1748397549795,"cv":null,"cr":null,"o":null,"l":null,"h":null,"c":null,"q":"0.0","v":"0.0"},{"s":"fil_usdt","t":1748397549786,"cv":null,"cr":null,"o":null,"l":null,"h":null,"c":null,"q":"0.0","v":"0.0"},{"s":"sol_usdt","t":null,"cv":"5.710","cr":"0.0711","o":"80.200","l":"79.730","h":"86.400","c":"85.910","q":"261526.58","v":"21877602.2672"},{"s":"shib_usdt","t":null,"cv":"-0.00000006","cr":"-0.0070","o":"0.00000852","l":"0.00000846","h":"0.00000855","c":"0.00000846","q":"20738646210","v":"176699.83130074"},{"s":"eos_edc","t":1737084844329,"cv":"0.000000","cr":"0.0000","o":"715.520000","l":"715.520000","h":"715.520000","c":"715.520000","q":"25.0","v":"17888.000000"},{"s":"1000usdt_usdt","t":1743222982661,"cv":"0.0","cr":"0.0000","o":"1000.0","l":"1000.0","h":"1000.0","c":"1000.0","q":"1.0","v":"1000.0"},{"s":"xrp_usdt","t":1763448733063,"cv":"0.0005","cr":"0.0002","o":"2.1364","l":"2.1364","h":"2.1380","c":"2.1369","q":"1943.8","v":"4154.16274"},{"s":"xrp_btc","t":1737722488115,"cv":"0.000000000","cr":"0.0000","o":"0.000030209","l":"0.000030209","h":"0.000030209","c":"0.000030209","q":"6957360","v":"210.174888240"},{"s":"ltc_usdt","t":1737725746673,"cv":"0.00","cr":"0.0000","o":"118.53","l":"118.53","h":"118.53","c":"118.53","q":"1.216","v":"144.13248"},{"s":"dot_usdt","t":1737733457161,"cv":"-0.0003","cr":"0.0000","o":"6.4355","l":"6.4352","h":"6.4355","c":"6.4352","q":"234.41","v":"1508.501984"},{"s":"strk_usdt","t":1750499513986,"cv":null,"cr":null,"o":null,"l":null,"h":null,"c":null,"q":"0.0","v":"0.0"},{"s":"btx_usdt","t":1779962655332,"cv":"0.0000","cr":"0.0000","o":"0.1799","l":"0.1799","h":"0.1800","c":"0.1799","q":"18437629.8","v":"3317694.1687"},{"s":"eos_usdt","t":1743659925394,"cv":"0.000","cr":"0.0000","o":"0.742","l":"0.742","h":"0.742","c":"0.742","q":"134.77","v":"99.99934"},{"s":"tom3_usdt","t":1736927910558,"cv":"0.040","cr":"0.0000","o":"699.600","l":"699.600","h":"699.640","c":"699.640","q":"82.089","v":"57431.74968"},{"s":"tom2_usdt","t":1736927952719,"cv":"0.00","cr":"0.0000","o":"699.62","l":"699.62","h":"699.62","c":"699.62","q":"27.68","v":"19365.4816"}],"ts":1779962661615} 
 </msg>
<msg time="2026-05-28T18:04:21.745210" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:21.745635" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/market/public/ticker/24h</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:21.225713" elapsed="0.519995"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.747738" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:21.746301" elapsed="0.001582"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.749677" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'s': 'woo_usdt', 't': 1737084844329, 'cv': '0.000', 'cr': '0.0000', 'o': '0.212', 'l': '0.212', 'h': '0.212', 'c': '0.212', 'q': '36559.55', 'v':...</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:21.748187" elapsed="0.001628"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.750104" elapsed="0.000363"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.751978" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "s": "woo_usdt",
      "t": 1737084844329,
      "cv": "0.000",
      "cr": "0.0000",
      "o": "0.212",
      "l": "0.212"...</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:21.750723" elapsed="0.001298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.752504" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "s": "woo_usdt",
      "t": 1737084844329,
      "cv": "0.000",
      "cr": "0.0000",
      "o": "0.212",
      "l": "0.212",
      "h": "0.212",
      "c": "0.212",
      "q": "36559.55",
      "v": "7750.6246"
    },
    {
      "s": "near_usdt",
      "t": 1737734307394,
      "cv": "-0.002",
      "cr": "-0.0006",
      "o": "3.227",
      "l": "3.224",
      "h": "3.227",
      "c": "3.225",
      "q": "1417.7",
      "v": "4573.0788"
    },
    {
      "s": "btc_usdt",
      "t": 1779962660040,
      "cv": "-2369.78",
      "cr": "-0.0312",
      "o": "75891.40",
      "l": "72728.85",
      "h": "76174.15",
      "c": "73521.62",
      "q": "1926.700123",
      "v": "143126789.75871597"
    },
    {
      "s": "btxtest2_usdt",
      "t": 1751265479402,
      "cv": "0.0000",
      "cr": "0.0000",
      "o": "0.3688",
      "l": "0.3688",
      "h": "0.3688",
      "c": "0.3688",
      "q": "271.1",
      "v": "99.98168"
    },
    {
      "s": "ordi_usdt",
      "t": 1738896662752,
      "cv": "0.0000",
      "cr": "0.0000",
      "o": "17.7201",
      "l": "17.7201",
      "h": "17.7201",
      "c": "17.7201",
      "q": "0.01",
      "v": "0.177201"
    },
    {
      "s": "gm_usdt",
      "t": 1737720707553,
      "cv": "0.00",
      "cr": "0.0000",
      "o": "688.26",
      "l": "688.26",
      "h": "688.26",
      "c": "688.26",
      "q": "0.343",
      "v": "236.07318"
    },
    {
      "s": "btxtest_usdt",
      "t": 1755393000855,
      "cv": "0.0000",
      "cr": "0.0000",
      "o": "0.0942",
      "l": "0.0942",
      "h": "0.0942",
      "c": "0.0942",
      "q": "743.0",
      "v": "69.9906"
    },
    {
      "s": "uni_usdt",
      "t": 1748397549795,
      "cv": null,
      "cr": null,
      "o": null,
      "l": null,
      "h": null,
      "c": null,
      "q": "0.0",
      "v": "0.0"
    },
    {
      "s": "fil_usdt",
      "t": 1748397549786,
      "cv": null,
      "cr": null,
      "o": null,
      "l": null,
      "h": null,
      "c": null,
      "q": "0.0",
      "v": "0.0"
    },
    {
      "s": "sol_usdt",
      "t": null,
      "cv": "5.710",
      "cr": "0.0711",
      "o": "80.200",
      "l": "79.730",
      "h": "86.400",
      "c": "85.910",
      "q": "261526.58",
      "v": "21877602.2672"
    },
    {
      "s": "shib_usdt",
      "t": null,
      "cv": "-0.00000006",
      "cr": "-0.0070",
      "o": "0.00000852",
      "l": "0.00000846",
      "h": "0.00000855",
      "c": "0.00000846",
      "q": "20738646210",
      "v": "176699.83130074"
    },
    {
      "s": "eos_edc",
      "t": 1737084844329,
      "cv": "0.000000",
      "cr": "0.0000",
      "o": "715.520000",
      "l": "715.520000",
      "h": "715.520000",
      "c": "715.520000",
      "q": "25.0",
      "v": "17888.000000"
    },
    {
      "s": "1000usdt_usdt",
      "t": 1743222982661,
      "cv": "0.0",
      "cr": "0.0000",
      "o": "1000.0",
      "l": "1000.0",
      "h": "1000.0",
      "c": "1000.0",
      "q": "1.0",
      "v": "1000.0"
    },
    {
      "s": "xrp_usdt",
      "t": 1763448733063,
      "cv": "0.0005",
      "cr": "0.0002",
      "o": "2.1364",
      "l": "2.1364",
      "h": "2.1380",
      "c": "2.1369",
      "q": "1943.8",
      "v": "4154.16274"
    },
    {
      "s": "xrp_btc",
      "t": 1737722488115,
      "cv": "0.000000000",
      "cr": "0.0000",
      "o": "0.000030209",
      "l": "0.000030209",
      "h": "0.000030209",
      "c": "0.000030209",
      "q": "6957360",
      "v": "210.174888240"
    },
    {
      "s": "ltc_usdt",
      "t": 1737725746673,
      "cv": "0.00",
      "cr": "0.0000",
      "o": "118.53",
      "l": "118.53",
      "h": "118.53",
      "c": "118.53",
      "q": "1.216",
      "v": "144.13248"
    },
    {
      "s": "dot_usdt",
      "t": 1737733457161,
      "cv": "-0.0003",
      "cr": "0.0000",
      "o": "6.4355",
      "l": "6.4352",
      "h": "6.4355",
      "c": "6.4352",
      "q": "234.41",
      "v": "1508.501984"
    },
    {
      "s": "strk_usdt",
      "t": 1750499513986,
      "cv": null,
      "cr": null,
      "o": null,
      "l": null,
      "h": null,
      "c": null,
      "q": "0.0",
      "v": "0.0"
    },
    {
      "s": "btx_usdt",
      "t": 1779962655332,
      "cv": "0.0000",
      "cr": "0.0000",
      "o": "0.1799",
      "l": "0.1799",
      "h": "0.1800",
      "c": "0.1799",
      "q": "18437629.8",
      "v": "3317694.1687"
    },
    {
      "s": "eos_usdt",
      "t": 1743659925394,
      "cv": "0.000",
      "cr": "0.0000",
      "o": "0.742",
      "l": "0.742",
      "h": "0.742",
      "c": "0.742",
      "q": "134.77",
      "v": "99.99934"
    },
    {
      "s": "tom3_usdt",
      "t": 1736927910558,
      "cv": "0.040",
      "cr": "0.0000",
      "o": "699.600",
      "l": "699.600",
      "h": "699.640",
      "c": "699.640",
      "q": "82.089",
      "v": "57431.74968"
    },
    {
      "s": "tom2_usdt",
      "t": 1736927952719,
      "cv": "0.00",
      "cr": "0.0000",
      "o": "699.62",
      "l": "699.62",
      "h": "699.62",
      "c": "699.62",
      "q": "27.68",
      "v": "19365.4816"
    }
  ],
  "ts": 1779962661615
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.752208" elapsed="0.000502"/>
</kw>
<doc>验证24小时行情接口基本功能获取24小时行情数据</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:21.222218" elapsed="0.530783"/>
</test>
<doc>24小时行情</doc>
<status status="PASS" start="2026-05-28T18:04:21.210376" elapsed="0.543233"/>
</suite>
<suite id="s1-s4-s2-s2" name="Market Depth" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_depth.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.761268" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:21.761032" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.761800" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.761661" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:21.761422" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.762030" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.761926" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.761383" elapsed="0.000753"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.762911" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.762786" elapsed="0.000170"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763203" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763331" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763446" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763553" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763672" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.763027" elapsed="0.000694"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763881" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.763984" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764097" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764205" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764307" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764417" elapsed="0.000028"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764539" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764652" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.764754" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.763746" elapsed="0.001052"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.765157" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.764912" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.765505" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.765293" elapsed="0.000248"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.765826" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.765640" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.766155" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.765955" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.766490" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.766286" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.766818" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.766625" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.767157" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.766947" elapsed="0.000243"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.767520" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.767287" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.767996" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:21.767648" elapsed="0.000408"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:21.764827" elapsed="0.003277"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.763009" elapsed="0.005121"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.768460" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.768267" elapsed="0.000244"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:21.768970" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:21.768667" elapsed="0.000469"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.762509" elapsed="0.006706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.769429" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:21.769331" elapsed="0.000141"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.760667" elapsed="0.008862"/>
</kw>
<test id="s1-s4-s2-s2-t1" name="获取市场深度数据" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.771069" level="INFO">&amp;{params} = { symbol=btc_usdt | limit=1000 }</msg>
<var>&amp;{params}</var>
<arg>symbol=btc_usdt</arg>
<arg>limit=1000</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.770838" elapsed="0.000262"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:21.772892" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:21.772166" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:21.773648" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:21.773075" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:21.773054" elapsed="0.000687"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:21.773779" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T18:04:21.773996" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:21.771319" elapsed="0.002708"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:22.170701" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/depth?symbol=btc_usdt&amp;limit=1000 
 path_url=/v1/spot/market/public/depth?symbol=btc_usdt&amp;limit=1000 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:22.171112" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/depth?symbol=btc_usdt&amp;limit=1000 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:22 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '26a571e5e1d679e2efa4a5865dd559bd', 'X-Transparent': '00-26a571e5e1d679e2efa4a5865dd559bd-7a5cebd9a2e4ae56-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f4e1bd278b5-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"timestamp":1779962632677,"lastUpdateId":1772262218646,"bids":[["73521.62","2.827360"],["73521.61","3.628480"],["73521.58","5.694990"],["73521.57","0.378760"],["73521.56","0.390560"],["73521.54","0.923340"],["73521.52","0.926360"],["73521.51","22.295200"],["73521.50","23.874060"],["73521.47","16.893400"],["73521.41","1.021510"],["73521.35","0.161330"],["73521.33","0.533870"],["73521.31","3.419250"],["73521.29","1.207690"],["73521.24","0.533030"],["73521.20","7.124940"],["73521.10","4.281800"],["73521.05","0.921920"],["73521.02","0.484410"],["73520.95","0.263990"],["73520.85","0.375170"],["73520.76","0.785150"],["73520.72","0.543130"],["73520.71","0.708190"],["73520.64","0.603570"],["73520.58","3.137890"],["73520.49","0.621610"],["73520.41","0.303980"],["73520.30","2.291480"],["73520.07","0.643950"],["73520.06","0.443970"],["73520.02","0.615360"],["73519.94","0.436540"],["73519.92","0.755600"],["73519.71","0.801510"],["73519.70","0.439540"],["73519.67","6.490320"],["73519.60","0.368640"],["73519.36","1.641440"],["73519.35","1.937860"],["73519.12","0.657340"],["73519.08","0.598860"],["73518.97","0.454810"],["73518.94","4.540580"],["73518.89","6.033520"],["73518.77","3.487270"],["73518.73","2.437400"],["73518.52","0.496250"],["73518.51","0.666950"],["73518.44","0.684250"],["73518.43","0.605340"],["73518.32","0.661500"],["73518.24","0.606430"],["73518.19","0.558050"],["73518.07","0.438480"],["73517.84","0.985610"],["73517.68","1.907290"],["73517.57","1.701170"],["73517.46","0.332810"],["73517.43","0.668710"],["73517.29","2.377880"],["73516.60","0.674260"],["73516.45","2.393360"],["73516.43","2.899800"],["73516.40","2.215880"],["73516.39","2.472680"],["73516.28","0.302260"],["73516.27","2.531310"],["73516.20","0.270640"],["73516.11","1.547230"],["73516.08","0.595030"],["73515.80","3.762890"],["73515.40","0.097430"],["73515.25","0.523010"],["73515.07","6.800660"],["73514.70","2.924440"],["73514.62","3.874100"],["73514.60","0.796790"],["73514.41","4.956770"],["73514.06","0.566500"],["73514.01","0.267630"],["73513.95","0.735040"],["73513.89","0.895040"],["73513.43","5.131190"],["73512.95","0.538080"],["73512.92","5.330660"],["73512.73","5.732690"],["73512.29","1.272770"],["73512.11","0.901940"],["73511.49","0.957700"],["73511.42","1.426120"],["73511.18","0.322120"],["73510.92","0.576940"],["73510.63","3.514020"],["73510.45","2.737060"],["73509.64","0.477010"],["73509.57","0.940940"],["73509.54","5.130750"],["73509.22","0.398460"],["73509.12","3.190970"],["73509.08","2.385430"],["73508.61","1.501710"],["73508.55","0.963700"],["73508.51","2.066080"],["73508.44","4.190150"],["73508.27","3.505710"],["73508.23","1.497710"],["73507.80","2.044810"],["73507.74","3.314110"],["73507.71","3.535410"],["73507.63","0.472860"],["73507.29","2.594540"],["73507.18","0.671190"],["73506.85","5.599520"],["73506.79","1.739600"],["73506.57","0.777620"],["73506.55","4.833480"],["73506.45","2.490910"],["73506.30","2.176700"],["73505.69","3.060570"],["73505.15","0.611150"],["73504.87","5.234550"],["73504.46","1.498750"],["73504.21","4.946290"],["73503.24","0.433080"],["73503.17","3.930220"],["73502.86","0.644850"],["73502.73","0.734120"],["73502.53","0.562950"],["73502.20","0.335270"],["73501.89","4.842650"],["73501.47","0.759690"],["73501.28","1.072150"],["73500.85","0.370410"],["73499.96","6.345790"],["73499.71","2.460200"],["73499.67","4.795570"],["73499.27","4.068240"],["73499.07","3.570100"],["73498.98","3.913880"],["73498.66","0.747820"],["73498.45","0.348680"],["73498.32","0.524750"],["73498.04","3.669040"],["73497.92","3.469010"],["73497.83","0.223640"],["73497.40","2.064860"],["73496.78","3.942950"],["73496.36","2.167270"],["73496.09","7.635500"],["73495.93","7.373370"],["73495.91","1.351140"],["73495.45","2.065320"],["73495.25","0.673230"],["73494.88","3.635410"],["73494.82","0.803020"],["73494.68","4.768610"],["73494.19","3.474970"],["73493.73","0.273120"],["73493.26","3.610980"],["73493.24","0.561660"],["73493.19","0.626560"],["73492.78","2.531510"],["73491.83","0.556860"],["73491.82","1.920690"],["73491.72","5.701060"],["73491.52","1.232220"],["73491.45","3.724310"],["73491.35","0.899680"],["73491.32","0.369830"],["73491.13","5.852540"],["73491.05","0.408180"],["73490.60","1.893120"],["73490.46","0.608120"],["73490.43","1.581320"],["73490.39","0.853020"],["73489.81","4.017700"],["73489.74","0.419830"],["73489.68","1.794770"],["73489.24","0.438620"],["73488.79","4.586450"],["73488.63","0.918810"],["73488.57","0.577140"],["73487.93","4.600240"],["73487.26","0.145960"],["73486.85","0.155410"],["73486.13","0.655080"],["73485.75","4.024520"],["73484.69","0.490430"],["73483.69","4.014560"],["73482.54","0.870400"],["73482.36","0.298570"],["73481.79","5.749980"],["73481.58","1.280710"],["72807.87","0.308240"],["72807.82","4.611490"],["71874.70","3.919560"],["71874.66","1.574140"],["70940.15","0.402920"],["70940.04","5.567660"],["0.01","1111.000001"]],"asks":[["73521.63","3.099560"],["73521.64","4.087600"],["73521.65","0.641650"],["73521.67","1.083690"],["73521.68","5.221100"],["73521.69","0.666480"],["73521.72","3.004730"],["73521.73","19.317990"],["73521.76","26.530860"],["73521.77","0.826950"],["73521.78","23.203990"],["73521.82","1.067050"],["73521.83","3.569210"],["73521.85","1.227670"],["73521.95","2.720960"],["73522.05","2.459010"],["73522.09","0.853590"],["73522.13","3.194740"],["73522.17","3.096300"],["73522.21","3.400790"],["73522.24","0.550790"],["73522.36","0.332220"],["73522.37","0.417430"],["73522.57","4.307280"],["73522.60","0.743960"],["73522.73","2.407190"],["73522.76","0.250070"],["73522.81","2.193680"],["73522.89","0.461950"],["73522.91","1.389460"],["73522.93","1.742260"],["73522.96","5.292700"],["73522.98","0.491770"],["73523.01","0.574720"],["73523.04","0.576260"],["73523.17","0.722790"],["73523.30","2.264670"],["73523.43","3.723750"],["73523.61","0.273990"],["73523.71","0.422140"],["73523.80","3.012120"],["73523.94","5.411240"],["73524.02","1.621620"],["73524.05","0.448550"],["73524.22","0.760210"],["73524.28","0.563500"],["73524.38","0.385470"],["73524.43","3.106730"],["73524.59","0.282360"],["73524.65","0.571680"],["73525.25","2.129690"],["73525.34","0.781650"],["73525.76","0.483240"],["73525.83","1.056940"],["73525.94","0.363320"],["73526.02","0.753920"],["73526.06","3.936130"],["73526.09","0.732560"],["73526.18","4.350820"],["73526.42","2.509940"],["73526.44","5.149970"],["73526.61","0.624010"],["73526.67","0.587680"],["73526.71","0.247560"],["73526.83","3.324800"],["73526.94","0.412140"],["73526.96","4.121240"],["73526.98","0.299520"],["73527.25","0.532440"],["73527.29","3.283180"],["73527.56","2.136130"],["73527.68","2.463570"],["73527.81","0.497850"],["73527.97","5.141470"],["73528.02","0.633890"],["73528.21","3.207330"],["73528.83","0.747050"],["73529.05","2.047810"],["73529.10","2.219240"],["73529.14","0.915360"],["73529.15","5.614510"],["73529.22","0.524030"],["73529.24","6.630110"],["73529.37","3.006190"],["73530.01","4.331840"],["73530.07","0.674890"],["73530.10","1.419820"],["73530.36","0.264820"],["73530.41","0.757130"],["73530.54","0.457100"],["73530.60","3.382820"],["73531.10","0.401980"],["73531.21","1.211070"],["73532.06","0.441250"],["73532.23","0.683210"],["73532.47","6.275330"],["73532.56","0.899900"],["73532.61","2.785050"],["73532.70","0.508030"],["73533.11","0.593730"],["73533.23","1.710950"],["73533.33","0.678020"],["73533.70","0.181970"],["73533.81","0.472670"],["73534.73","0.981130"],["73535.16","2.679420"],["73536.27","0.502630"],["73536.51","2.193870"],["73536.57","1.980230"],["73536.76","0.521330"],["73537.01","0.388880"],["73537.23","5.380930"],["73537.73","0.461350"],["73537.87","0.457030"],["73537.93","4.130910"],["73538.00","3.261070"],["73538.67","0.429450"],["73538.69","1.904860"],["73538.71","0.683290"],["73538.98","4.502840"],["73539.06","3.050680"],["73539.11","0.343270"],["73539.19","4.759020"],["73539.25","0.642930"],["73539.48","0.468570"],["73539.94","2.570830"],["73540.71","0.267560"],["73540.91","0.390600"],["73541.28","0.790540"],["73541.31","0.928540"],["73541.38","0.888390"],["73541.51","3.678630"],["73541.55","0.863160"],["73541.69","2.238510"],["73541.84","3.539370"],["73542.14","0.458790"],["73542.53","0.207710"],["73542.56","0.510060"],["73542.75","0.297200"],["73543.12","0.673960"],["73543.32","0.553470"],["73543.54","1.156010"],["73543.55","0.190380"],["73543.64","0.577150"],["73543.72","0.336480"],["73544.45","0.528020"],["73544.46","0.601620"],["73544.52","0.681140"],["73544.69","0.788840"],["73545.56","3.444670"],["73545.60","0.535490"],["73545.62","0.239360"],["73545.78","0.469250"],["73546.04","0.775450"],["73546.05","4.233560"],["73546.78","0.487640"],["73546.98","0.475820"],["73547.52","1.482710"],["73547.92","3.124810"],["73548.56","7.939760"],["73548.95","5.396620"],["73549.10","0.455170"],["73549.54","0.524130"],["73549.55","2.615410"],["73549.57","2.330270"],["73549.88","6.303220"],["73550.22","3.422030"],["73551.23","3.105070"],["73551.33","0.356220"],["73551.84","0.440510"],["73552.11","0.364220"],["73552.37","0.491520"],["73552.56","0.584350"],["73552.79","0.583930"],["73553.16","4.726510"],["73553.52","0.132200"],["73553.54","3.801300"],["73554.00","0.427500"],["73554.24","0.392930"],["73554.49","0.928010"],["73554.55","2.471700"],["73554.70","4.661940"],["73555.21","0.583630"],["73555.51","0.780850"],["73555.65","3.290490"],["73555.80","5.952910"],["73555.99","1.542030"],["73556.03","0.734150"],["73556.29","2.264270"],["73556.62","0.459530"],["73557.21","0.149610"],["73557.35","0.540580"],["73557.43","3.582010"],["73557.62","3.113870"],["73562.07","2.051010"],["73562.22","2.632010"],["75116.06","1.312450"],["75116.07","0.496440"],["76026.75","5.621560"],["76026.82","5.083580"],["76189.92","3.833000"],["76189.96","0.594040"],["76526.25","2.528840"],["77444.04","0.706130"],["77444.06","0.335740"],["77444.08","0.680390"],["77444.19","0.126310"],["77444.41","0.612810"],["77444.44","3.974600"],["77444.46",... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T18:04:22.171643" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:22.172020" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/market/public/depth</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:21.774141" elapsed="0.397949"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.174060" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:22.172652" elapsed="0.001553"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.176459" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'timestamp': 1779962632677, 'lastUpdateId': 1772262218646, 'bids': [['73521.62', '2.827360'], ['73521.61', '3.628480'], ['73521.58', '5.694990'], ...</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:22.174493" elapsed="0.002016"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${resp_json}</arg>
<arg>data</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.176710" elapsed="0.000275"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.179779" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1779962632677,
    "lastUpdateId": 1772262218646,
    "bids": [
      [
        "73521.62",
        "2.827360"
      ],...</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:22.177177" elapsed="0.002650"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.180382" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1779962632677,
    "lastUpdateId": 1772262218646,
    "bids": [
      [
        "73521.62",
        "2.827360"
      ],
      [
        "73521.61",
        "3.628480"
      ],
      [
        "73521.58",
        "5.694990"
      ],
      [
        "73521.57",
        "0.378760"
      ],
      [
        "73521.56",
        "0.390560"
      ],
      [
        "73521.54",
        "0.923340"
      ],
      [
        "73521.52",
        "0.926360"
      ],
      [
        "73521.51",
        "22.295200"
      ],
      [
        "73521.50",
        "23.874060"
      ],
      [
        "73521.47",
        "16.893400"
      ],
      [
        "73521.41",
        "1.021510"
      ],
      [
        "73521.35",
        "0.161330"
      ],
      [
        "73521.33",
        "0.533870"
      ],
      [
        "73521.31",
        "3.419250"
      ],
      [
        "73521.29",
        "1.207690"
      ],
      [
        "73521.24",
        "0.533030"
      ],
      [
        "73521.20",
        "7.124940"
      ],
      [
        "73521.10",
        "4.281800"
      ],
      [
        "73521.05",
        "0.921920"
      ],
      [
        "73521.02",
        "0.484410"
      ],
      [
        "73520.95",
        "0.263990"
      ],
      [
        "73520.85",
        "0.375170"
      ],
      [
        "73520.76",
        "0.785150"
      ],
      [
        "73520.72",
        "0.543130"
      ],
      [
        "73520.71",
        "0.708190"
      ],
      [
        "73520.64",
        "0.603570"
      ],
      [
        "73520.58",
        "3.137890"
      ],
      [
        "73520.49",
        "0.621610"
      ],
      [
        "73520.41",
        "0.303980"
      ],
      [
        "73520.30",
        "2.291480"
      ],
      [
        "73520.07",
        "0.643950"
      ],
      [
        "73520.06",
        "0.443970"
      ],
      [
        "73520.02",
        "0.615360"
      ],
      [
        "73519.94",
        "0.436540"
      ],
      [
        "73519.92",
        "0.755600"
      ],
      [
        "73519.71",
        "0.801510"
      ],
      [
        "73519.70",
        "0.439540"
      ],
      [
        "73519.67",
        "6.490320"
      ],
      [
        "73519.60",
        "0.368640"
      ],
      [
        "73519.36",
        "1.641440"
      ],
      [
        "73519.35",
        "1.937860"
      ],
      [
        "73519.12",
        "0.657340"
      ],
      [
        "73519.08",
        "0.598860"
      ],
      [
        "73518.97",
        "0.454810"
      ],
      [
        "73518.94",
        "4.540580"
      ],
      [
        "73518.89",
        "6.033520"
      ],
      [
        "73518.77",
        "3.487270"
      ],
      [
        "73518.73",
        "2.437400"
      ],
      [
        "73518.52",
        "0.496250"
      ],
      [
        "73518.51",
        "0.666950"
      ],
      [
        "73518.44",
        "0.684250"
      ],
      [
        "73518.43",
        "0.605340"
      ],
      [
        "73518.32",
        "0.661500"
      ],
      [
        "73518.24",
        "0.606430"
      ],
      [
        "73518.19",
        "0.558050"
      ],
      [
        "73518.07",
        "0.438480"
      ],
      [
        "73517.84",
        "0.985610"
      ],
      [
        "73517.68",
        "1.907290"
      ],
      [
        "73517.57",
        "1.701170"
      ],
      [
        "73517.46",
        "0.332810"
      ],
      [
        "73517.43",
        "0.668710"
      ],
      [
        "73517.29",
        "2.377880"
      ],
      [
        "73516.60",
        "0.674260"
      ],
      [
        "73516.45",
        "2.393360"
      ],
      [
        "73516.43",
        "2.899800"
      ],
      [
        "73516.40",
        "2.215880"
      ],
      [
        "73516.39",
        "2.472680"
      ],
      [
        "73516.28",
        "0.302260"
      ],
      [
        "73516.27",
        "2.531310"
      ],
      [
        "73516.20",
        "0.270640"
      ],
      [
        "73516.11",
        "1.547230"
      ],
      [
        "73516.08",
        "0.595030"
      ],
      [
        "73515.80",
        "3.762890"
      ],
      [
        "73515.40",
        "0.097430"
      ],
      [
        "73515.25",
        "0.523010"
      ],
      [
        "73515.07",
        "6.800660"
      ],
      [
        "73514.70",
        "2.924440"
      ],
      [
        "73514.62",
        "3.874100"
      ],
      [
        "73514.60",
        "0.796790"
      ],
      [
        "73514.41",
        "4.956770"
      ],
      [
        "73514.06",
        "0.566500"
      ],
      [
        "73514.01",
        "0.267630"
      ],
      [
        "73513.95",
        "0.735040"
      ],
      [
        "73513.89",
        "0.895040"
      ],
      [
        "73513.43",
        "5.131190"
      ],
      [
        "73512.95",
        "0.538080"
      ],
      [
        "73512.92",
        "5.330660"
      ],
      [
        "73512.73",
        "5.732690"
      ],
      [
        "73512.29",
        "1.272770"
      ],
      [
        "73512.11",
        "0.901940"
      ],
      [
        "73511.49",
        "0.957700"
      ],
      [
        "73511.42",
        "1.426120"
      ],
      [
        "73511.18",
        "0.322120"
      ],
      [
        "73510.92",
        "0.576940"
      ],
      [
        "73510.63",
        "3.514020"
      ],
      [
        "73510.45",
        "2.737060"
      ],
      [
        "73509.64",
        "0.477010"
      ],
      [
        "73509.57",
        "0.940940"
      ],
      [
        "73509.54",
        "5.130750"
      ],
      [
        "73509.22",
        "0.398460"
      ],
      [
        "73509.12",
        "3.190970"
      ],
      [
        "73509.08",
        "2.385430"
      ],
      [
        "73508.61",
        "1.501710"
      ],
      [
        "73508.55",
        "0.963700"
      ],
      [
        "73508.51",
        "2.066080"
      ],
      [
        "73508.44",
        "4.190150"
      ],
      [
        "73508.27",
        "3.505710"
      ],
      [
        "73508.23",
        "1.497710"
      ],
      [
        "73507.80",
        "2.044810"
      ],
      [
        "73507.74",
        "3.314110"
      ],
      [
        "73507.71",
        "3.535410"
      ],
      [
        "73507.63",
        "0.472860"
      ],
      [
        "73507.29",
        "2.594540"
      ],
      [
        "73507.18",
        "0.671190"
      ],
      [
        "73506.85",
        "5.599520"
      ],
      [
        "73506.79",
        "1.739600"
      ],
      [
        "73506.57",
        "0.777620"
      ],
      [
        "73506.55",
        "4.833480"
      ],
      [
        "73506.45",
        "2.490910"
      ],
      [
        "73506.30",
        "2.176700"
      ],
      [
        "73505.69",
        "3.060570"
      ],
      [
        "73505.15",
        "0.611150"
      ],
      [
        "73504.87",
        "5.234550"
      ],
      [
        "73504.46",
        "1.498750"
      ],
      [
        "73504.21",
        "4.946290"
      ],
      [
        "73503.24",
        "0.433080"
      ],
      [
        "73503.17",
        "3.930220"
      ],
      [
        "73502.86",
        "0.644850"
      ],
      [
        "73502.73",
        "0.734120"
      ],
      [
        "73502.53",
        "0.562950"
      ],
      [
        "73502.20",
        "0.335270"
      ],
      [
        "73501.89",
        "4.842650"
      ],
      [
        "73501.47",
        "0.759690"
      ],
      [
        "73501.28",
        "1.072150"
      ],
      [
        "73500.85",
        "0.370410"
      ],
      [
        "73499.96",
        "6.345790"
      ],
      [
        "73499.71",
        "2.460200"
      ],
      [
        "73499.67",
        "4.795570"
      ],
      [
        "73499.27",
        "4.068240"
      ],
      [
        "73499.07",
        "3.570100"
      ],
      [
        "73498.98",
        "3.913880"
      ],
      [
        "73498.66",
        "0.747820"
      ],
      [
        "73498.45",
        "0.348680"
      ],
      [
        "73498.32",
        "0.524750"
      ],
      [
        "73498.04",
        "3.669040"
      ],
      [
        "73497.92",
        "3.469010"
      ],
      [
        "73497.83",
        "0.223640"
      ],
      [
        "73497.40",
        "2.064860"
      ],
      [
        "73496.78",
        "3.942950"
      ],
      [
        "73496.36",
        "2.167270"
      ],
      [
        "73496.09",
        "7.635500"
      ],
      [
        "73495.93",
        "7.373370"
      ],
      [
        "73495.91",
        "1.351140"
      ],
      [
        "73495.45",
        "2.065320"
      ],
      [
        "73495.25",
        "0.673230"
      ],
      [
        "73494.88",
        "3.635410"
      ],
      [
        "73494.82",
        "0.803020"
      ],
      [
        "73494.68",
        "4.768610"
      ],
      [
        "73494.19",
        "3.474970"
      ],
      [
        "73493.73",
        "0.273120"
      ],
      [
        "73493.26",
        "3.610980"
      ],
      [
        "73493.24",
        "0.561660"
      ],
      [
        "73493.19",
        "0.626560"
      ],
      [
        "73492.78",
        "2.531510"
      ],
      [
        "73491.83",
        "0.556860"
      ],
      [
        "73491.82",
        "1.920690"
      ],
      [
        "73491.72",
        "5.701060"
      ],
      [
        "73491.52",
        "1.232220"
      ],
      [
        "73491.45",
        "3.724310"
      ],
      [
        "73491.35",
        "0.899680"
      ],
      [
        "73491.32",
        "0.369830"
      ],
      [
        "73491.13",
        "5.852540"
      ],
      [
        "73491.05",
        "0.408180"
      ],
      [
        "73490.60",
        "1.893120"
      ],
      [
        "73490.46",
        "0.608120"
      ],
      [
        "73490.43",
        "1.581320"
      ],
      [
        "73490.39",
        "0.853020"
      ],
      [
        "73489.81",
        "4.017700"
      ],
      [
        "73489.74",
        "0.419830"
      ],
      [
        "73489.68",
        "1.794770"
      ],
      [
        "73489.24",
        "0.438620"
      ],
      [
        "73488.79",
        "4.586450"
      ],
      [
        "73488.63",
        "0.918810"
      ],
      [
        "73488.57",
        "0.577140"
      ],
      [
        "73487.93",
        "4.600240"
      ],
      [
        "73487.26",
        "0.145960"
      ],
      [
        "73486.85",
        "0.155410"
      ],
      [
        "73486.13",
        "0.655080"
      ],
      [
        "73485.75",
        "4.024520"
      ],
      [
        "73484.69",
        "0.490430"
      ],
      [
        "73483.69",
        "4.014560"
      ],
      [
        "73482.54",
        "0.870400"
      ],
      [
        "73482.36",
        "0.298570"
      ],
      [
        "73481.79",
        "5.749980"
      ],
      [
        "73481.58",
        "1.280710"
      ],
      [
        "72807.87",
        "0.308240"
      ],
      [
        "72807.82",
        "4.611490"
      ],
      [
        "71874.70",
        "3.919560"
      ],
      [
        "71874.66",
        "1.574140"
      ],
      [
        "70940.15",
        "0.402920"
      ],
      [
        "70940.04",
        "5.567660"
      ],
      [
        "0.01",
        "1111.000001"
      ]
    ],
    "asks": [
      [
        "73521.63",
        "3.099560"
      ],
      [
        "73521.64",
        "4.087600"
      ],
      [
        "73521.65",
        "0.641650"
      ],
      [
        "73521.67",
        "1.083690"
      ],
      [
        "73521.68",
        "5.221100"
      ],
      [
        "73521.69",
        "0.666480"
      ],
      [
        "73521.72",
        "3.004730"
      ],
      [
        "73521.73",
        "19.317990"
      ],
      [
        "73521.76",
        "26.530860"
      ],
      [
        "73521.77",
        "0.826950"
      ],
      [
        "73521.78",
        "23.203990"
      ],
      [
        "73521.82",
        "1.067050"
      ],
      [
        "73521.83",
        "3.569210"
      ],
      [
        "73521.85",
        "1.227670"
      ],
      [
        "73521.95",
        "2.720960"
      ],
      [
        "73522.05",
        "2.459010"
      ],
      [
        "73522.09",
        "0.853590"
      ],
      [
        "73522.13",
        "3.194740"
      ],
      [
        "73522.17",
        "3.096300"
      ],
      [
        "73522.21",
        "3.400790"
      ],
      [
        "73522.24",
        "0.550790"
      ],
      [
        "73522.36",
        "0.332220"
      ],
      [
        "73522.37",
        "0.417430"
      ],
      [
        "73522.57",
        "4.307280"
      ],
      [
        "73522.60",
        "0.743960"
      ],
      [
        "73522.73",
        "2.407190"
      ],
      [
        "73522.76",
        "0.250070"
      ],
      [
        "73522.81",
        "2.193680"
      ],
      [
        "73522.89",
        "0.461950"
      ],
      [
        "73522.91",
        "1.389460"
      ],
      [
        "73522.93",
        "1.742260"
      ],
      [
        "73522.96",
        "5.292700"
      ],
      [
        "73522.98",
        "0.491770"
      ],
      [
        "73523.01",
        "0.574720"
      ],
      [
        "73523.04",
        "0.576260"
      ],
      [
        "73523.17",
        "0.722790"
      ],
      [
        "73523.30",
        "2.264670"
      ],
      [
        "73523.43",
        "3.723750"
      ],
      [
        "73523.61",
        "0.273990"
      ],
      [
        "73523.71",
        "0.422140"
      ],
      [
        "73523.80",
        "3.012120"
      ],
      [
        "73523.94",
        "5.411240"
      ],
      [
        "73524.02",
        "1.621620"
      ],
      [
        "73524.05",
        "0.448550"
      ],
      [
        "73524.22",
        "0.760210"
      ],
      [
        "73524.28",
        "0.563500"
      ],
      [
        "73524.38",
        "0.385470"
      ],
      [
        "73524.43",
        "3.106730"
      ],
      [
        "73524.59",
        "0.282360"
      ],
      [
        "73524.65",
        "0.571680"
      ],
      [
        "73525.25",
        "2.129690"
      ],
      [
        "73525.34",
        "0.781650"
      ],
      [
        "73525.76",
        "0.483240"
      ],
      [
        "73525.83",
        "1.056940"
      ],
      [
        "73525.94",
        "0.363320"
      ],
      [
        "73526.02",
        "0.753920"
      ],
      [
        "73526.06",
        "3.936130"
      ],
      [
        "73526.09",
        "0.732560"
      ],
      [
        "73526.18",
        "4.350820"
      ],
      [
        "73526.42",
        "2.509940"
      ],
      [
        "73526.44",
        "5.149970"
      ],
      [
        "73526.61",
        "0.624010"
      ],
      [
        "73526.67",
        "0.587680"
      ],
      [
        "73526.71",
        "0.247560"
      ],
      [
        "73526.83",
        "3.324800"
      ],
      [
        "73526.94",
        "0.412140"
      ],
      [
        "73526.96",
        "4.121240"
      ],
      [
        "73526.98",
        "0.299520"
      ],
      [
        "73527.25",
        "0.532440"
      ],
      [
        "73527.29",
        "3.283180"
      ],
      [
        "73527.56",
        "2.136130"
      ],
      [
        "73527.68",
        "2.463570"
      ],
      [
        "73527.81",
        "0.497850"
      ],
      [
        "73527.97",
        "5.141470"
      ],
      [
        "73528.02",
        "0.633890"
      ],
      [
        "73528.21",
        "3.207330"
      ],
      [
        "73528.83",
        "0.747050"
      ],
      [
        "73529.05",
        "2.047810"
      ],
      [
        "73529.10",
        "2.219240"
      ],
      [
        "73529.14",
        "0.915360"
      ],
      [
        "73529.15",
        "5.614510"
      ],
      [
        "73529.22",
        "0.524030"
      ],
      [
        "73529.24",
        "6.630110"
      ],
      [
        "73529.37",
        "3.006190"
      ],
      [
        "73530.01",
        "4.331840"
      ],
      [
        "73530.07",
        "0.674890"
      ],
      [
        "73530.10",
        "1.419820"
      ],
      [
        "73530.36",
        "0.264820"
      ],
      [
        "73530.41",
        "0.757130"
      ],
      [
        "73530.54",
        "0.457100"
      ],
      [
        "73530.60",
        "3.382820"
      ],
      [
        "73531.10",
        "0.401980"
      ],
      [
        "73531.21",
        "1.211070"
      ],
      [
        "73532.06",
        "0.441250"
      ],
      [
        "73532.23",
        "0.683210"
      ],
      [
        "73532.47",
        "6.275330"
      ],
      [
        "73532.56",
        "0.899900"
      ],
      [
        "73532.61",
        "2.785050"
      ],
      [
        "73532.70",
        "0.508030"
      ],
      [
        "73533.11",
        "0.593730"
      ],
      [
        "73533.23",
        "1.710950"
      ],
      [
        "73533.33",
        "0.678020"
      ],
      [
        "73533.70",
        "0.181970"
      ],
      [
        "73533.81",
        "0.472670"
      ],
      [
        "73534.73",
        "0.981130"
      ],
      [
        "73535.16",
        "2.679420"
      ],
      [
        "73536.27",
        "0.502630"
      ],
      [
        "73536.51",
        "2.193870"
      ],
      [
        "73536.57",
        "1.980230"
      ],
      [
        "73536.76",
        "0.521330"
      ],
      [
        "73537.01",
        "0.388880"
      ],
      [
        "73537.23",
        "5.380930"
      ],
      [
        "73537.73",
        "0.461350"
      ],
      [
        "73537.87",
        "0.457030"
      ],
      [
        "73537.93",
        "4.130910"
      ],
      [
        "73538.00",
        "3.261070"
      ],
      [
        "73538.67",
        "0.429450"
      ],
      [
        "73538.69",
        "1.904860"
      ],
      [
        "73538.71",
        "0.683290"
      ],
      [
        "73538.98",
        "4.502840"
      ],
      [
        "73539.06",
        "3.050680"
      ],
      [
        "73539.11",
        "0.343270"
      ],
      [
        "73539.19",
        "4.759020"
      ],
      [
        "73539.25",
        "0.642930"
      ],
      [
        "73539.48",
        "0.468570"
      ],
      [
        "73539.94",
        "2.570830"
      ],
      [
        "73540.71",
        "0.267560"
      ],
      [
        "73540.91",
        "0.390600"
      ],
      [
        "73541.28",
        "0.790540"
      ],
      [
        "73541.31",
        "0.928540"
      ],
      [
        "73541.38",
        "0.888390"
      ],
      [
        "73541.51",
        "3.678630"
      ],
      [
        "73541.55",
        "0.863160"
      ],
      [
        "73541.69",
        "2.238510"
      ],
      [
        "73541.84",
        "3.539370"
      ],
      [
        "73542.14",
        "0.458790"
      ],
      [
        "73542.53",
        "0.207710"
      ],
      [
        "73542.56",
        "0.510060"
      ],
      [
        "73542.75",
        "0.297200"
      ],
      [
        "73543.12",
        "0.673960"
      ],
      [
        "73543.32",
        "0.553470"
      ],
      [
        "73543.54",
        "1.156010"
      ],
      [
        "73543.55",
        "0.190380"
      ],
      [
        "73543.64",
        "0.577150"
      ],
      [
        "73543.72",
        "0.336480"
      ],
      [
        "73544.45",
        "0.528020"
      ],
      [
        "73544.46",
        "0.601620"
      ],
      [
        "73544.52",
        "0.681140"
      ],
      [
        "73544.69",
        "0.788840"
      ],
      [
        "73545.56",
        "3.444670"
      ],
      [
        "73545.60",
        "0.535490"
      ],
      [
        "73545.62",
        "0.239360"
      ],
      [
        "73545.78",
        "0.469250"
      ],
      [
        "73546.04",
        "0.775450"
      ],
      [
        "73546.05",
        "4.233560"
      ],
      [
        "73546.78",
        "0.487640"
      ],
      [
        "73546.98",
        "0.475820"
      ],
      [
        "73547.52",
        "1.482710"
      ],
      [
        "73547.92",
        "3.124810"
      ],
      [
        "73548.56",
        "7.939760"
      ],
      [
        "73548.95",
        "5.396620"
      ],
      [
        "73549.10",
        "0.455170"
      ],
      [
        "73549.54",
        "0.524130"
      ],
      [
        "73549.55",
        "2.615410"
      ],
      [
        "73549.57",
        "2.330270"
      ],
      [
        "73549.88",
        "6.303220"
      ],
      [
        "73550.22",
        "3.422030"
      ],
      [
        "73551.23",
        "3.105070"
      ],
      [
        "73551.33",
        "0.356220"
      ],
      [
        "73551.84",
        "0.440510"
      ],
      [
        "73552.11",
        "0.364220"
      ],
      [
        "73552.37",
        "0.491520"
      ],
      [
        "73552.56",
        "0.584350"
      ],
      [
        "73552.79",
        "0.583930"
      ],
      [
        "73553.16",
        "4.726510"
      ],
      [
        "73553.52",
        "0.132200"
      ],
      [
        "73553.54",
        "3.801300"
      ],
      [
        "73554.00",
        "0.427500"
      ],
      [
        "73554.24",
        "0.392930"
      ],
      [
        "73554.49",
        "0.928010"
      ],
      [
        "73554.55",
        "2.471700"
      ],
      [
        "73554.70",
        "4.661940"
      ],
      [
        "73555.21",
        "0.583630"
      ],
      [
        "73555.51",
        "0.780850"
      ],
      [
        "73555.65",
        "3.290490"
      ],
      [
        "73555.80",
        "5.952910"
      ],
      [
        "73555.99",
        "1.542030"
      ],
      [
        "73556.03",
        "0.734150"
      ],
      [
        "73556.29",
        "2.264270"
      ],
      [
        "73556.62",
        "0.459530"
      ],
      [
        "73557.21",
        "0.149610"
      ],
      [
        "73557.35",
        "0.540580"
      ],
      [
        "73557.43",
        "3.582010"
      ],
      [
        "73557.62",
        "3.113870"
      ],
      [
        "73562.07",
        "2.051010"
      ],
      [
        "73562.22",
        "2.632010"
      ],
      [
        "75116.06",
        "1.312450"
      ],
      [
        "75116.07",
        "0.496440"
      ],
      [
        "76026.75",
        "5.621560"
      ],
      [
        "76026.82",
        "5.083580"
      ],
      [
        "76189.92",
        "3.833000"
      ],
      [
        "76189.96",
        "0.594040"
      ],
      [
        "76526.25",
        "2.528840"
      ],
      [
        "77444.04",
        "0.706130"
      ],
      [
        "77444.06",
        "0.335740"
      ],
      [
        "77444.08",
        "0.680390"
      ],
      [
        "77444.19",
        "0.126310"
      ],
      [
        "77444.41",
        "0.612810"
      ],
      [
        "77444.44",
        "3.974600"
      ],
      [
        "77444.46",
        "0.634680"
      ],
      [
        "77444.51",
        "4.239480"
      ],
      [
        "77444.66",
        "3.843810"
      ],
      [
        "77445.02",
        "0.235040"
      ],
      [
        "78709.90",
        "0.749020"
      ]
    ]
  },
  "ts": 1779962662144
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.180023" elapsed="0.000853"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:22.182584" level="INFO">${data} = {'timestamp': 1779962632677, 'lastUpdateId': 1772262218646, 'bids': [['73521.62', '2.827360'], ['73521.61', '3.628480'], ['73521.58', '5.694990'], ['73521.57', '0.378760'], ['73521.56', '0.390560'], [...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.181063" elapsed="0.001567"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.182811" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证深度数据列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.183435" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证深度数据字典结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($depth_dict, dict)</arg>
<arg>深度数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.184874" elapsed="0.000256"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:22.185472" level="INFO">${dict_keys} = ['asks', 'bids', 'lastUpdateId', 'timestamp']</msg>
<var>${dict_keys}</var>
<arg>${depth_dict}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:22.185270" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.185809" level="INFO">深度数据字典包含字段: ['asks', 'bids', 'lastUpdateId', 'timestamp']</msg>
<arg>深度数据字典包含字段: ${dict_keys}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.185640" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${depth_dict}</arg>
<arg>bids</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.186181" elapsed="0.000192"/>
</kw>
<msg time="2026-05-28T18:04:22.186478" level="INFO">${has_bids} = True</msg>
<var>${has_bids}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${depth_dict}</arg>
<arg>bids</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:22.186001" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${depth_dict}</arg>
<arg>asks</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.186806" elapsed="0.000161"/>
</kw>
<msg time="2026-05-28T18:04:22.187071" level="INFO">${has_asks} = True</msg>
<var>${has_asks}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${depth_dict}</arg>
<arg>asks</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:22.186646" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:22.187661" level="FAIL">Dictionary does not contain key 'symbol'.</msg>
<arg>${depth_dict}</arg>
<arg>symbol</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:22.187407" elapsed="0.000381">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-05-28T18:04:22.187880" level="INFO">${has_symbol} = False</msg>
<var>${has_symbol}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${depth_dict}</arg>
<arg>symbol</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:22.187237" elapsed="0.000667"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${depth_dict}</arg>
<arg>timestamp</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.188190" elapsed="0.000160"/>
</kw>
<msg time="2026-05-28T18:04:22.188432" level="INFO">${has_timestamp} = True</msg>
<var>${has_timestamp}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${depth_dict}</arg>
<arg>timestamp</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:22.188031" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${depth_dict}</arg>
<arg>lastUpdateId</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.188707" elapsed="0.000153"/>
</kw>
<msg time="2026-05-28T18:04:22.188948" level="INFO">${has_lastUpdateId} = True</msg>
<var>${has_lastUpdateId}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${depth_dict}</arg>
<arg>lastUpdateId</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:22.188572" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.189213" level="INFO">深度数据包含买盘(bids): True</msg>
<arg>深度数据包含买盘(bids): ${has_bids}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.189083" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.189489" level="INFO">深度数据包含卖盘(asks): True</msg>
<arg>深度数据包含卖盘(asks): ${has_asks}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.189370" elapsed="0.000165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.189764" level="INFO">深度数据包含交易对(symbol): False</msg>
<arg>深度数据包含交易对(symbol): ${has_symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.189644" elapsed="0.000165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.190034" level="INFO">深度数据包含时间戳(timestamp): True</msg>
<arg>深度数据包含时间戳(timestamp): ${has_timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.189914" elapsed="0.000167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.190318" level="INFO">深度数据包含更新ID(lastUpdateId): True</msg>
<arg>深度数据包含更新ID(lastUpdateId): ${has_lastUpdateId}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.190192" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证买盘数据">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($bids, list)</arg>
<arg>买盘数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.191676" elapsed="0.000198"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.192076" level="INFO">Length is 202.</msg>
<msg time="2026-05-28T18:04:22.192133" level="INFO">${bids_length} = 202</msg>
<var>${bids_length}</var>
<arg>${bids}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:22.191974" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.192377" level="INFO">买盘数据包含 202 个价位</msg>
<arg>买盘数据包含 ${bids_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.192275" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证价格层级数据">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level, list)</arg>
<arg>${side}数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.193318" elapsed="0.000191"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.193685" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T18:04:22.193743" level="INFO">${level_length} = 2</msg>
<var>${level_length}</var>
<arg>${price_level}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:22.193597" elapsed="0.000166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.193963" level="INFO">买盘数据包含 2 个元素</msg>
<arg>${side}数据包含 ${level_length} 个元素</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.193850" elapsed="0.000146"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.195036" level="INFO">买盘价格: 73521.62, 数量: 2.827360</msg>
<arg>${side}价格: ${price_level[0]}, 数量: ${price_level[1]}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.194249" elapsed="0.000820"/>
</kw>
<arg>${level_length} &gt;= 2</arg>
<arg>Log</arg>
<arg>${side}价格: ${price_level[0]}, 数量: ${price_level[1]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.194087" elapsed="0.001027"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level[0], (int, float, str))</arg>
<arg>价格应该是数字格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.195356" elapsed="0.000206"/>
</kw>
<arg>${level_length} &gt;= 1</arg>
<arg>Should Be True</arg>
<arg>isinstance($price_level[0], (int, float, str))</arg>
<arg>价格应该是数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.195208" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level[1], (int, float, str))</arg>
<arg>数量应该是数字格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.195848" elapsed="0.000346"/>
</kw>
<arg>${level_length} &gt;= 2</arg>
<arg>Should Be True</arg>
<arg>isinstance($price_level[1], (int, float, str))</arg>
<arg>数量应该是数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.195697" elapsed="0.000576"/>
</kw>
<arg>${bids[0]}</arg>
<arg>买盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:22.192706" elapsed="0.003642"/>
</kw>
<arg>${bids_length} &gt; 0</arg>
<arg>验证价格层级数据</arg>
<arg>${bids[0]}</arg>
<arg>买盘</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.192498" elapsed="0.003906"/>
</kw>
<arg>${depth_dict['bids']}</arg>
<doc>验证买盘数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:22.190909" elapsed="0.005559"/>
</kw>
<arg>${has_bids}</arg>
<arg>验证买盘数据</arg>
<arg>${depth_dict['bids']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.190481" elapsed="0.006032"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证卖盘数据">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($asks, list)</arg>
<arg>卖盘数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.197684" elapsed="0.000242"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.198176" level="INFO">Length is 214.</msg>
<msg time="2026-05-28T18:04:22.198263" level="INFO">${asks_length} = 214</msg>
<var>${asks_length}</var>
<arg>${asks}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:22.198051" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.198551" level="INFO">卖盘数据包含 214 个价位</msg>
<arg>卖盘数据包含 ${asks_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.198404" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证价格层级数据">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level, list)</arg>
<arg>${side}数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.199724" elapsed="0.000276"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.200246" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T18:04:22.200329" level="INFO">${level_length} = 2</msg>
<var>${level_length}</var>
<arg>${price_level}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:22.200120" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.200590" level="INFO">卖盘数据包含 2 个元素</msg>
<arg>${side}数据包含 ${level_length} 个元素</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.200453" elapsed="0.000176"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.201735" level="INFO">卖盘价格: 73521.63, 数量: 3.099560</msg>
<arg>${side}价格: ${price_level[0]}, 数量: ${price_level[1]}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.200915" elapsed="0.000861"/>
</kw>
<arg>${level_length} &gt;= 2</arg>
<arg>Log</arg>
<arg>${side}价格: ${price_level[0]}, 数量: ${price_level[1]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.200732" elapsed="0.001091"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level[0], (int, float, str))</arg>
<arg>价格应该是数字格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.202107" elapsed="0.000230"/>
</kw>
<arg>${level_length} &gt;= 1</arg>
<arg>Should Be True</arg>
<arg>isinstance($price_level[0], (int, float, str))</arg>
<arg>价格应该是数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.201930" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level[1], (int, float, str))</arg>
<arg>数量应该是数字格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.202674" elapsed="0.000228"/>
</kw>
<arg>${level_length} &gt;= 2</arg>
<arg>Should Be True</arg>
<arg>isinstance($price_level[1], (int, float, str))</arg>
<arg>数量应该是数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.202494" elapsed="0.000456"/>
</kw>
<arg>${asks[0]}</arg>
<arg>卖盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:22.198978" elapsed="0.004065"/>
</kw>
<arg>${asks_length} &gt; 0</arg>
<arg>验证价格层级数据</arg>
<arg>${asks[0]}</arg>
<arg>卖盘</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.198718" elapsed="0.004368"/>
</kw>
<arg>${depth_dict['asks']}</arg>
<doc>验证卖盘数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:22.196952" elapsed="0.006187"/>
</kw>
<arg>${has_asks}</arg>
<arg>验证卖盘数据</arg>
<arg>${depth_dict['asks']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.196670" elapsed="0.006505"/>
</kw>
<arg>${data}</arg>
<doc>验证深度数据字典的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:22.184400" elapsed="0.018832"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证深度数据字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.183830" elapsed="0.019440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.203827" level="INFO">获取市场深度数据 /v1/spot/market/public/depth status=200</msg>
<arg>获取市场深度数据 /v1/spot/market/public/depth status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.203374" elapsed="0.000498"/>
</kw>
<doc>验证市场深度数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:21.769595" elapsed="0.434397"/>
</test>
<doc>市场深度数据接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:21.755081" elapsed="0.449193"/>
</suite>
<suite id="s1-s4-s2-s3" name="Market Plate" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_plate.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.209109" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:22.208953" elapsed="0.000180"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.209451" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.209350" elapsed="0.000138"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:22.209203" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.209610" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.209532" elapsed="0.000118"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:22.209181" elapsed="0.000483"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.210174" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.210076" elapsed="0.000134"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.210388" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.210486" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.210579" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.210666" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.210757" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.210259" elapsed="0.000536"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.210934" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211026" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211116" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211202" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211289" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211380" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211465" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211552" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.211637" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.210812" elapsed="0.000861"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.211937" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.211761" elapsed="0.000211"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.212250" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.212078" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.212538" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.212370" elapsed="0.000199"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.212817" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.212653" elapsed="0.000195"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.213100" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.212932" elapsed="0.000199"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.213388" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.213216" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.213684" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.213502" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.213980" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.213798" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.214271" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.214095" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:22.211691" elapsed="0.002636"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:22.210246" elapsed="0.004096"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.214537" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.214414" elapsed="0.000157"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:22.214869" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:22.214657" elapsed="0.000332"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:22.209883" elapsed="0.005160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.215195" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.215128" elapsed="0.000098"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:22.208759" elapsed="0.006508"/>
</kw>
<test id="s1-s4-s2-s3-t1" name="获取市场盘口数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.217378" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.216869" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.217849" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.217485" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:22.217472" elapsed="0.000437"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:22.217933" elapsed="0.000022"/>
</return>
<msg time="2026-05-28T18:04:22.218077" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:22.216274" elapsed="0.001821"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:22.626576" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/plate 
 path_url=/v1/spot/market/public/plate 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:22.626992" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/plate 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:22 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '508b8706a364d942ba7850ba2cd77969', 'X-Transparent': '00-508b8706a364d942ba7850ba2cd77969-7d0a7e21274110ce-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.004', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f50ed100f14-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1779962662602} 
 </msg>
<msg time="2026-05-28T18:04:22.627392" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:22.627827" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:22.219754" elapsed="0.408146"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:22.628176" elapsed="0.000171"/>
</return>
<msg time="2026-05-28T18:04:22.628805" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/spot/market/public/plate</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:22.218197" elapsed="0.410664"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.631777" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:22.630434" elapsed="0.001492"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.633229" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:22.632198" elapsed="0.001085"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.633816" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.633527" elapsed="0.000384"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:22.629525" elapsed="0.004508"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.636097" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779962662602}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:22.635019" elapsed="0.001120"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.636316" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.636971" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.636785" elapsed="0.000250"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:22.634372" elapsed="0.002753"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.638565" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779962662602}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:22.637774" elapsed="0.000835"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.639480" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779962662602
}</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:22.638791" elapsed="0.000734"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.639972" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779962662602
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.639701" elapsed="0.000403"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:22.637361" elapsed="0.002833"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:22.641012" level="INFO">${data} = []</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.640353" elapsed="0.000689"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.641191" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证盘口数据列表结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($plate_list, list)</arg>
<arg>盘口数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.642421" elapsed="0.000249"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.642955" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T18:04:22.643046" level="INFO">${length} = 0</msg>
<var>${length}</var>
<arg>${plate_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:22.642810" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.643357" level="INFO">盘口数据列表包含 0 个盘口</msg>
<arg>盘口数据列表包含 ${length} 个盘口</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.643208" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${length} &gt; 0</arg>
<arg>验证盘口数据项结构</arg>
<arg>${plate_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.643539" elapsed="0.000153"/>
</kw>
<arg>${data}</arg>
<doc>验证盘口数据列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:22.642078" elapsed="0.001692"/>
</kw>
<arg>isinstance($data, list)</arg>
<arg>验证盘口数据列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.641666" elapsed="0.002163"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>验证盘口数据字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:22.644015" elapsed="0.000186"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.645280" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:22.644747" elapsed="0.000562"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:22.645618" elapsed="0.000539"/>
</kw>
<msg time="2026-05-28T18:04:22.646248" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:22.645443" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.646576" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:22.646416" elapsed="0.000184"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.646927" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:22.646723" elapsed="0.000232"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.647252" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:22.647082" elapsed="0.000195"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.647684" level="INFO">${summary_content} = 🧪 测试过程: 获取市场盘口数据 | 📡 请求接口: /v1/spot/market/public/plate | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:22.647397" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.648316" level="INFO">${final_summary} = 🧪 测试过程: 获取市场盘口数据 | 📡 请求接口: /v1/spot/market/public/plate | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:22.647833" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.648623" level="INFO">🧪 测试过程: 获取市场盘口数据 | 📡 请求接口: /v1/spot/market/public/plate | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.648485" elapsed="0.000184"/>
</kw>
<arg>获取市场盘口数据</arg>
<arg>/v1/spot/market/public/plate</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:22.644422" elapsed="0.004304"/>
</kw>
<doc>验证市场盘口数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:22.215310" elapsed="0.433635"/>
</test>
<doc>市场盘口数据接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:22.205207" elapsed="0.444197"/>
</suite>
<suite id="s1-s4-s2-s4" name="Market Symbol" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_symbol.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.655555" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:22.655318" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.656051" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.655905" elapsed="0.000199"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:22.655688" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.656272" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.656166" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:22.655662" elapsed="0.000683"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.657042" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.656915" elapsed="0.000176"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.657331" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.657463" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.657587" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.657700" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.657802" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.657162" elapsed="0.000713"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658038" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658148" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658253" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658356" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658457" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658559" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658659" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658761" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.658861" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.657897" elapsed="0.001006"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.659348" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.659005" elapsed="0.000381"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.659682" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.659486" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.660011" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.659820" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.660338" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.660146" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.660671" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.660474" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.660999" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.660803" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.661343" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.661130" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.661676" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.661476" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.662016" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:22.661808" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:22.658922" elapsed="0.003161"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:22.657144" elapsed="0.004958"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.662329" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.662187" elapsed="0.000182"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:22.662724" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:22.662466" elapsed="0.000420"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:22.656647" elapsed="0.006303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.663123" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:22.663044" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:22.655047" elapsed="0.008161"/>
</kw>
<test id="s1-s4-s2-s4-t1" name="获取市场交易对列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:22.665709" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:22.665082" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:22.666364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:22.665879" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:22.665862" elapsed="0.000574"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:22.666463" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T18:04:22.666627" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:22.664377" elapsed="0.002271"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:23.047375" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/symbol 
 path_url=/v1/spot/market/public/symbol 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:23.047847" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/symbol 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:22 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '586b9f487a0140d5292e84ff261d0f9f', 'X-Transparent': '00-586b9f487a0140d5292e84ff261d0f9f-a91c03cf7d4749f9-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.005', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f535f4c069f-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"time":1779962662974,"version":"a8bf2843bfff68753e19563ea46baab7","symbols":[{"id":614,"symbol":"btc_usdt","displayName":"BTC_USDT","state":"ONLINE","stateTime":1736315092000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"btc","baseCurrencyPrecision":8,"baseCurrencyId":2,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":2,"quantityPrecision":6,"orderTypes":["LIMIT","MARKET"],"timeInForces":["GTC","IOC"],"displayWeight":100001001,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9432,"symbol":"ordi_usdt","displayName":"ORDI_USDT","state":"ONLINE","stateTime":1734445671000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"ordi","baseCurrencyPrecision":8,"baseCurrencyId":8,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":2,"orderTypes":[],"timeInForces":[],"displayWeight":100001000,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9480,"symbol":"btc_usdc","displayName":"BTC_USDC","state":"ONLINE","stateTime":1751904000000,"tradingEnabled":false,"openapiEnabled":true,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"btc","baseCurrencyPrecision":8,"baseCurrencyId":2,"quoteCurrency":"usdc","quoteCurrencyPrecision":8,"quoteCurrencyId":2749,"pricePrecision":4,"quantityPrecision":4,"orderTypes":[],"timeInForces":[],"displayWeight":999999,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9481,"symbol":"trnsk_usdc","displayName":"TRNSK_USDC","state":"ONLINE","stateTime":1756656000000,"tradingEnabled":true,"openapiEnabled":true,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"TRNSK","baseCurrencyPrecision":18,"baseCurrencyId":2748,"quoteCurrency":"usdc","quoteCurrencyPrecision":8,"quoteCurrencyId":2749,"pricePrecision":2,"quantityPrecision":2,"orderTypes":[],"timeInForces":[],"displayWeight":200000,"displayLevel":"FULL","plates":[],"filters":[]},{"id":620,"symbol":"eos_usdt","displayName":"EOS_USDT","state":"OFFLINE","stateTime":1744037747000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"eos","baseCurrencyPrecision":8,"baseCurrencyId":7,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":3,"quantityPrecision":2,"orderTypes":["LIMIT","MARKET"],"timeInForces":["GTC","IOC"],"displayWeight":100003,"displayLevel":"FULL","plates":[],"filters":[{"filter":"QUOTE_QTY","min":"5"}]},{"id":9473,"symbol":"usdn_usdt","displayName":"USDN_USDT","state":"OFFLINE","stateTime":1741847029000,"tradingEnabled":false,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"usdn","baseCurrencyPrecision":8,"baseCurrencyId":2743,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":2,"quantityPrecision":2,"orderTypes":[],"timeInForces":[],"displayWeight":9999,"displayLevel":"NONE","plates":[],"filters":[{"filter":"QUOTE_QTY","min":"1"}]},{"id":621,"symbol":"xrp_usdt","displayName":"XRP_USDT","state":"ONLINE","stateTime":1762790400000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"xrp","baseCurrencyPrecision":8,"baseCurrencyId":90,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":1,"orderTypes":["LIMIT","MARKET"],"timeInForces":["GTC","IOC"],"displayWeight":9998,"displayLevel":"NONE","plates":[],"filters":[{"filter":"QUOTE_QTY","min":"0.1"}]},{"id":618,"symbol":"ltc_usdt","displayName":"LTC_USDT","state":"ONLINE","stateTime":1705569419000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"ltc","baseCurrencyPrecision":8,"baseCurrencyId":21,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":2,"quantityPrecision":3,"orderTypes":["LIMIT","MARKET"],"timeInForces":["GTC","IOC"],"displayWeight":9997,"displayLevel":"FULL","plates":[],"filters":[]},{"id":633,"symbol":"xrp_btc","displayName":"XRP_BTC","state":"OFFLINE","stateTime":1744094195000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"xrp","baseCurrencyPrecision":8,"baseCurrencyId":90,"quoteCurrency":"btc","quoteCurrencyPrecision":8,"quoteCurrencyId":2,"pricePrecision":9,"quantityPrecision":0,"orderTypes":["LIMIT","MARKET"],"timeInForces":["GTC","IOC"],"displayWeight":9909,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9437,"symbol":"gm_usdt","displayName":"GM_USDT","state":"ONLINE","stateTime":1736736993000,"tradingEnabled":true,"openapiEnabled":true,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"gm","baseCurrencyPrecision":8,"baseCurrencyId":2735,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":2,"quantityPrecision":3,"orderTypes":[],"timeInForces":[],"displayWeight":1000,"displayLevel":"SEARCH","plates":[],"filters":[{"filter":"PROTECTION_ONLINE","durationSeconds":"300","maxPriceMultiple":"1"},{"filter":"PROTECTION_MARKET","maxDeviation":"0.01"}]},{"id":9474,"symbol":"1000usdt_usdt","displayName":"1000USDT_USDT","state":"ONLINE","stateTime":1742825160000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"1000usdt","baseCurrencyPrecision":1,"baseCurrencyId":2744,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":1,"quantityPrecision":1,"orderTypes":[],"timeInForces":[],"displayWeight":999,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9475,"symbol":"btxtest_usdt","displayName":"BTXTEST_USDT","state":"ONLINE","stateTime":1743583533000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"btxtest","baseCurrencyPrecision":8,"baseCurrencyId":2745,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":1,"orderTypes":[],"timeInForces":[],"displayWeight":998,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9477,"symbol":"btxtest2_usdt","displayName":"BTXTEST2_USDT","state":"ONLINE","stateTime":1743586442000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"btxtest2","baseCurrencyPrecision":8,"baseCurrencyId":2746,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":1,"orderTypes":[],"timeInForces":[],"displayWeight":997,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9482,"symbol":"etc_usdc","displayName":"ETC_USDC","state":"ONLINE","stateTime":1757952000000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"etc","baseCurrencyPrecision":8,"baseCurrencyId":6,"quoteCurrency":"usdc","quoteCurrencyPrecision":8,"quoteCurrencyId":2749,"pricePrecision":3,"quantityPrecision":3,"orderTypes":[],"timeInForces":[],"displayWeight":666,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9476,"symbol":"cc_usdt","displayName":"CC_USDT","state":"OFFLINE","stateTime":1743158130000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"cc","baseCurrencyPrecision":8,"baseCurrencyId":2742,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":4,"orderTypes":[],"timeInForces":[],"displayWeight":111,"displayLevel":"NONE","plates":[],"filters":[]},{"id":9434,"symbol":"dot_usdt","displayName":"DOT_USDT","state":"ONLINE","stateTime":1734445769000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"dot","baseCurrencyPrecision":8,"baseCurrencyId":16,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":2,"orderTypes":[],"timeInForces":[],"displayWeight":99,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9436,"symbol":"woo_usdt","displayName":"WOO_USDT","state":"ONLINE","stateTime":1735056000000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"woo","baseCurrencyPrecision":8,"baseCurrencyId":102,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":3,"quantityPrecision":2,"orderTypes":[],"timeInForces":[],"displayWeight":88,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9394,"symbol":"eos_edc","displayName":"EOS_STG","state":"ONLINE","stateTime":1736907280000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"eos","baseCurrencyPrecision":8,"baseCurrencyId":7,"quoteCurrency":"stg","quoteCurrencyPrecision":8,"quoteCurrencyId":197,"pricePrecision":6,"quantityPrecision":1,"orderTypes":[],"timeInForces":[],"displayWeight":22,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9430,"symbol":"btx_usdt","displayName":"BTX_USDT","state":"ONLINE","stateTime":1743155152000,"tradingEnabled":true,"openapiEnabled":true,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"btx","baseCurrencyPrecision":8,"baseCurrencyId":2733,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":4,"quantityPrecision":1,"orderTypes":[],"timeInForces":[],"displayWeight":20,"displayLevel":"FULL","plates":[],"filters":[]},{"id":9435,"symbol":"near_usdt","displayName":"NEAR_USDT","state":"ONLINE","stateTime":1734445825000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T18:04:23.048373" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:23.048791" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:22.667314" elapsed="0.381552"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:23.049106" elapsed="0.000140"/>
</return>
<msg time="2026-05-28T18:04:23.049671" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/spot/market/public/symbol</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:22.666765" elapsed="0.382964"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.052450" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:23.051220" elapsed="0.001379"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.054026" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.052900" elapsed="0.001185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.054646" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.054349" elapsed="0.000394"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:23.050317" elapsed="0.004551"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.058579" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779962662974, 'version': 'a8bf2843bfff68753e19563ea46baab7', 'symbols': [{'id': 614, 'symbol': 'btc_usdt', 'displayName': 'BTC_USDT', 'st...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.055865" elapsed="0.002770"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.058854" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.059539" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.059343" elapsed="0.000262"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:23.055211" elapsed="0.004485"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.062128" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779962662974, 'version': 'a8bf2843bfff68753e19563ea46baab7', 'symbols': [{'id': 614, 'symbol': 'btc_usdt', 'displayName': 'BTC_USDT', 'st...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.060381" elapsed="0.001789"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.065550" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779962662974,
    "version": "a8bf2843bfff68753e19563ea46baab7",
    "symbols": [
      {
        "id": 614,
        "symbo...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:23.062337" elapsed="0.003256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.066114" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779962662974,
    "version": "a8bf2843bfff68753e19563ea46baab7",
    "symbols": [
      {
        "id": 614,
        "symbol": "btc_usdt",
        "displayName": "BTC_USDT",
        "state": "ONLINE",
        "stateTime": 1736315092000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "btc",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 6,
        "orderTypes": [
          "LIMIT",
          "MARKET"
        ],
        "timeInForces": [
          "GTC",
          "IOC"
        ],
        "displayWeight": 100001001,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9432,
        "symbol": "ordi_usdt",
        "displayName": "ORDI_USDT",
        "state": "ONLINE",
        "stateTime": 1734445671000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "ordi",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 8,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 100001000,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9480,
        "symbol": "btc_usdc",
        "displayName": "BTC_USDC",
        "state": "ONLINE",
        "stateTime": 1751904000000,
        "tradingEnabled": false,
        "openapiEnabled": true,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "btc",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2,
        "quoteCurrency": "usdc",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 2749,
        "pricePrecision": 4,
        "quantityPrecision": 4,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 999999,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9481,
        "symbol": "trnsk_usdc",
        "displayName": "TRNSK_USDC",
        "state": "ONLINE",
        "stateTime": 1756656000000,
        "tradingEnabled": true,
        "openapiEnabled": true,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "TRNSK",
        "baseCurrencyPrecision": 18,
        "baseCurrencyId": 2748,
        "quoteCurrency": "usdc",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 2749,
        "pricePrecision": 2,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 200000,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 620,
        "symbol": "eos_usdt",
        "displayName": "EOS_USDT",
        "state": "OFFLINE",
        "stateTime": 1744037747000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "eos",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 7,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 3,
        "quantityPrecision": 2,
        "orderTypes": [
          "LIMIT",
          "MARKET"
        ],
        "timeInForces": [
          "GTC",
          "IOC"
        ],
        "displayWeight": 100003,
        "displayLevel": "FULL",
        "plates": [],
        "filters": [
          {
            "filter": "QUOTE_QTY",
            "min": "5"
          }
        ]
      },
      {
        "id": 9473,
        "symbol": "usdn_usdt",
        "displayName": "USDN_USDT",
        "state": "OFFLINE",
        "stateTime": 1741847029000,
        "tradingEnabled": false,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "usdn",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2743,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 9999,
        "displayLevel": "NONE",
        "plates": [],
        "filters": [
          {
            "filter": "QUOTE_QTY",
            "min": "1"
          }
        ]
      },
      {
        "id": 621,
        "symbol": "xrp_usdt",
        "displayName": "XRP_USDT",
        "state": "ONLINE",
        "stateTime": 1762790400000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "xrp",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 90,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 1,
        "orderTypes": [
          "LIMIT",
          "MARKET"
        ],
        "timeInForces": [
          "GTC",
          "IOC"
        ],
        "displayWeight": 9998,
        "displayLevel": "NONE",
        "plates": [],
        "filters": [
          {
            "filter": "QUOTE_QTY",
            "min": "0.1"
          }
        ]
      },
      {
        "id": 618,
        "symbol": "ltc_usdt",
        "displayName": "LTC_USDT",
        "state": "ONLINE",
        "stateTime": 1705569419000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "ltc",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 21,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 3,
        "orderTypes": [
          "LIMIT",
          "MARKET"
        ],
        "timeInForces": [
          "GTC",
          "IOC"
        ],
        "displayWeight": 9997,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 633,
        "symbol": "xrp_btc",
        "displayName": "XRP_BTC",
        "state": "OFFLINE",
        "stateTime": 1744094195000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "xrp",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 90,
        "quoteCurrency": "btc",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 2,
        "pricePrecision": 9,
        "quantityPrecision": 0,
        "orderTypes": [
          "LIMIT",
          "MARKET"
        ],
        "timeInForces": [
          "GTC",
          "IOC"
        ],
        "displayWeight": 9909,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9437,
        "symbol": "gm_usdt",
        "displayName": "GM_USDT",
        "state": "ONLINE",
        "stateTime": 1736736993000,
        "tradingEnabled": true,
        "openapiEnabled": true,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "gm",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2735,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 3,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1000,
        "displayLevel": "SEARCH",
        "plates": [],
        "filters": [
          {
            "filter": "PROTECTION_ONLINE",
            "durationSeconds": "300",
            "maxPriceMultiple": "1"
          },
          {
            "filter": "PROTECTION_MARKET",
            "maxDeviation": "0.01"
          }
        ]
      },
      {
        "id": 9474,
        "symbol": "1000usdt_usdt",
        "displayName": "1000USDT_USDT",
        "state": "ONLINE",
        "stateTime": 1742825160000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "1000usdt",
        "baseCurrencyPrecision": 1,
        "baseCurrencyId": 2744,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 999,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9475,
        "symbol": "btxtest_usdt",
        "displayName": "BTXTEST_USDT",
        "state": "ONLINE",
        "stateTime": 1743583533000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "btxtest",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2745,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 998,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9477,
        "symbol": "btxtest2_usdt",
        "displayName": "BTXTEST2_USDT",
        "state": "ONLINE",
        "stateTime": 1743586442000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "btxtest2",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2746,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 997,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9482,
        "symbol": "etc_usdc",
        "displayName": "ETC_USDC",
        "state": "ONLINE",
        "stateTime": 1757952000000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "etc",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 6,
        "quoteCurrency": "usdc",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 2749,
        "pricePrecision": 3,
        "quantityPrecision": 3,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 666,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9476,
        "symbol": "cc_usdt",
        "displayName": "CC_USDT",
        "state": "OFFLINE",
        "stateTime": 1743158130000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "cc",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2742,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 4,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 111,
        "displayLevel": "NONE",
        "plates": [],
        "filters": []
      },
      {
        "id": 9434,
        "symbol": "dot_usdt",
        "displayName": "DOT_USDT",
        "state": "ONLINE",
        "stateTime": 1734445769000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "dot",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 16,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 99,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9436,
        "symbol": "woo_usdt",
        "displayName": "WOO_USDT",
        "state": "ONLINE",
        "stateTime": 1735056000000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "woo",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 102,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 3,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 88,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9394,
        "symbol": "eos_edc",
        "displayName": "EOS_STG",
        "state": "ONLINE",
        "stateTime": 1736907280000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "eos",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 7,
        "quoteCurrency": "stg",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 197,
        "pricePrecision": 6,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 22,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9430,
        "symbol": "btx_usdt",
        "displayName": "BTX_USDT",
        "state": "ONLINE",
        "stateTime": 1743155152000,
        "tradingEnabled": true,
        "openapiEnabled": true,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "btx",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2733,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 20,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9435,
        "symbol": "near_usdt",
        "displayName": "NEAR_USDT",
        "state": "ONLINE",
        "stateTime": 1734445825000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "near",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 19,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 3,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 10,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9441,
        "symbol": "tom3_usdt",
        "displayName": "TOM3_USDT",
        "state": "ONLINE",
        "stateTime": 1739498082000,
        "tradingEnabled": true,
        "openapiEnabled": true,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "tom3",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2738,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 3,
        "quantityPrecision": 3,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 3,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9472,
        "symbol": "floki_usdt",
        "displayName": "FLOKI_USDT",
        "state": "ONLINE",
        "stateTime": 1739500330000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "floki",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 48,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9478,
        "symbol": "btx_usdc",
        "displayName": "BTX_USDC",
        "state": "ONLINE",
        "stateTime": 1757952000000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "btx",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2733,
        "quoteCurrency": "usdc",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 2749,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9431,
        "symbol": "sol_usdt",
        "displayName": "SOL_USDT",
        "state": "ONLINE",
        "stateTime": 1734313084000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "sol",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 941,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 3,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9433,
        "symbol": "shib_usdt",
        "displayName": "SHIB_USDT",
        "state": "ONLINE",
        "stateTime": 1736248214000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "shib",
        "baseCurrencyPrecision": 10,
        "baseCurrencyId": 15,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 8,
        "quantityPrecision": 0,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9439,
        "symbol": "tom_usdt",
        "displayName": "TOM_USDT",
        "state": "ONLINE",
        "stateTime": 1739498112000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "tom",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2736,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9440,
        "symbol": "tom2_usdt",
        "displayName": "TOM2_USDT",
        "state": "ONLINE",
        "stateTime": 1739498098000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "tom2",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 2737,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 2,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9443,
        "symbol": "ada_usdt",
        "displayName": "ADA_USDT",
        "state": "ONLINE",
        "stateTime": 1739498852000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "ada",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 12,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 4,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9444,
        "symbol": "avax_usdt",
        "displayName": "AVAX_USDT",
        "state": "ONLINE",
        "stateTime": 1739498903000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "avax",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 13,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9445,
        "symbol": "bnb_usdt",
        "displayName": "BNB_USDT",
        "state": "ONLINE",
        "stateTime": 1739498965000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "bnb",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 675,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9446,
        "symbol": "bch_usdt",
        "displayName": "BCH_USDT",
        "state": "ONLINE",
        "stateTime": 1739499023000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "bch",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 18,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9447,
        "symbol": "ach_usdt",
        "displayName": "ACH_USDT",
        "state": "ONLINE",
        "stateTime": 1739499603000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "ach",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 149,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9448,
        "symbol": "jto_usdt",
        "displayName": "JTO_USDT",
        "state": "ONLINE",
        "stateTime": 1739499588000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "jto",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 119,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9449,
        "symbol": "link_usdt",
        "displayName": "LINK_USDT",
        "state": "ONLINE",
        "stateTime": 1739499790000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "link",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 17,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9450,
        "symbol": "wbtc_usdt",
        "displayName": "WBTC_USDT",
        "state": "ONLINE",
        "stateTime": 1739499870000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "wbtc",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 20,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9451,
        "symbol": "fil_usdt",
        "displayName": "FIL_USDT",
        "state": "ONLINE",
        "stateTime": 1739500297000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "fil",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 24,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9452,
        "symbol": "stx_usdt",
        "displayName": "STX_USDT",
        "state": "ONLINE",
        "stateTime": 1739500309000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "stx",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 25,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9453,
        "symbol": "imx_usdt",
        "displayName": "IMX_USDT",
        "state": "ONLINE",
        "stateTime": 1739500575000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "imx",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 26,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9454,
        "symbol": "uni_usdt",
        "displayName": "UNI_USDT",
        "state": "ONLINE",
        "stateTime": 1739500564000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "uni",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 27,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9456,
        "symbol": "mkr_usdt",
        "displayName": "MKR_USDT",
        "state": "ONLINE",
        "stateTime": 1739500543000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "mkr",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 29,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9457,
        "symbol": "icp_usdt",
        "displayName": "ICP_USDT",
        "state": "ONLINE",
        "stateTime": 1739500532000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "icp",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 30,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9458,
        "symbol": "vet_usdt",
        "displayName": "VET_USDT",
        "state": "ONLINE",
        "stateTime": 1739500520000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "vet",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 31,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9459,
        "symbol": "inj_usdt",
        "displayName": "INJ_USDT",
        "state": "ONLINE",
        "stateTime": 1739500510000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "inj",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 33,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9460,
        "symbol": "fdusd_usdt",
        "displayName": "FDUSD_USDT",
        "state": "ONLINE",
        "stateTime": 1739500499000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "fdusd",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 34,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9461,
        "symbol": "flow_usdt",
        "displayName": "FLOW_USDT",
        "state": "ONLINE",
        "stateTime": 1739500460000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "flow",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 35,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9462,
        "symbol": "fet_usdt",
        "displayName": "FET_USDT",
        "state": "ONLINE",
        "stateTime": 1739500450000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "fet",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 37,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9463,
        "symbol": "wif_usdt",
        "displayName": "WIF_USDT",
        "state": "ONLINE",
        "stateTime": 1739500440000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "wif",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 38,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9464,
        "symbol": "ronin_usdt",
        "displayName": "RONIN_USDT",
        "state": "ONLINE",
        "stateTime": 1739500429000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "ronin",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 39,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9465,
        "symbol": "grt_usdt",
        "displayName": "GRT_USDT",
        "state": "ONLINE",
        "stateTime": 1739500417000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "grt",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 40,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9466,
        "symbol": "op_usdt",
        "displayName": "OP_USDT",
        "state": "ONLINE",
        "stateTime": 1739500405000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "op",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 41,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9467,
        "symbol": "wbeth_usdt",
        "displayName": "WBETH_USDT",
        "state": "ONLINE",
        "stateTime": 1739500394000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "wbeth",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 42,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9468,
        "symbol": "strk_usdt",
        "displayName": "STRK_USDT",
        "state": "ONLINE",
        "stateTime": 1739500384000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "strk",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 43,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9469,
        "symbol": "ar_usdt",
        "displayName": "AR_USDT",
        "state": "ONLINE",
        "stateTime": 1739500374000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "ar",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 45,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      },
      {
        "id": 9470,
        "symbol": "bonk_usdt",
        "displayName": "BONK_USDT",
        "state": "ONLINE",
        "stateTime": 1739500365000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "bonk",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 46,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      }
    ]
  },
  "ts": 1779962662974
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.065765" elapsed="0.000952"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:23.059944" elapsed="0.006863"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:23.068434" level="INFO">${data} = {'time': 1779962662974, 'version': 'a8bf2843bfff68753e19563ea46baab7', 'symbols': [{'id': 614, 'symbol': 'btc_usdt', 'displayName': 'BTC_USDT', 'state': 'ONLINE', 'stateTime': 1736315092000, 'tradingE...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.066960" elapsed="0.001514"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.068632" elapsed="0.000597"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, list)</arg>
<arg>验证交易对列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.069388" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证交易对字典结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($symbol_dict, dict)</arg>
<arg>交易对数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.070404" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:23.070905" level="INFO">${keys} = ['symbols', 'time', 'version']</msg>
<var>${keys}</var>
<arg>${symbol_dict}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:23.070740" elapsed="0.000189"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.071139" level="INFO">Length is 3.</msg>
<msg time="2026-05-28T18:04:23.071202" level="INFO">${count} = 3</msg>
<var>${count}</var>
<arg>${keys}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:23.071033" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.071444" level="INFO">交易对字典包含 3 个字段</msg>
<arg>交易对字典包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.071325" elapsed="0.000158"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.072172" level="INFO">交易对字典内容: {'time': 1779962662974, 'version': 'a8bf2843bfff68753e19563ea46baab7', 'symbols': [{'id': 614, 'symbol': 'btc_usdt', 'displayName': 'BTC_USDT', 'state': 'ONLINE', 'stateTime': 1736315092000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'btc', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 6, 'orderTypes': ['LIMIT', 'MARKET'], 'timeInForces': ['GTC', 'IOC'], 'displayWeight': 100001001, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9432, 'symbol': 'ordi_usdt', 'displayName': 'ORDI_USDT', 'state': 'ONLINE', 'stateTime': 1734445671000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'ordi', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 8, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 100001000, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9480, 'symbol': 'btc_usdc', 'displayName': 'BTC_USDC', 'state': 'ONLINE', 'stateTime': 1751904000000, 'tradingEnabled': False, 'openapiEnabled': True, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'btc', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2, 'quoteCurrency': 'usdc', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 2749, 'pricePrecision': 4, 'quantityPrecision': 4, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 999999, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9481, 'symbol': 'trnsk_usdc', 'displayName': 'TRNSK_USDC', 'state': 'ONLINE', 'stateTime': 1756656000000, 'tradingEnabled': True, 'openapiEnabled': True, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'TRNSK', 'baseCurrencyPrecision': 18, 'baseCurrencyId': 2748, 'quoteCurrency': 'usdc', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 2749, 'pricePrecision': 2, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 200000, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 620, 'symbol': 'eos_usdt', 'displayName': 'EOS_USDT', 'state': 'OFFLINE', 'stateTime': 1744037747000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'eos', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 7, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 3, 'quantityPrecision': 2, 'orderTypes': ['LIMIT', 'MARKET'], 'timeInForces': ['GTC', 'IOC'], 'displayWeight': 100003, 'displayLevel': 'FULL', 'plates': [], 'filters': [{'filter': 'QUOTE_QTY', 'min': '5'}]}, {'id': 9473, 'symbol': 'usdn_usdt', 'displayName': 'USDN_USDT', 'state': 'OFFLINE', 'stateTime': 1741847029000, 'tradingEnabled': False, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'usdn', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2743, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 9999, 'displayLevel': 'NONE', 'plates': [], 'filters': [{'filter': 'QUOTE_QTY', 'min': '1'}]}, {'id': 621, 'symbol': 'xrp_usdt', 'displayName': 'XRP_USDT', 'state': 'ONLINE', 'stateTime': 1762790400000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'xrp', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 90, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 1, 'orderTypes': ['LIMIT', 'MARKET'], 'timeInForces': ['GTC', 'IOC'], 'displayWeight': 9998, 'displayLevel': 'NONE', 'plates': [], 'filters': [{'filter': 'QUOTE_QTY', 'min': '0.1'}]}, {'id': 618, 'symbol': 'ltc_usdt', 'displayName': 'LTC_USDT', 'state': 'ONLINE', 'stateTime': 1705569419000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'ltc', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 21, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 3, 'orderTypes': ['LIMIT', 'MARKET'], 'timeInForces': ['GTC', 'IOC'], 'displayWeight': 9997, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 633, 'symbol': 'xrp_btc', 'displayName': 'XRP_BTC', 'state': 'OFFLINE', 'stateTime': 1744094195000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'xrp', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 90, 'quoteCurrency': 'btc', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 2, 'pricePrecision': 9, 'quantityPrecision': 0, 'orderTypes': ['LIMIT', 'MARKET'], 'timeInForces': ['GTC', 'IOC'], 'displayWeight': 9909, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9437, 'symbol': 'gm_usdt', 'displayName': 'GM_USDT', 'state': 'ONLINE', 'stateTime': 1736736993000, 'tradingEnabled': True, 'openapiEnabled': True, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'gm', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2735, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 3, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1000, 'displayLevel': 'SEARCH', 'plates': [], 'filters': [{'filter': 'PROTECTION_ONLINE', 'durationSeconds': '300', 'maxPriceMultiple': '1'}, {'filter': 'PROTECTION_MARKET', 'maxDeviation': '0.01'}]}, {'id': 9474, 'symbol': '1000usdt_usdt', 'displayName': '1000USDT_USDT', 'state': 'ONLINE', 'stateTime': 1742825160000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': '1000usdt', 'baseCurrencyPrecision': 1, 'baseCurrencyId': 2744, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 999, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9475, 'symbol': 'btxtest_usdt', 'displayName': 'BTXTEST_USDT', 'state': 'ONLINE', 'stateTime': 1743583533000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'btxtest', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2745, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 998, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9477, 'symbol': 'btxtest2_usdt', 'displayName': 'BTXTEST2_USDT', 'state': 'ONLINE', 'stateTime': 1743586442000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'btxtest2', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2746, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 997, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9482, 'symbol': 'etc_usdc', 'displayName': 'ETC_USDC', 'state': 'ONLINE', 'stateTime': 1757952000000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'etc', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 6, 'quoteCurrency': 'usdc', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 2749, 'pricePrecision': 3, 'quantityPrecision': 3, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 666, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9476, 'symbol': 'cc_usdt', 'displayName': 'CC_USDT', 'state': 'OFFLINE', 'stateTime': 1743158130000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'cc', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2742, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 4, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 111, 'displayLevel': 'NONE', 'plates': [], 'filters': []}, {'id': 9434, 'symbol': 'dot_usdt', 'displayName': 'DOT_USDT', 'state': 'ONLINE', 'stateTime': 1734445769000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'dot', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 16, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 99, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9436, 'symbol': 'woo_usdt', 'displayName': 'WOO_USDT', 'state': 'ONLINE', 'stateTime': 1735056000000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'woo', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 102, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 3, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 88, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9394, 'symbol': 'eos_edc', 'displayName': 'EOS_STG', 'state': 'ONLINE', 'stateTime': 1736907280000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'eos', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 7, 'quoteCurrency': 'stg', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 197, 'pricePrecision': 6, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 22, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9430, 'symbol': 'btx_usdt', 'displayName': 'BTX_USDT', 'state': 'ONLINE', 'stateTime': 1743155152000, 'tradingEnabled': True, 'openapiEnabled': True, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'btx', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2733, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 20, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9435, 'symbol': 'near_usdt', 'displayName': 'NEAR_USDT', 'state': 'ONLINE', 'stateTime': 1734445825000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'near', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 19, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 3, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 10, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9441, 'symbol': 'tom3_usdt', 'displayName': 'TOM3_USDT', 'state': 'ONLINE', 'stateTime': 1739498082000, 'tradingEnabled': True, 'openapiEnabled': True, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'tom3', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2738, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 3, 'quantityPrecision': 3, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 3, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9472, 'symbol': 'floki_usdt', 'displayName': 'FLOKI_USDT', 'state': 'ONLINE', 'stateTime': 1739500330000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'floki', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 48, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9478, 'symbol': 'btx_usdc', 'displayName': 'BTX_USDC', 'state': 'ONLINE', 'stateTime': 1757952000000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'btx', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2733, 'quoteCurrency': 'usdc', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 2749, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9431, 'symbol': 'sol_usdt', 'displayName': 'SOL_USDT', 'state': 'ONLINE', 'stateTime': 1734313084000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'sol', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 941, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 3, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9433, 'symbol': 'shib_usdt', 'displayName': 'SHIB_USDT', 'state': 'ONLINE', 'stateTime': 1736248214000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'shib', 'baseCurrencyPrecision': 10, 'baseCurrencyId': 15, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 8, 'quantityPrecision': 0, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9439, 'symbol': 'tom_usdt', 'displayName': 'TOM_USDT', 'state': 'ONLINE', 'stateTime': 1739498112000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'tom', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2736, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9440, 'symbol': 'tom2_usdt', 'displayName': 'TOM2_USDT', 'state': 'ONLINE', 'stateTime': 1739498098000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'tom2', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 2737, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 2, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9443, 'symbol': 'ada_usdt', 'displayName': 'ADA_USDT', 'state': 'ONLINE', 'stateTime': 1739498852000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'ada', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 12, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 4, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9444, 'symbol': 'avax_usdt', 'displayName': 'AVAX_USDT', 'state': 'ONLINE', 'stateTime': 1739498903000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'avax', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 13, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9445, 'symbol': 'bnb_usdt', 'displayName': 'BNB_USDT', 'state': 'ONLINE', 'stateTime': 1739498965000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'bnb', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 675, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9446, 'symbol': 'bch_usdt', 'displayName': 'BCH_USDT', 'state': 'ONLINE', 'stateTime': 1739499023000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'bch', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 18, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9447, 'symbol': 'ach_usdt', 'displayName': 'ACH_USDT', 'state': 'ONLINE', 'stateTime': 1739499603000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'ach', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 149, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9448, 'symbol': 'jto_usdt', 'displayName': 'JTO_USDT', 'state': 'ONLINE', 'stateTime': 1739499588000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'jto', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 119, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9449, 'symbol': 'link_usdt', 'displayName': 'LINK_USDT', 'state': 'ONLINE', 'stateTime': 1739499790000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'link', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 17, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9450, 'symbol': 'wbtc_usdt', 'displayName': 'WBTC_USDT', 'state': 'ONLINE', 'stateTime': 1739499870000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'wbtc', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 20, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9451, 'symbol': 'fil_usdt', 'displayName': 'FIL_USDT', 'state': 'ONLINE', 'stateTime': 1739500297000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'fil', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 24, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9452, 'symbol': 'stx_usdt', 'displayName': 'STX_USDT', 'state': 'ONLINE', 'stateTime': 1739500309000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'stx', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 25, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9453, 'symbol': 'imx_usdt', 'displayName': 'IMX_USDT', 'state': 'ONLINE', 'stateTime': 1739500575000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'imx', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 26, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9454, 'symbol': 'uni_usdt', 'displayName': 'UNI_USDT', 'state': 'ONLINE', 'stateTime': 1739500564000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'uni', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 27, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9456, 'symbol': 'mkr_usdt', 'displayName': 'MKR_USDT', 'state': 'ONLINE', 'stateTime': 1739500543000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'mkr', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 29, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9457, 'symbol': 'icp_usdt', 'displayName': 'ICP_USDT', 'state': 'ONLINE', 'stateTime': 1739500532000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'icp', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 30, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9458, 'symbol': 'vet_usdt', 'displayName': 'VET_USDT', 'state': 'ONLINE', 'stateTime': 1739500520000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'vet', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 31, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9459, 'symbol': 'inj_usdt', 'displayName': 'INJ_USDT', 'state': 'ONLINE', 'stateTime': 1739500510000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'inj', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 33, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9460, 'symbol': 'fdusd_usdt', 'displayName': 'FDUSD_USDT', 'state': 'ONLINE', 'stateTime': 1739500499000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'fdusd', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 34, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9461, 'symbol': 'flow_usdt', 'displayName': 'FLOW_USDT', 'state': 'ONLINE', 'stateTime': 1739500460000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'flow', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 35, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9462, 'symbol': 'fet_usdt', 'displayName': 'FET_USDT', 'state': 'ONLINE', 'stateTime': 1739500450000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'fet', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 37, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9463, 'symbol': 'wif_usdt', 'displayName': 'WIF_USDT', 'state': 'ONLINE', 'stateTime': 1739500440000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'wif', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 38, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9464, 'symbol': 'ronin_usdt', 'displayName': 'RONIN_USDT', 'state': 'ONLINE', 'stateTime': 1739500429000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'ronin', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 39, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9465, 'symbol': 'grt_usdt', 'displayName': 'GRT_USDT', 'state': 'ONLINE', 'stateTime': 1739500417000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'grt', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 40, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9466, 'symbol': 'op_usdt', 'displayName': 'OP_USDT', 'state': 'ONLINE', 'stateTime': 1739500405000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'op', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 41, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9467, 'symbol': 'wbeth_usdt', 'displayName': 'WBETH_USDT', 'state': 'ONLINE', 'stateTime': 1739500394000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'wbeth', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 42, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9468, 'symbol': 'strk_usdt', 'displayName': 'STRK_USDT', 'state': 'ONLINE', 'stateTime': 1739500384000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'strk', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 43, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9469, 'symbol': 'ar_usdt', 'displayName': 'AR_USDT', 'state': 'ONLINE', 'stateTime': 1739500374000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'ar', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 45, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}, {'id': 9470, 'symbol': 'bonk_usdt', 'displayName': 'BONK_USDT', 'state': 'ONLINE', 'stateTime': 1739500365000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'bonk', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 46, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 1, 'quantityPrecision': 1, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1, 'displayLevel': 'FULL', 'plates': [], 'filters': []}]}</msg>
<arg>交易对字典内容: ${symbol_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.071580" elapsed="0.000943"/>
</kw>
<arg>${data}</arg>
<doc>验证交易对字典的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:23.070075" elapsed="0.002514"/>
</kw>
<arg>isinstance($data, dict)</arg>
<arg>验证交易对字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.069718" elapsed="0.002916"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.073709" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.073195" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:23.073993" elapsed="0.000484"/>
</kw>
<msg time="2026-05-28T18:04:23.074565" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:23.073855" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.074853" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.074708" elapsed="0.000166"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.075173" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.074974" elapsed="0.000221"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.075444" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.075305" elapsed="0.000159"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.075810" level="INFO">${summary_content} = 🧪 测试过程: 获取市场交易对列表 | 📡 请求接口: /v1/spot/market/public/symbol | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.075559" elapsed="0.000276"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.076110" level="INFO">${final_summary} = 🧪 测试过程: 获取市场交易对列表 | 📡 请求接口: /v1/spot/market/public/symbol | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.075931" elapsed="0.000201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.076332" level="INFO">🧪 测试过程: 获取市场交易对列表 | 📡 请求接口: /v1/spot/market/public/symbol | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.076226" elapsed="0.000142"/>
</kw>
<arg>获取市场交易对列表</arg>
<arg>/v1/spot/market/public/symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:23.072856" elapsed="0.003568"/>
</kw>
<doc>验证市场交易对接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:22.663269" elapsed="0.413312"/>
</test>
<doc>市场交易对接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:22.650565" elapsed="0.429305"/>
</suite>
<suite id="s1-s4-s2-s5" name="Market Time" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_time.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.085530" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:23.085259" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.086699" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.086387" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:23.085714" elapsed="0.001127"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.087029" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.086876" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.085677" elapsed="0.001434"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.087963" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.087811" elapsed="0.000204"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.088304" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.088439" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.088570" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.088696" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.088817" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.088094" elapsed="0.000845"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089140" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089266" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089394" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089518" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089642" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089766" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.089886" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.090007" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.090124" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.088967" elapsed="0.001207"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.090567" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.090297" elapsed="0.000315"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.090963" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.090729" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.091282" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.091097" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.091615" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.091417" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.091945" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.091748" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.092269" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.092077" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.092605" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.092401" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.092946" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.092738" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.093283" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.093079" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:23.090199" elapsed="0.003151"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.088071" elapsed="0.005296"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.093596" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.093453" elapsed="0.000182"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:23.094028" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:23.093731" elapsed="0.000501"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.087469" elapsed="0.006831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.094480" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.094396" elapsed="0.000122"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.084870" elapsed="0.009700"/>
</kw>
<test id="s1-s4-s2-s5-t1" name="获取市场服务器时间" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.097238" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.096607" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.097904" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.097409" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.097392" elapsed="0.000588"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:23.098013" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T18:04:23.098215" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.095867" elapsed="0.002372"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:23.435723" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/time 
 path_url=/v1/spot/market/public/time 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:23.436014" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/time 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:23 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'f0e30954a7a33885d00ee1c3968978f0', 'X-Transparent': '00-f0e30954a7a33885d00ee1c3968978f0-6a2bd7c95e7f5de3-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.005', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f560977b852-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"serverTime":1779962663411},"ts":1779962663411} 
 </msg>
<msg time="2026-05-28T18:04:23.436160" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:23.436452" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:23.099018" elapsed="0.337495"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:23.436687" elapsed="0.000083"/>
</return>
<msg time="2026-05-28T18:04:23.437074" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/spot/market/public/time</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:23.098372" elapsed="0.338755"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.439700" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:23.438226" elapsed="0.001613"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.441174" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.440104" elapsed="0.001128"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.441761" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.441481" elapsed="0.000369"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:23.437534" elapsed="0.004435"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.443807" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1779962663411}, 'ts': 1779962663411}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.442944" elapsed="0.000888"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.443934" elapsed="0.000149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.444272" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.444170" elapsed="0.000137"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:23.442285" elapsed="0.002070"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.445945" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1779962663411}, 'ts': 1779962663411}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.445143" elapsed="0.000848"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.446770" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1779962663411
  },
  "ts": 1779962663411
}</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:23.446184" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.447336" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1779962663411
  },
  "ts": 1779962663411
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.447070" elapsed="0.000376"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:23.444560" elapsed="0.002984"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:23.448597" level="INFO">${data} = {'serverTime': 1779962663411}</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.447720" elapsed="0.000923"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (int, str, dict))</arg>
<arg>响应数据应该是整数、字符串或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.448854" elapsed="0.000515"/>
</kw>
<kw name="验证时间数据">
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($time_data, int)</arg>
<arg>验证时间戳格式</arg>
<arg>${time_data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.450141" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($time_data, str)</arg>
<arg>验证时间字符串格式</arg>
<arg>${time_data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.450635" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证时间字典结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($time_dict, dict)</arg>
<arg>时间数据应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.451888" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.452561" level="INFO">时间字典内容: {'serverTime': 1779962663411}</msg>
<arg>时间字典内容: ${time_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.452383" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:23.453279" level="FAIL">Dictionary does not contain key 'timestamp'.</msg>
<arg>${time_dict}</arg>
<arg>timestamp</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:23.452979" elapsed="0.000421">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T18:04:23.453527" level="INFO">${has_timestamp} = False</msg>
<var>${has_timestamp}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${time_dict}</arg>
<arg>timestamp</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:23.452790" elapsed="0.000769"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_timestamp}</arg>
<arg>验证时间戳格式</arg>
<arg>${time_dict['timestamp']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.453727" elapsed="0.000139"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:23.454340" level="FAIL">Dictionary does not contain key 'time'.</msg>
<arg>${time_dict}</arg>
<arg>time</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:23.454132" elapsed="0.000275">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-05-28T18:04:23.454517" level="INFO">${has_time} = False</msg>
<var>${has_time}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${time_dict}</arg>
<arg>time</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:23.453992" elapsed="0.000550"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_time}</arg>
<arg>Log</arg>
<arg>时间字段: ${time_dict['time']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.454685" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${time_dict}</arg>
<arg>serverTime</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.455392" elapsed="0.000157"/>
</kw>
<msg time="2026-05-28T18:04:23.455645" level="INFO">${has_server_time} = True</msg>
<var>${has_server_time}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${time_dict}</arg>
<arg>serverTime</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:23.455254" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该是正整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.456941" elapsed="0.000286"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.457641" level="INFO">${timestamp_str} = 1779962663411</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T18:04:23.457397" elapsed="0.000273"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.457938" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T18:04:23.458021" level="INFO">${length} = 13</msg>
<var>${length}</var>
<arg>${timestamp_str}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:23.457796" elapsed="0.000250"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} == 10 or ${length} == 13</arg>
<arg>时间戳长度应该是10位或13位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.458169" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.458795" level="INFO">服务器时间戳: 1779962663411</msg>
<arg>服务器时间戳: ${timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.458638" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="转换毫秒时间戳">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.460256" level="INFO">${seconds} = 1779962663</msg>
<var>${seconds}</var>
<arg>${milliseconds} // 1000</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:23.459996" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.460584" level="INFO">毫秒时间戳 1779962663411 对应秒级时间戳: 1779962663</msg>
<arg>毫秒时间戳 ${milliseconds} 对应秒级时间戳: ${seconds}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.460422" elapsed="0.000204"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.460974" level="INFO">${readable_time} = 2026-05-28 18:04:23</msg>
<var>${readable_time}</var>
<arg>__import__('datetime').datetime.fromtimestamp(${seconds}).strftime('%Y-%m-%d %H:%M:%S')</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:23.460728" elapsed="0.002534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.463682" level="INFO">可读时间格式: 2026-05-28 18:04:23</msg>
<arg>可读时间格式: ${readable_time}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.463471" elapsed="0.000264"/>
</kw>
<arg>${timestamp}</arg>
<doc>转换毫秒级时间戳为可读格式</doc>
<status status="PASS" start="2026-05-28T18:04:23.459471" elapsed="0.004341"/>
</kw>
<arg>${length} == 13</arg>
<arg>转换毫秒时间戳</arg>
<arg>${timestamp}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.458966" elapsed="0.004901"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${length} == 10</arg>
<arg>转换秒级时间戳</arg>
<arg>${timestamp}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.464014" elapsed="0.000181"/>
</kw>
<arg>${time_dict['serverTime']}</arg>
<doc>验证时间戳的格式和有效性</doc>
<status status="PASS" start="2026-05-28T18:04:23.456103" elapsed="0.008162"/>
</kw>
<arg>${has_server_time}</arg>
<arg>验证时间戳格式</arg>
<arg>${time_dict['serverTime']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.455807" elapsed="0.008511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:23.464876" level="FAIL">Dictionary does not contain key 'currentTime'.</msg>
<arg>${time_dict}</arg>
<arg>currentTime</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:23.464619" elapsed="0.000365">Dictionary does not contain key 'currentTime'.</status>
</kw>
<msg time="2026-05-28T18:04:23.465091" level="INFO">${has_current_time} = False</msg>
<var>${has_current_time}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${time_dict}</arg>
<arg>currentTime</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:23.464468" elapsed="0.000645"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_current_time}</arg>
<arg>Log</arg>
<arg>当前时间: ${time_dict['currentTime']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.465262" elapsed="0.000112"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T18:04:23.465672" level="INFO">${keys} = ['serverTime']</msg>
<var>${keys}</var>
<arg>${time_dict}</arg>
<doc>Returns keys of the given ``dictionary`` as a list.</doc>
<status status="PASS" start="2026-05-28T18:04:23.465478" elapsed="0.000219"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.465920" level="INFO">Length is 1.</msg>
<msg time="2026-05-28T18:04:23.465986" level="INFO">${count} = 1</msg>
<var>${count}</var>
<arg>${keys}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:23.465806" elapsed="0.000200"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.466272" level="INFO">时间字典包含 1 个字段: ['serverTime']</msg>
<arg>时间字典包含 ${count} 个字段: ${keys}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.466123" elapsed="0.000190"/>
</kw>
<arg>${time_data}</arg>
<doc>验证时间字典的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:23.451454" elapsed="0.014924"/>
</kw>
<arg>isinstance($time_data, dict)</arg>
<arg>验证时间字典结构</arg>
<arg>${time_data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:23.451047" elapsed="0.015379"/>
</kw>
<arg>${data}</arg>
<doc>验证时间数据的格式和有效性</doc>
<status status="PASS" start="2026-05-28T18:04:23.449662" elapsed="0.016824"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.467797" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.467159" elapsed="0.000673"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:23.468152" elapsed="0.000554"/>
</kw>
<msg time="2026-05-28T18:04:23.468807" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:23.467981" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.469147" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.468975" elapsed="0.000199"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.469513" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.469303" elapsed="0.000235"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.469830" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.469663" elapsed="0.000192"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.470260" level="INFO">${summary_content} = 🧪 测试过程: 获取市场服务器时间 | 📡 请求接口: /v1/spot/market/public/time | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.469967" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.470645" level="INFO">${final_summary} = 🧪 测试过程: 获取市场服务器时间 | 📡 请求接口: /v1/spot/market/public/time | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:23.470421" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.470915" level="INFO">🧪 测试过程: 获取市场服务器时间 | 📡 请求接口: /v1/spot/market/public/time | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.470796" elapsed="0.000208"/>
</kw>
<arg>获取市场服务器时间</arg>
<arg>/v1/spot/market/public/time</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:23.466756" elapsed="0.004309"/>
</kw>
<doc>验证市场服务器时间接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:23.094633" elapsed="0.376611"/>
</test>
<doc>市场服务器时间接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:23.080875" elapsed="0.390761"/>
</suite>
<suite id="s1-s4-s2-s6" name="Market Top Symbol" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_top_symbol.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.477293" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:23.477197" elapsed="0.000111"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.477518" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.477452" elapsed="0.000089"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:23.477352" elapsed="0.000205"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.477634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.477570" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.477341" elapsed="0.000373"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.478446" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.478307" elapsed="0.000187"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.478749" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.478889" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479025" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479148" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479272" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.478567" elapsed="0.000757"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479523" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479651" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479777" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479895" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.479996" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.480098" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.480173" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.480220" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.480267" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.479347" elapsed="0.000941"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.480441" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.480336" elapsed="0.000123"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.480599" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.480506" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.480756" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.480664" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.480913" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.480818" elapsed="0.000113"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.481069" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.480977" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.481255" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.481154" elapsed="0.000119"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.481424" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.481322" elapsed="0.000120"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.481588" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.481490" elapsed="0.000116"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.481840" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.481653" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:23.480297" elapsed="0.001612"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.478548" elapsed="0.003380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.482162" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.482016" elapsed="0.000187"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:23.482569" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:23.482302" elapsed="0.000418"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.478020" elapsed="0.004764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.482965" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.482883" elapsed="0.000119"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.477076" elapsed="0.005975"/>
</kw>
<test id="s1-s4-s2-s6-t1" name="获取热门市场排行榜" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.484414" level="INFO">&amp;{params} = { marketTopType=HOT }</msg>
<var>&amp;{params}</var>
<arg>marketTopType=HOT</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.484139" elapsed="0.000298"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.485756" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.485225" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.486102" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.485859" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.485850" elapsed="0.000290"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:23.486155" elapsed="0.000016"/>
</return>
<msg time="2026-05-28T18:04:23.486249" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.484595" elapsed="0.001666"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:23.861402" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT 
 path_url=/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:23.861663" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:23 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'e4d6e07207f3a10e733014bd9ff892fd', 'X-Transparent': '00-e4d6e07207f3a10e733014bd9ff892fd-446758dcb6d65c54-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.005', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f58a93507a1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1779962663835} 
 </msg>
<msg time="2026-05-28T18:04:23.861794" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:23.862119" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:23.486519" elapsed="0.375642"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:23.862310" elapsed="0.000095"/>
</return>
<msg time="2026-05-28T18:04:23.862667" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/spot/market/public/top/market-top-symbol</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:23.486326" elapsed="0.376375"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.864500" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:23.863675" elapsed="0.000920"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.865332" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.864769" elapsed="0.000590"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.865654" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.865495" elapsed="0.000207"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:23.863089" elapsed="0.002679"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.866905" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779962663835}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.866306" elapsed="0.000631"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.867067" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.867516" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.867387" elapsed="0.000172"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:23.865970" elapsed="0.001650"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.868672" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779962663835}</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:23.868101" elapsed="0.000606"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.869394" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779962663835
}</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:23.868855" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.869821" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779962663835
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.869587" elapsed="0.000343"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:23.867791" elapsed="0.002212"/>
</kw>
<doc>验证热门市场排行榜接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:23.483105" elapsed="0.387084"/>
</test>
<doc>热门市场排行榜接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:23.472671" elapsed="0.397902"/>
</suite>
<suite id="s1-s4-s2-s7" name="Market Trade Recent" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_trade_recent.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.877164" level="INFO">${cli_env} = bitradex_test</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T18:04:23.876936" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.877672" level="INFO">未检测到命令行TEST_ENV变量，使用默认值: bitradex_test</msg>
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.877520" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:23.877302" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.877898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.877790" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.877274" elapsed="0.000704"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.878665" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.878547" elapsed="0.000160"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.878914" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879028" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879135" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879238" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879383" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.878767" elapsed="0.000661"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879591" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879702" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879808" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.879912" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.880013" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.880117" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.880218" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.880320" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.880417" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.879448" elapsed="0.001012"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.880773" level="INFO">${BASE_URL} = https://app.bitradex-test.com</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.880562" elapsed="0.000252"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.881111" level="INFO">${ENV_NAME} = BitRadeX测试环境</msg>
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.880914" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.881439" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.881248" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.881767" level="INFO">${HOST_NAME} = app.bitradex-test.com</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.881573" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.882099" level="INFO">${APP_PREFIX} = Test</msg>
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.881898" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.882422" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.882231" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.882755" level="INFO">${DEFAULT_APP_VERSION} = 1.2.0</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.882553" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.883093" level="INFO">${DEFAULT_BUILD_CODE} = 7034</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.882889" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.883429" level="INFO">${DEFAULT_APP_CHANNEL} = ios-test-flight</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T18:04:23.883225" elapsed="0.000237"/>
</kw>
<status status="PASS" start="2026-05-28T18:04:23.880478" elapsed="0.003014"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.878751" elapsed="0.004759"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.883742" level="INFO">已设置测试环境: BitRadeX测试环境 (https://app.bitradex-test.com)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.883600" elapsed="0.000182"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:23.884145" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex-test.com, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T18:04:23.883880" elapsed="0.000554"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.878296" elapsed="0.006202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.884680" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:23.884597" elapsed="0.000122"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.876661" elapsed="0.008106"/>
</kw>
<test id="s1-s4-s2-s7-t1" name="获取最近交易记录" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.886049" level="INFO">&amp;{params} = { symbol=btc_usdt | limit=30 }</msg>
<var>&amp;{params}</var>
<arg>symbol=btc_usdt</arg>
<arg>limit=30</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.885842" elapsed="0.000233"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T18:04:23.887519" level="INFO">&amp;{headers} = { user-agent=BitradeX-Test 1.2.0(7034);iPhone | app-version-name=1.2.0 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7034 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T18:04:23.886993" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T18:04:23.888059" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T18:04:23.887640" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-28T18:04:23.887625" elapsed="0.000498"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T18:04:23.888153" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T18:04:23.888321" level="INFO">${headers} = {'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T18:04:23.886277" elapsed="0.002064"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T18:04:24.261504" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30 
 path_url=/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30 
 headers={'user-agent': 'BitradeX-Test 1.2.0(7034);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.2.0', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7034', 'app-channel': 'ios-test-flight', 'app-os': 'ios', 'platform': 'USER', 'client-code': '9F387CCE-760C-4AED-80BB-787B82D2C94D', 'client-device-name': 'iPhone', 'lang': 'cn', 'accept-language': 'zh_CN', 'platform-account-id': '9', 'tenant-id': '1', 'device': 'app', 'host': 'app.bitradex-test.com'} 
 body=None 
 </msg>
<msg time="2026-05-28T18:04:24.261821" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30 
 status=200, reason=OK 
 headers={'Date': 'Thu, 28 May 2026 10:04:24 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '8371ac13baacf43e7bf955efde0b1038', 'X-Transparent': '00-8371ac13baacf43e7bf955efde0b1038-ddc65bf35e617ed7-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02c6f5b283d166a-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[{"i":630238893289028928,"t":1779962661584,"p":"73521.63","q":"0.002160","v":"158.8067208","b":true},{"i":630238890214604096,"t":1779962660742,"p":"73521.63","q":"0.003340","v":"245.5622442","b":true},{"i":630238888448802112,"t":1779962660416,"p":"73521.62","q":"0.003330","v":"244.8269946","b":false},{"i":630238886603308352,"t":1779962659891,"p":"73521.62","q":"0.002970","v":"218.3592114","b":false},{"i":630238882903932224,"t":1779962659105,"p":"73521.62","q":"0.003200","v":"235.269184","b":false},{"i":630238880836140352,"t":1779962658501,"p":"73521.63","q":"0.002990","v":"219.8296737","b":true},{"i":630238876717333824,"t":1779962657624,"p":"73521.62","q":"0.003310","v":"243.3565622","b":false},{"i":630238875287076160,"t":1779962657188,"p":"73521.62","q":"0.003300","v":"242.621346","b":false},{"i":630238872799853888,"t":1779962656596,"p":"73521.62","q":"0.002490","v":"183.0688338","b":false},{"i":630238870530735424,"t":1779962656151,"p":"73521.62","q":"0.002500","v":"183.80405","b":false},{"i":630238868119010624,"t":1779962655571,"p":"73521.63","q":"0.003230","v":"237.4748649","b":true},{"i":630238866231573824,"t":1779962655050,"p":"73521.63","q":"0.002400","v":"176.451912","b":true},{"i":630238862658026816,"t":1779962654176,"p":"73521.63","q":"0.002270","v":"166.8941001","b":true},{"i":630238861210991936,"t":1779962653932,"p":"73521.62","q":"0.002240","v":"164.6884288","b":false},{"i":630238859571019072,"t":1779962653444,"p":"73521.62","q":"0.002990","v":"219.8296438","b":false},{"i":630238856500788544,"t":1779962652704,"p":"73521.62","q":"0.003270","v":"240.4156974","b":false},{"i":630238854231670080,"t":1779962652165,"p":"73521.62","q":"0.002120","v":"155.8658344","b":false},{"i":630238850821700928,"t":1779962651359,"p":"73521.63","q":"0.002740","v":"201.4492662","b":true},{"i":630238847789219136,"t":1779962650619,"p":"73521.63","q":"0.001390","v":"102.1950657","b":true},{"i":630238845142613312,"t":1779962650033,"p":"73521.63","q":"0.002120","v":"155.8658556","b":true},{"i":630238843712355648,"t":1779962649668,"p":"73521.62","q":"0.001370","v":"100.7246194","b":false},{"i":630238841271270720,"t":1779962649080,"p":"73521.62","q":"0.001720","v":"126.4571864","b":false},{"i":630238837613837632,"t":1779962648297,"p":"73521.62","q":"0.001910","v":"140.4262942","b":false},{"i":630238836011613504,"t":1779962647912,"p":"73521.62","q":"0.001320","v":"97.0485384","b":false},{"i":630238832689724736,"t":1779962647127,"p":"73521.63","q":"0.001850","v":"136.0150155","b":true},{"i":630238831238495552,"t":1779962646773,"p":"73521.63","q":"0.001870","v":"137.4854481","b":true},{"i":630238827920801088,"t":1779962646018,"p":"73521.63","q":"0.001260","v":"92.6372538","b":true},{"i":630238824322088256,"t":1779962645042,"p":"73521.62","q":"0.001280","v":"94.1076736","b":false},{"i":630238821042142528,"t":1779962644344,"p":"73521.62","q":"0.001510","v":"111.0176462","b":false},{"i":630238819733519680,"t":1779962643954,"p":"73521.63","q":"0.001840","v":"135.2797992","b":true}],"ts":1779962664236} 
 </msg>
<msg time="2026-05-28T18:04:24.262000" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T18:04:24.262557" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>${endpoint}</arg>
<arg>params=${params}</arg>
<arg>headers=${headers}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T18:04:23.888789" elapsed="0.373834"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T18:04:24.265846" elapsed="0.000127"/>
</return>
<msg time="2026-05-28T18:04:24.266310" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>/v1/spot/market/public/trade/recent</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="PASS" start="2026-05-28T18:04:23.888456" elapsed="0.377894"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.268440" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="PASS" start="2026-05-28T18:04:24.267530" elapsed="0.001015"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.269372" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:24.268722" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.269744" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.269562" elapsed="0.000240"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T18:04:24.266853" elapsed="0.003025"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.271279" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 630238893289028928, 't': 1779962661584, 'p': '73521.63', 'q': '0.002160', 'v': '158.8067208', 'b': True}, {'i': 630238890214604096, 't': 177...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:24.270480" elapsed="0.000832"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${json_data}</arg>
<arg>${field_name}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T18:04:24.271451" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.271974" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.271827" elapsed="0.000198"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T18:04:24.270103" elapsed="0.001989"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.273373" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 630238893289028928, 't': 1779962661584, 'p': '73521.63', 'q': '0.002160', 'v': '158.8067208', 'b': True}, {'i': 630238890214604096, 't': 177...</msg>
<var>${json_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:24.272627" elapsed="0.000776"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.277486" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 630238893289028928,
      "t": 1779962661584,
      "p": "73521.63",
      "q": "0.002160",
      "v": "158.8067208",
 ...</msg>
<var>${json_str}</var>
<arg>json.dumps($json_data, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T18:04:24.273532" elapsed="0.003986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.277845" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 630238893289028928,
      "t": 1779962661584,
      "p": "73521.63",
      "q": "0.002160",
      "v": "158.8067208",
      "b": true
    },
    {
      "i": 630238890214604096,
      "t": 1779962660742,
      "p": "73521.63",
      "q": "0.003340",
      "v": "245.5622442",
      "b": true
    },
    {
      "i": 630238888448802112,
      "t": 1779962660416,
      "p": "73521.62",
      "q": "0.003330",
      "v": "244.8269946",
      "b": false
    },
    {
      "i": 630238886603308352,
      "t": 1779962659891,
      "p": "73521.62",
      "q": "0.002970",
      "v": "218.3592114",
      "b": false
    },
    {
      "i": 630238882903932224,
      "t": 1779962659105,
      "p": "73521.62",
      "q": "0.003200",
      "v": "235.269184",
      "b": false
    },
    {
      "i": 630238880836140352,
      "t": 1779962658501,
      "p": "73521.63",
      "q": "0.002990",
      "v": "219.8296737",
      "b": true
    },
    {
      "i": 630238876717333824,
      "t": 1779962657624,
      "p": "73521.62",
      "q": "0.003310",
      "v": "243.3565622",
      "b": false
    },
    {
      "i": 630238875287076160,
      "t": 1779962657188,
      "p": "73521.62",
      "q": "0.003300",
      "v": "242.621346",
      "b": false
    },
    {
      "i": 630238872799853888,
      "t": 1779962656596,
      "p": "73521.62",
      "q": "0.002490",
      "v": "183.0688338",
      "b": false
    },
    {
      "i": 630238870530735424,
      "t": 1779962656151,
      "p": "73521.62",
      "q": "0.002500",
      "v": "183.80405",
      "b": false
    },
    {
      "i": 630238868119010624,
      "t": 1779962655571,
      "p": "73521.63",
      "q": "0.003230",
      "v": "237.4748649",
      "b": true
    },
    {
      "i": 630238866231573824,
      "t": 1779962655050,
      "p": "73521.63",
      "q": "0.002400",
      "v": "176.451912",
      "b": true
    },
    {
      "i": 630238862658026816,
      "t": 1779962654176,
      "p": "73521.63",
      "q": "0.002270",
      "v": "166.8941001",
      "b": true
    },
    {
      "i": 630238861210991936,
      "t": 1779962653932,
      "p": "73521.62",
      "q": "0.002240",
      "v": "164.6884288",
      "b": false
    },
    {
      "i": 630238859571019072,
      "t": 1779962653444,
      "p": "73521.62",
      "q": "0.002990",
      "v": "219.8296438",
      "b": false
    },
    {
      "i": 630238856500788544,
      "t": 1779962652704,
      "p": "73521.62",
      "q": "0.003270",
      "v": "240.4156974",
      "b": false
    },
    {
      "i": 630238854231670080,
      "t": 1779962652165,
      "p": "73521.62",
      "q": "0.002120",
      "v": "155.8658344",
      "b": false
    },
    {
      "i": 630238850821700928,
      "t": 1779962651359,
      "p": "73521.63",
      "q": "0.002740",
      "v": "201.4492662",
      "b": true
    },
    {
      "i": 630238847789219136,
      "t": 1779962650619,
      "p": "73521.63",
      "q": "0.001390",
      "v": "102.1950657",
      "b": true
    },
    {
      "i": 630238845142613312,
      "t": 1779962650033,
      "p": "73521.63",
      "q": "0.002120",
      "v": "155.8658556",
      "b": true
    },
    {
      "i": 630238843712355648,
      "t": 1779962649668,
      "p": "73521.62",
      "q": "0.001370",
      "v": "100.7246194",
      "b": false
    },
    {
      "i": 630238841271270720,
      "t": 1779962649080,
      "p": "73521.62",
      "q": "0.001720",
      "v": "126.4571864",
      "b": false
    },
    {
      "i": 630238837613837632,
      "t": 1779962648297,
      "p": "73521.62",
      "q": "0.001910",
      "v": "140.4262942",
      "b": false
    },
    {
      "i": 630238836011613504,
      "t": 1779962647912,
      "p": "73521.62",
      "q": "0.001320",
      "v": "97.0485384",
      "b": false
    },
    {
      "i": 630238832689724736,
      "t": 1779962647127,
      "p": "73521.63",
      "q": "0.001850",
      "v": "136.0150155",
      "b": true
    },
    {
      "i": 630238831238495552,
      "t": 1779962646773,
      "p": "73521.63",
      "q": "0.001870",
      "v": "137.4854481",
      "b": true
    },
    {
      "i": 630238827920801088,
      "t": 1779962646018,
      "p": "73521.63",
      "q": "0.001260",
      "v": "92.6372538",
      "b": true
    },
    {
      "i": 630238824322088256,
      "t": 1779962645042,
      "p": "73521.62",
      "q": "0.001280",
      "v": "94.1076736",
      "b": false
    },
    {
      "i": 630238821042142528,
      "t": 1779962644344,
      "p": "73521.62",
      "q": "0.001510",
      "v": "111.0176462",
      "b": false
    },
    {
      "i": 630238819733519680,
      "t": 1779962643954,
      "p": "73521.63",
      "q": "0.001840",
      "v": "135.2797992",
      "b": true
    }
  ],
  "ts": 1779962664236
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.277655" elapsed="0.000353"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T18:04:24.272288" elapsed="0.005782"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T18:04:24.278790" level="INFO">${data} = [{'i': 630238893289028928, 't': 1779962661584, 'p': '73521.63', 'q': '0.002160', 'v': '158.8067208', 'b': True}, {'i': 630238890214604096, 't': 1779962660742, 'p': '73521.63', 'q': '0.003340', 'v': '2...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T18:04:24.278181" elapsed="0.000634"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.278923" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证交易记录列表结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($trade_list, list)</arg>
<arg>交易记录数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.279906" elapsed="0.000187"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.280308" level="INFO">Length is 30.</msg>
<msg time="2026-05-28T18:04:24.280373" level="INFO">${list_length} = 30</msg>
<var>${list_length}</var>
<arg>${trade_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="PASS" start="2026-05-28T18:04:24.280201" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.280605" level="INFO">交易记录列表包含 30 个交易记录</msg>
<arg>交易记录列表包含 ${list_length} 个交易记录</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.280490" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证交易记录项结构">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($trade_item, dict)</arg>
<arg>交易记录项应该是字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.281687" elapsed="0.000164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.282039" level="INFO">交易记录项内容: {'i': 630238893289028928, 't': 1779962661584, 'p': '73521.63', 'q': '0.002160', 'v': '158.8067208', 'b': True}</msg>
<arg>交易记录项内容: ${trade_item}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.281939" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.282507" level="FAIL">Dictionary does not contain key 'id'.</msg>
<arg>${trade_item}</arg>
<arg>id</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.282290" elapsed="0.000318">Dictionary does not contain key 'id'.</status>
</kw>
<msg time="2026-05-28T18:04:24.282712" level="INFO">${has_id} = False</msg>
<var>${has_id}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>id</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.282170" elapsed="0.000561"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.283069" level="FAIL">Dictionary does not contain key 'price'.</msg>
<arg>${trade_item}</arg>
<arg>price</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.282940" elapsed="0.000174">Dictionary does not contain key 'price'.</status>
</kw>
<msg time="2026-05-28T18:04:24.283185" level="INFO">${has_price} = False</msg>
<var>${has_price}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>price</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.282828" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.283534" level="FAIL">Dictionary does not contain key 'qty'.</msg>
<arg>${trade_item}</arg>
<arg>qty</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.283408" elapsed="0.000168">Dictionary does not contain key 'qty'.</status>
</kw>
<msg time="2026-05-28T18:04:24.283650" level="INFO">${has_qty} = False</msg>
<var>${has_qty}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>qty</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.283300" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.284128" level="FAIL">Dictionary does not contain key 'quoteQty'.</msg>
<arg>${trade_item}</arg>
<arg>quoteQty</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.283884" elapsed="0.000290">Dictionary does not contain key 'quoteQty'.</status>
</kw>
<msg time="2026-05-28T18:04:24.284244" level="INFO">${has_quoteQty} = False</msg>
<var>${has_quoteQty}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>quoteQty</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.283764" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.284588" level="FAIL">Dictionary does not contain key 'time'.</msg>
<arg>${trade_item}</arg>
<arg>time</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.284458" elapsed="0.000170">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-05-28T18:04:24.284694" level="INFO">${has_time} = False</msg>
<var>${has_time}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>time</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.284354" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.285055" level="FAIL">Dictionary does not contain key 'isBuyerMaker'.</msg>
<arg>${trade_item}</arg>
<arg>isBuyerMaker</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.284931" elapsed="0.000165">Dictionary does not contain key 'isBuyerMaker'.</status>
</kw>
<msg time="2026-05-28T18:04:24.285166" level="INFO">${has_isBuyerMaker} = False</msg>
<var>${has_isBuyerMaker}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>isBuyerMaker</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.284821" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.285597" level="FAIL">Dictionary does not contain key 'side'.</msg>
<arg>${trade_item}</arg>
<arg>side</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.285384" elapsed="0.000312">Dictionary does not contain key 'side'.</status>
</kw>
<msg time="2026-05-28T18:04:24.285827" level="INFO">${has_side} = False</msg>
<var>${has_side}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>side</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.285280" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T18:04:24.286397" level="FAIL">Dictionary does not contain key 'symbol'.</msg>
<arg>${trade_item}</arg>
<arg>symbol</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T18:04:24.286191" elapsed="0.000268">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-05-28T18:04:24.286559" level="INFO">${has_symbol} = False</msg>
<var>${has_symbol}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${trade_item}</arg>
<arg>symbol</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.286012" elapsed="0.000573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.286860" level="INFO">交易记录包含ID(id): False</msg>
<arg>交易记录包含ID(id): ${has_id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.286713" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.287156" level="INFO">交易记录包含价格(price): False</msg>
<arg>交易记录包含价格(price): ${has_price}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.287020" elapsed="0.000181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.287445" level="INFO">交易记录包含数量(qty): False</msg>
<arg>交易记录包含数量(qty): ${has_qty}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.287309" elapsed="0.000184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.287733" level="INFO">交易记录包含计价数量(quoteQty): False</msg>
<arg>交易记录包含计价数量(quoteQty): ${has_quoteQty}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.287603" elapsed="0.000178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.288027" level="INFO">交易记录包含时间(time): False</msg>
<arg>交易记录包含时间(time): ${has_time}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.287891" elapsed="0.000178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.288311" level="INFO">交易记录包含买方标记(isBuyerMaker): False</msg>
<arg>交易记录包含买方标记(isBuyerMaker): ${has_isBuyerMaker}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.288175" elapsed="0.000181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.288647" level="INFO">交易记录包含方向(side): False</msg>
<arg>交易记录包含方向(side): ${has_side}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.288514" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.288930" level="INFO">交易记录包含交易对(symbol): False</msg>
<arg>交易记录包含交易对(symbol): ${has_symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.288800" elapsed="0.000174"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_id}</arg>
<arg>验证交易ID</arg>
<arg>${trade_item['id']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.289103" elapsed="0.000120"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_price}</arg>
<arg>验证交易价格</arg>
<arg>${trade_item['price']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.289347" elapsed="0.000121"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_qty}</arg>
<arg>验证交易数量</arg>
<arg>${trade_item['qty']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.289600" elapsed="0.000093"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_time}</arg>
<arg>验证交易时间</arg>
<arg>${trade_item['time']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.289799" elapsed="0.000098"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_side}</arg>
<arg>验证交易方向</arg>
<arg>${trade_item['side']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.290003" elapsed="0.000098"/>
</kw>
<arg>${trade_list[0]}</arg>
<doc>验证单个交易记录的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:24.281071" elapsed="0.009099"/>
</kw>
<arg>${list_length} &gt; 0</arg>
<arg>验证交易记录项结构</arg>
<arg>${trade_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.280743" elapsed="0.009468"/>
</kw>
<arg>${data}</arg>
<doc>验证交易记录列表的数据结构</doc>
<status status="PASS" start="2026-05-28T18:04:24.279642" elapsed="0.010627"/>
</kw>
<arg>isinstance($data, list)</arg>
<arg>验证交易记录列表结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.279312" elapsed="0.010995"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>isinstance($data, dict)</arg>
<arg>验证交易记录字典结构</arg>
<arg>${data}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T18:04:24.290416" elapsed="0.000201"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.291568" level="INFO">${status_code} = 200</msg>
<var>${status_code}</var>
<arg>${response.status_code}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:24.291101" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T18:04:24.291827" elapsed="0.000449"/>
</kw>
<msg time="2026-05-28T18:04:24.292358" level="INFO">${has_data} = True</msg>
<var>${has_data}</var>
<arg>Should Contain</arg>
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T18:04:24.291697" elapsed="0.000685"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.292631" level="INFO">${data_status} = 通过</msg>
<var>${data_status}</var>
<arg>${has_data}</arg>
<arg>通过</arg>
<arg>无数据字段</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:24.292492" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.292945" level="INFO">${test_result} = PASS</msg>
<var>${test_result}</var>
<arg>${status_code} == 200 and ${has_data}</arg>
<arg>PASS</arg>
<arg>FAIL</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:24.292758" elapsed="0.000211"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.293226" level="INFO">${failure_reason} = 数据验证失败</msg>
<var>${failure_reason}</var>
<arg>${status_code} != 200</arg>
<arg>状态码异常(期望:200,实际:${status_code})</arg>
<arg>数据验证失败</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:24.293076" elapsed="0.000172"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.293605" level="INFO">${summary_content} = 🧪 测试过程: 获取最近交易记录 | 📡 请求接口: /v1/spot/market/public/trade/recent | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${summary_content}</var>
<arg>🧪 测试过程: ${test_name} | 📡 请求接口: ${api_path} | 📊 响应状态: ${status_code} | ✅ 数据验证: ${data_status} | 🎯 测试结果: ${test_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T18:04:24.293349" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.293919" level="INFO">${final_summary} = 🧪 测试过程: 获取最近交易记录 | 📡 请求接口: /v1/spot/market/public/trade/recent | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<var>${final_summary}</var>
<arg>'${test_result}' == 'FAIL'</arg>
<arg>${summary_content} | ❌ 失败原因: ${failure_reason}</arg>
<arg>${summary_content}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-05-28T18:04:24.293736" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T18:04:24.294161" level="INFO">🧪 测试过程: 获取最近交易记录 | 📡 请求接口: /v1/spot/market/public/trade/recent | 📊 响应状态: 200 | ✅ 数据验证: 通过 | 🎯 测试结果: PASS</msg>
<arg>${final_summary}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T18:04:24.294051" elapsed="0.000149"/>
</kw>
<arg>获取最近交易记录</arg>
<arg>/v1/spot/market/public/trade/recent</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T18:04:24.290798" elapsed="0.003455"/>
</kw>
<doc>验证最近交易记录接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T18:04:23.884824" elapsed="0.409559"/>
</test>
<doc>最近交易记录接口测试</doc>
<status status="PASS" start="2026-05-28T18:04:23.871773" elapsed="0.422913"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:21.208646" elapsed="3.087070"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:20.052657" elapsed="4.243753"/>
</suite>
<status status="PASS" start="2026-05-28T18:04:07.337236" elapsed="16.960093"/>
</suite>
<statistics>
<total>
<stat pass="52" fail="0" skip="1">All Tests</stat>
</total>
<tag>
<stat pass="8" fail="0" skip="0">app</stat>
<stat pass="34" fail="0" skip="0">future-u</stat>
<stat pass="0" fail="0" skip="1">invite</stat>
<stat pass="7" fail="0" skip="0">market</stat>
<stat pass="0" fail="0" skip="1">profit</stat>
<stat pass="3" fail="0" skip="0">spot</stat>
</tag>
<suite>
<stat name="BitRadeX_API测试_bitradex_test" id="s1" pass="52" fail="0" skip="1">BitRadeX_API测试_bitradex_test</stat>
<stat name="App" id="s1-s1" pass="8" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App</stat>
<stat name="Ad List" id="s1-s1-s1" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.Ad List</stat>
<stat name="App Share Info" id="s1-s1-s2" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.App Share Info</stat>
<stat name="App Version Info" id="s1-s1-s3" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.App Version Info</stat>
<stat name="Banner List" id="s1-s1-s4" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.Banner List</stat>
<stat name="Captcha Apply" id="s1-s1-s5" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.Captcha Apply</stat>
<stat name="Open Screen List" id="s1-s1-s6" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.Open Screen List</stat>
<stat name="Open Screen List Lang" id="s1-s1-s7" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.Open Screen List Lang</stat>
<stat name="Vajra District" id="s1-s1-s8" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.App.Vajra District</stat>
<stat name="Future-U" id="s1-s2" pass="34" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U</stat>
<stat name="Market" id="s1-s2-s1" pass="2" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Market</stat>
<stat name="Future U Symbol Detail" id="s1-s2-s1-s1" pass="2" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Market.Future U Symbol Detail</stat>
<stat name="Q" id="s1-s2-s2" pass="32" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q</stat>
<stat name="Future U Depth" id="s1-s2-s2-s1" pass="6" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Depth</stat>
<stat name="Future U Funding Rate" id="s1-s2-s2-s2" pass="5" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Funding Rate</stat>
<stat name="Future U Index Price" id="s1-s2-s2-s3" pass="7" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Index Price</stat>
<stat name="Future U Mark Price" id="s1-s2-s2-s4" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Mark Price</stat>
<stat name="Future U Symbol Mark Price" id="s1-s2-s2-s5" pass="5" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Symbol Mark Price</stat>
<stat name="Future U Ticker" id="s1-s2-s2-s6" pass="5" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Ticker</stat>
<stat name="Future U Tickers" id="s1-s2-s2-s7" pass="3" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Future-U.Q.Future U Tickers</stat>
<stat name="Invite" id="s1-s3" pass="0" fail="0" skip="1">BitRadeX_API测试_bitradex_test.Invite</stat>
<stat name="Profit Analysis" id="s1-s3-s1" pass="0" fail="0" skip="1">BitRadeX_API测试_bitradex_test.Invite.Profit Analysis</stat>
<stat name="Spot" id="s1-s4" pass="10" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot</stat>
<stat name="Balance" id="s1-s4-s1" pass="3" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Balance</stat>
<stat name="Balance Currencies" id="s1-s4-s1-s1" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Balance.Balance Currencies</stat>
<stat name="Balance Price Convert" id="s1-s4-s1-s2" pass="2" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Balance.Balance Price Convert</stat>
<stat name="Mark" id="s1-s4-s2" pass="7" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark</stat>
<stat name="24H Market" id="s1-s4-s2-s1" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.24H Market</stat>
<stat name="Market Depth" id="s1-s4-s2-s2" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.Market Depth</stat>
<stat name="Market Plate" id="s1-s4-s2-s3" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.Market Plate</stat>
<stat name="Market Symbol" id="s1-s4-s2-s4" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.Market Symbol</stat>
<stat name="Market Time" id="s1-s4-s2-s5" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.Market Time</stat>
<stat name="Market Top Symbol" id="s1-s4-s2-s6" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.Market Top Symbol</stat>
<stat name="Market Trade Recent" id="s1-s4-s2-s7" pass="1" fail="0" skip="0">BitRadeX_API测试_bitradex_test.Spot.Mark.Market Trade Recent</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
