<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-05-28T21:04:08.105812" 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-28T21:04:08.194895" 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-28T21:04:08.194800" elapsed="0.000111"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.195093" 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-28T21:04:08.195035" elapsed="0.000077"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:08.194954" 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-28T21:04:08.195177" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.195136" elapsed="0.000060"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:08.194943" elapsed="0.000260"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.195460" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:08.195413" 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-28T21:04:08.195561" 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-28T21:04:08.195608" 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-28T21:04:08.195652" elapsed="0.000006"/>
</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-28T21:04:08.195693" elapsed="0.000006"/>
</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-28T21:04:08.195735" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.195501" elapsed="0.000251"/>
</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-28T21:04:08.195818" 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-28T21:04:08.195862" 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-28T21:04:08.195907" elapsed="0.000007"/>
</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-28T21:04:08.195950" 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-28T21:04:08.195991" 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-28T21:04:08.196032" 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-28T21:04:08.196073" 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-28T21:04:08.196113" 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-28T21:04:08.196154" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.195760" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.196537" 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-28T21:04:08.196215" elapsed="0.000341"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.196858" 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-28T21:04:08.196601" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.197191" 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-28T21:04:08.196929" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.197525" 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-28T21:04:08.197257" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.197867" 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-28T21:04:08.197583" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.198203" 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-28T21:04:08.197925" elapsed="0.000296"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.198558" 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-28T21:04:08.198310" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.198868" 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-28T21:04:08.198616" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.199196" 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-28T21:04:08.198938" elapsed="0.000275"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:08.196180" elapsed="0.003046"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:08.195494" elapsed="0.003742"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.199335" 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-28T21:04:08.199273" elapsed="0.000079"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:08.199511" 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-28T21:04:08.199392" elapsed="0.000211"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:08.195314" elapsed="0.004319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.199708" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:08.199675" elapsed="0.000049"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:08.194489" elapsed="0.005255"/>
</kw>
<test id="s1-s1-s1-t1" name="获取广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.200765" 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-28T21:04:08.200484" 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-28T21:04:08.201034" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.200826" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:08.200819" elapsed="0.000247"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:08.201080" elapsed="0.000017"/>
</return>
<msg time="2026-05-28T21:04:08.201162" 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-28T21:04:08.200180" elapsed="0.000993"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:08.799652" 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-28T21:04:08.800172" 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 13: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': '017b845c554f292eb418178078a90971', 'X-Transparent': '00-017b845c554f292eb418178078a90971-8fb8ecd2fe0f88bc-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.030', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76a5bf5c8500-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779973448779} 
 </msg>
<msg time="2026-05-28T21:04:08.800361" 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-28T21:04:08.800810" 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-28T21:04:08.201214" elapsed="0.599661"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.803009" 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-28T21:04:08.801518" elapsed="0.001633"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.804754" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779973448779}</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-28T21:04:08.803551" elapsed="0.001262"/>
</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-28T21:04:08.805065" elapsed="0.000365"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.806707" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973448779
}</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-28T21:04:08.805699" elapsed="0.001069"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.807395" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973448779
}</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-28T21:04:08.807029" elapsed="0.000522"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:08.808744" 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-28T21:04:08.807797" elapsed="0.000987"/>
</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-28T21:04:08.808967" elapsed="0.000391"/>
</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-28T21:04:08.810886" elapsed="0.000312"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.811564" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T21:04:08.811678" 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-28T21:04:08.811383" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.812081" level="INFO">广告列表包含 0 个广告项</msg>
<arg>广告列表包含 ${length} 个广告项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:08.811879" elapsed="0.000266"/>
</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-28T21:04:08.812310" elapsed="0.000201"/>
</kw>
<arg>${data}</arg>
<doc>验证广告列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:08.810357" elapsed="0.002267"/>
</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-28T21:04:08.809578" elapsed="0.003112"/>
</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-28T21:04:08.812828" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.813797" 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-28T21:04:08.813150" elapsed="0.000701"/>
</kw>
<doc>验证广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:08.199772" elapsed="0.614304"/>
</test>
<doc>广告列表接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:08.114950" elapsed="0.699887"/>
</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-28T21:04:08.821400" 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-28T21:04:08.821204" elapsed="0.000228"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.824327" 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-28T21:04:08.821795" elapsed="0.002626"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:08.821556" elapsed="0.002922"/>
</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-28T21:04:08.824709" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.824525" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:08.821515" elapsed="0.003281"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.825853" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:08.825678" elapsed="0.000231"/>
</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-28T21:04:08.826303" elapsed="0.000043"/>
</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-28T21:04:08.826495" 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-28T21:04:08.826632" 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-28T21:04:08.826760" 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-28T21:04:08.826884" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.826003" elapsed="0.000995"/>
</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-28T21:04:08.827238" 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-28T21:04:08.827366" 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-28T21:04:08.827494" 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-28T21:04:08.827615" 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-28T21:04:08.827737" 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-28T21:04:08.827857" 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-28T21:04:08.827975" 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-28T21:04:08.828094" 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-28T21:04:08.828212" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.827029" elapsed="0.001235"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.828671" 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-28T21:04:08.828390" elapsed="0.000332"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.829064" 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-28T21:04:08.828841" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.829434" 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-28T21:04:08.829227" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.829752" 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-28T21:04:08.829570" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.830074" 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-28T21:04:08.829888" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.830394" 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-28T21:04:08.830208" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.830722" 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-28T21:04:08.830531" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.831051" 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-28T21:04:08.830857" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.831382" 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-28T21:04:08.831185" elapsed="0.000234"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:08.828288" elapsed="0.003163"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:08.825973" elapsed="0.005497"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.831720" 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-28T21:04:08.831562" elapsed="0.000201"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:08.832153" 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-28T21:04:08.831864" elapsed="0.000459"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:08.825229" elapsed="0.007165"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.832574" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:08.832493" elapsed="0.000120"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:08.820958" elapsed="0.011703"/>
</kw>
<test id="s1-s1-s2-t1" name="获取应用分享信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:08.834629" 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-28T21:04:08.834315" elapsed="0.000328"/>
</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-28T21:04:08.834962" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:08.834740" elapsed="0.000245"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:08.834725" elapsed="0.000269"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:08.835011" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T21:04:08.835117" 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-28T21:04:08.833867" elapsed="0.001260"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:09.266473" 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-28T21:04:09.266696" 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 13: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/app/share/info, /public/app/share/info', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '63b02bfca37fed3e3486732d131a60c8', 'X-Transparent': '00-63b02bfca37fed3e3486732d131a60c8-5d32ff4a09db36f4-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': 'a02d76a89a2dae9e-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":1779973449253} 
 </msg>
<msg time="2026-05-28T21:04:09.266798" 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-28T21:04:09.267015" 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-28T21:04:08.835481" elapsed="0.431577"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:09.267190" elapsed="0.000106"/>
</return>
<msg time="2026-05-28T21:04:09.267537" 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-28T21:04:08.835204" elapsed="0.432357"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.269345" 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-28T21:04:09.268591" elapsed="0.000856"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.270344" 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-28T21:04:09.269593" elapsed="0.000777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.270596" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.270476" elapsed="0.000156"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:09.267959" elapsed="0.002735"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.271611" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779973449253}</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-28T21:04:09.271137" elapsed="0.000501"/>
</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-28T21:04:09.271752" elapsed="0.000177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.272168" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.272042" elapsed="0.000166"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:09.270869" elapsed="0.001393"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.273303" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779973449253}</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-28T21:04:09.272698" elapsed="0.000633"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.273861" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973449253
}</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-28T21:04:09.273453" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.274536" level="INFO">{
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973449253
}</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-28T21:04:09.274196" elapsed="0.000497"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:09.272428" elapsed="0.002394"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:09.276167" 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-28T21:04:09.275063" elapsed="0.001159"/>
</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-28T21:04:09.276471" elapsed="0.000501"/>
</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-28T21:04:09.278202" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.279272" 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-28T21:04:09.278711" elapsed="0.000631"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:09.279774" 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-28T21:04:09.279519" elapsed="0.000290"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.280160" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T21:04:09.280237" 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-28T21:04:09.279990" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.280492" level="INFO">分享信息数据包含 2 个字段</msg>
<arg>分享信息数据包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.280371" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:09.281007" 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-28T21:04:09.280757" elapsed="0.000349">Dictionary does not contain key 'title'.</status>
</kw>
<msg time="2026-05-28T21:04:09.281201" 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-28T21:04:09.280630" elapsed="0.000592"/>
</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-28T21:04:09.281356" elapsed="0.000104"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:09.281805" 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-28T21:04:09.281671" elapsed="0.000178">Dictionary does not contain key 'content'.</status>
</kw>
<msg time="2026-05-28T21:04:09.281920" 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-28T21:04:09.281563" elapsed="0.000377"/>
</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-28T21:04:09.282079" elapsed="0.000129"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:09.282988" 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-28T21:04:09.282798" elapsed="0.000261">Dictionary does not contain key 'url'.</status>
</kw>
<msg time="2026-05-28T21:04:09.283169" 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-28T21:04:09.282355" elapsed="0.000853"/>
</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-28T21:04:09.283354" elapsed="0.000153"/>
</kw>
<arg>${data}</arg>
<doc>验证应用分享信息的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:09.277852" elapsed="0.005756"/>
</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-28T21:04:09.277231" elapsed="0.006432"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.285143" 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-28T21:04:09.284361" elapsed="0.000816"/>
</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-28T21:04:09.285520" elapsed="0.000595"/>
</kw>
<msg time="2026-05-28T21:04:09.286218" 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-28T21:04:09.285349" elapsed="0.000895"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.286766" 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-28T21:04:09.286562" elapsed="0.000235"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.287215" 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-28T21:04:09.286941" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.287919" 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-28T21:04:09.287482" elapsed="0.000484"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.288578" 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-28T21:04:09.288188" elapsed="0.000428"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.289071" 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-28T21:04:09.288785" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.289551" 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-28T21:04:09.289309" elapsed="0.000312"/>
</kw>
<arg>获取应用分享信息</arg>
<arg>/v1/app/public/app/share/info</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:09.283948" elapsed="0.005769"/>
</kw>
<doc>验证应用分享信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:08.832735" elapsed="0.457209"/>
</test>
<doc>应用分享信息接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:08.816178" elapsed="0.474303"/>
</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-28T21:04:09.297427" 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-28T21:04:09.297165" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.298475" 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-28T21:04:09.298284" elapsed="0.000259"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:09.297591" elapsed="0.000996"/>
</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-28T21:04:09.298739" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.298620" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:09.297562" elapsed="0.001258"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.299715" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.299595" elapsed="0.000165"/>
</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-28T21:04:09.299991" 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-28T21:04:09.300107" 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-28T21:04:09.300220" 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-28T21:04:09.300329" 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-28T21:04:09.300433" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.299825" elapsed="0.000653"/>
</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-28T21:04:09.300644" 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-28T21:04:09.300752" 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-28T21:04:09.300858" 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-28T21:04:09.300962" 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-28T21:04:09.301067" 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-28T21:04:09.301182" elapsed="0.001512"/>
</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-28T21:04:09.302840" elapsed="0.000024"/>
</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-28T21:04:09.302967" 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-28T21:04:09.303080" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.300498" elapsed="0.002628"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.303488" 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-28T21:04:09.303247" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.303860" 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-28T21:04:09.303640" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.304253" 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-28T21:04:09.304030" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.304643" 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-28T21:04:09.304418" elapsed="0.000272"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.305035" 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-28T21:04:09.304809" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.305428" 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-28T21:04:09.305201" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.305832" 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-28T21:04:09.305591" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.306225" 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-28T21:04:09.305994" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.306625" 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-28T21:04:09.306388" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:09.303150" elapsed="0.003557"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:09.299806" elapsed="0.006925"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.307034" 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-28T21:04:09.306841" elapsed="0.000244"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:09.307534" 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-28T21:04:09.307208" elapsed="0.000500"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:09.299329" elapsed="0.008447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.307962" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.307878" elapsed="0.000125"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:09.296822" elapsed="0.011230"/>
</kw>
<test id="s1-s1-s3-t1" name="获取应用版本信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.310704" 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-28T21:04:09.310038" elapsed="0.000696"/>
</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-28T21:04:09.311361" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.310854" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:09.310836" elapsed="0.000602"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:09.311470" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T21:04:09.311673" 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-28T21:04:09.309270" elapsed="0.002456"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:09.656680" 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-28T21:04:09.656976" 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 13: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': 'd57b3d92e8ca6cf8020db577137c1d09', 'X-Transparent': '00-d57b3d92e8ca6cf8020db577137c1d09-db2987a20f9c73d7-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76ab9d5ee6ae-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":1779973449643} 
 </msg>
<msg time="2026-05-28T21:04:09.657177" 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-28T21:04:09.657626" 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-28T21:04:09.312451" elapsed="0.345242"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:09.657923" elapsed="0.000126"/>
</return>
<msg time="2026-05-28T21:04:09.658404" 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-28T21:04:09.311851" elapsed="0.346604"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.660861" 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-28T21:04:09.659815" elapsed="0.001159"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.662201" 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-28T21:04:09.661191" elapsed="0.001063"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.663104" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.662462" elapsed="0.000717"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:09.658967" elapsed="0.004307"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.665182" 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-28T21:04:09.664206" elapsed="0.001039"/>
</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-28T21:04:09.665493" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.666360" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.666110" elapsed="0.000342"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:09.663567" elapsed="0.002986"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.668017" 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-28T21:04:09.667232" elapsed="0.000829"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.668928" 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-28T21:04:09.668236" elapsed="0.000737"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.669417" 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": 1779973449643
}</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-28T21:04:09.669152" elapsed="0.000425"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:09.666790" elapsed="0.002954"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.671306" 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-28T21:04:09.670512" elapsed="0.000836"/>
</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-28T21:04:09.671735" elapsed="0.000593"/>
</kw>
<msg time="2026-05-28T21:04:09.672433" 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-28T21:04:09.671541" elapsed="0.000920"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.672804" 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-28T21:04:09.672613" elapsed="0.000223"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.673237" 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-28T21:04:09.672985" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.673612" 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-28T21:04:09.673411" elapsed="0.000231"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.674106" 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-28T21:04:09.673780" elapsed="0.000363"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.674511" 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-28T21:04:09.674276" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.674833" 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-28T21:04:09.674687" elapsed="0.000205"/>
</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-28T21:04:09.670024" elapsed="0.004936"/>
</kw>
<doc>验证应用版本信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:09.308117" elapsed="0.367076"/>
</test>
<doc>应用版本信息接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:09.291582" elapsed="0.384212"/>
</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-28T21:04:09.682030" 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-28T21:04:09.681845" elapsed="0.000211"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.682473" 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-28T21:04:09.682351" elapsed="0.000167"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:09.682159" elapsed="0.000389"/>
</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-28T21:04:09.682666" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.682577" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:09.682129" elapsed="0.000606"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.683374" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.683262" elapsed="0.000151"/>
</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-28T21:04:09.683621" 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-28T21:04:09.683737" 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-28T21:04:09.683841" 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-28T21:04:09.683950" 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-28T21:04:09.684056" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.683468" 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-28T21:04:09.684273" elapsed="0.000115"/>
</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-28T21:04:09.684605" elapsed="0.000032"/>
</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-28T21:04:09.684759" elapsed="0.000022"/>
</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-28T21:04:09.684892" elapsed="0.000020"/>
</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-28T21:04:09.685020" elapsed="0.000020"/>
</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-28T21:04:09.685146" 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-28T21:04:09.685266" 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-28T21:04:09.685390" 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-28T21:04:09.685510" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.684123" elapsed="0.001442"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.686015" 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-28T21:04:09.685709" elapsed="0.000362"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.686433" 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-28T21:04:09.686199" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.686821" 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-28T21:04:09.686602" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.687201" 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-28T21:04:09.686980" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.687585" 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-28T21:04:09.687362" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.687968" 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-28T21:04:09.687747" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.688355" 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-28T21:04:09.688128" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.688743" 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-28T21:04:09.688521" elapsed="0.000258"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.689070" 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-28T21:04:09.688877" elapsed="0.000228"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:09.685598" elapsed="0.003539"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:09.683454" elapsed="0.005703"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.689402" 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-28T21:04:09.689246" elapsed="0.000200"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:09.689832" 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-28T21:04:09.689551" elapsed="0.000449"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:09.683038" elapsed="0.007030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.690254" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:09.690171" elapsed="0.000123"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:09.681624" elapsed="0.008719"/>
</kw>
<test id="s1-s1-s4-t1" name="获取Banner列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.691336" 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-28T21:04:09.691147" elapsed="0.000215"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:09.692938" 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-28T21:04:09.692299" elapsed="0.000668"/>
</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-28T21:04:09.693627" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:09.693118" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:09.693099" elapsed="0.000607"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:09.693737" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T21:04:09.693931" 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-28T21:04:09.691559" elapsed="0.002396"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:10.045106" 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-28T21:04:10.045521" 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 13: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/banner/listByApp', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '267438ab6742fa6aa8896d6239325b9a', 'X-Transparent': '00-267438ab6742fa6aa8896d6239325b9a-7829a47e5cf25b7a-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': 'a02d76ae4d50509c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779973450023} 
 </msg>
<msg time="2026-05-28T21:04:10.045693" 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-28T21:04:10.046148" 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-28T21:04:09.694057" elapsed="0.352158"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.048228" 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-28T21:04:10.046809" elapsed="0.001570"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.049832" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779973450023}</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-28T21:04:10.048676" elapsed="0.001216"/>
</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-28T21:04:10.050140" elapsed="0.000338"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.051664" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973450023
}</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-28T21:04:10.050740" elapsed="0.000986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.052212" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973450023
}</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-28T21:04:10.051932" elapsed="0.000429"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:10.053443" 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-28T21:04:10.052543" elapsed="0.000941"/>
</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-28T21:04:10.053665" elapsed="0.000410"/>
</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-28T21:04:10.055457" elapsed="0.000323"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.056145" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T21:04:10.056249" 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-28T21:04:10.055964" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.056561" 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-28T21:04:10.056404" elapsed="0.000210"/>
</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-28T21:04:10.056805" elapsed="0.000161"/>
</kw>
<arg>${data}</arg>
<doc>验证Banner列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:10.054894" elapsed="0.002159"/>
</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-28T21:04:10.054288" elapsed="0.002827"/>
</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-28T21:04:10.057262" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.058286" 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-28T21:04:10.057622" elapsed="0.000729"/>
</kw>
<doc>验证Banner列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:09.690405" elapsed="0.368145"/>
</test>
<doc>Banner列表接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:09.677067" elapsed="0.382013"/>
</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-28T21:04:10.065455" 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-28T21:04:10.065264" elapsed="0.000218"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.065921" 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-28T21:04:10.065804" elapsed="0.000161"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:10.065597" elapsed="0.000398"/>
</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-28T21:04:10.066122" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.066033" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:10.065562" elapsed="0.000626"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.066837" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:10.066725" elapsed="0.000155"/>
</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-28T21:04:10.067082" 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-28T21:04:10.067196" 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-28T21:04:10.067300" 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-28T21:04:10.067403" 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-28T21:04:10.067505" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.066938" elapsed="0.000622"/>
</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-28T21:04:10.067711" 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-28T21:04:10.067825" 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-28T21:04:10.067938" elapsed="0.000014"/>
</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-28T21:04:10.068040" 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-28T21:04:10.068161" 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-28T21:04:10.068275" 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-28T21:04:10.068379" 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-28T21:04:10.068479" 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-28T21:04:10.068583" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.067581" elapsed="0.001047"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.068953" 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-28T21:04:10.068729" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.069252" 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-28T21:04:10.069083" elapsed="0.000200"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.069579" 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-28T21:04:10.069408" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.069859" 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-28T21:04:10.069692" elapsed="0.000198"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.070138" 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-28T21:04:10.069973" elapsed="0.000195"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.070419" 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-28T21:04:10.070256" elapsed="0.000193"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.070721" 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-28T21:04:10.070531" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.071008" 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-28T21:04:10.070835" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.071294" 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-28T21:04:10.071123" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:10.068649" elapsed="0.002710"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:10.066923" elapsed="0.004456"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.071577" 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-28T21:04:10.071459" elapsed="0.000154"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:10.071985" 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-28T21:04:10.071697" elapsed="0.000522"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:10.066492" elapsed="0.005785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.072447" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:10.072372" elapsed="0.000111"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:10.064852" elapsed="0.007678"/>
</kw>
<test id="s1-s1-s5-t1" name="申请验证码" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.074111" 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-28T21:04:10.073768" elapsed="0.000386"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.076167" 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-28T21:04:10.075402" elapsed="0.000801"/>
</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-28T21:04:10.076981" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.076354" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:10.076330" elapsed="0.000750"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:10.077118" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T21:04:10.077363" 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-28T21:04:10.074442" elapsed="0.002952"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:10.838078" 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-28T21:04:10.838471" 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 13: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, GET', 'api-path': '/public/captcha/apply, /public/captcha/apply', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '58d6d6e04b86dab37ffe4ca6064db2f0', 'X-Transparent': '00-58d6d6e04b86dab37ffe4ca6064db2f0-2cd408cc6e4f8673-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76b0988d0467-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"code":"","sdkKey":"a78c3a7d6d0e43c75bac3e0ca5effbed","enabled":true},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779973450469} 
 </msg>
<msg time="2026-05-28T21:04:10.838753" 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-28T21:04:10.839117" 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-28T21:04:10.077964" elapsed="0.761221"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:10.839404" elapsed="0.000143"/>
</return>
<msg time="2026-05-28T21:04:10.839940" 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-28T21:04:10.077553" elapsed="0.762445"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.842677" 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-28T21:04:10.841451" elapsed="0.001361"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.844263" 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-28T21:04:10.843127" elapsed="0.001194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.844915" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:10.844587" elapsed="0.000431"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:10.840584" elapsed="0.004571"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.847150" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'a78c3a7d6d0e43c75bac3e0ca5effbed', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779973450469}</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-28T21:04:10.846197" elapsed="0.001005"/>
</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-28T21:04:10.847434" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.848361" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:10.848105" elapsed="0.000337"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:10.845527" elapsed="0.003018"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.850217" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'a78c3a7d6d0e43c75bac3e0ca5effbed', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779973450469}</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-28T21:04:10.849313" elapsed="0.000955"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.851092" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "a78c3a7d6d0e43c75bac3e0ca5effbed",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 177997...</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-28T21:04:10.850460" elapsed="0.000674"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.851551" level="INFO">{
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "a78c3a7d6d0e43c75bac3e0ca5effbed",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973450469
}</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-28T21:04:10.851304" elapsed="0.000389"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:10.848821" elapsed="0.002955"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.853164" 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-28T21:04:10.852477" elapsed="0.000730"/>
</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-28T21:04:10.853617" elapsed="0.000690"/>
</kw>
<msg time="2026-05-28T21:04:10.854458" 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-28T21:04:10.853407" elapsed="0.001083"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.854879" 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-28T21:04:10.854674" elapsed="0.000239"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.855320" 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-28T21:04:10.855066" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.855808" 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-28T21:04:10.855574" elapsed="0.000264"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.856295" 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-28T21:04:10.855974" elapsed="0.000357"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.856720" 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-28T21:04:10.856477" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.857026" 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-28T21:04:10.856889" elapsed="0.000184"/>
</kw>
<arg>请求验证码</arg>
<arg>/v1/app/public/captcha/apply</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:10.852024" elapsed="0.005113"/>
</kw>
<doc>验证验证码请求接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:10.072603" elapsed="0.784722"/>
</test>
<doc>验证码申请接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:10.060277" elapsed="0.797498"/>
</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-28T21:04:10.864071" 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-28T21:04:10.863928" elapsed="0.000166"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.864395" 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-28T21:04:10.864299" elapsed="0.000128"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:10.864155" elapsed="0.000295"/>
</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-28T21:04:10.864529" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.864466" elapsed="0.000096"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:10.864139" elapsed="0.000435"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.865285" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:10.865135" 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-28T21:04:10.865631" 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-28T21:04:10.865778" 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-28T21:04:10.865912" 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-28T21:04:10.866043" elapsed="0.000021"/>
</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-28T21:04:10.866173" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.865424" elapsed="0.000803"/>
</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-28T21:04:10.866441" elapsed="0.000013"/>
</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-28T21:04:10.866517" 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-28T21:04:10.866587" elapsed="0.000011"/>
</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-28T21:04:10.866654" elapsed="0.000011"/>
</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-28T21:04:10.866721" elapsed="0.000010"/>
</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-28T21:04:10.866786" 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-28T21:04:10.866853" elapsed="0.000010"/>
</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-28T21:04:10.866918" elapsed="0.000009"/>
</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-28T21:04:10.867016" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.866253" elapsed="0.000798"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.867267" 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-28T21:04:10.867125" elapsed="0.000170"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.867485" 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-28T21:04:10.867363" elapsed="0.000149"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.867751" 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-28T21:04:10.867577" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.868078" 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-28T21:04:10.867892" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.868412" 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-28T21:04:10.868222" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.868747" 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-28T21:04:10.868554" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.869089" 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-28T21:04:10.868887" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.869430" 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-28T21:04:10.869230" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.869771" 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-28T21:04:10.869571" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:10.867065" elapsed="0.002778"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:10.865395" elapsed="0.004468"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.870114" 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-28T21:04:10.869959" elapsed="0.000199"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:10.870534" 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-28T21:04:10.870258" elapsed="0.000437"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:10.864833" elapsed="0.005928"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.870949" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:10.870863" elapsed="0.000128"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:10.863716" elapsed="0.007325"/>
</kw>
<test id="s1-s1-s6-t1" name="获取开屏广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:10.875176" 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-28T21:04:10.874398" elapsed="0.000812"/>
</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-28T21:04:10.875859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:10.875337" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:10.875317" elapsed="0.000625"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:10.875975" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T21:04:10.876173" 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-28T21:04:10.873891" elapsed="0.002308"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:11.148408" 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-28T21:04:11.149034" 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 13: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/open-screen/list', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'e5c5985ee58a32b64b3cc8ad17fea093', 'X-Transparent': '00-e5c5985ee58a32b64b3cc8ad17fea093-42fcf7c3047ac722-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.005', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76b54f2c02b2-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","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"mn"},"ru_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"ru"},"pt_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"pt"},"tw_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"tw"},"kk_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"kk"},"ms_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"ms"},"ko_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"ko"},"az_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"az"},"pt_br_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"pt_br"},"es_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"es"},"cn_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"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,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"cn"},"vi_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"vi"},"th_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"th"},"en_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"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,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"en"},"ja_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"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,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"ja"},"id_0":{"visibilityScope":"ALL","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","timeLimitType":1,"domesticLink":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal","templateCode":"app_open_screen","type":0,"priority":122,"title":"","url":"","content":"","isNeedLogin":2,"deliveryId":32,"timeLimitStart":"17:00:00","timeLimitEnabled":1,"id":94,"timeLimitEnd":"23:00:00","lang":"id"}},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779973451131} 
 </msg>
<msg time="2026-05-28T21:04:11.149402" 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-28T21:04:11.149752" 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-28T21:04:10.877012" elapsed="0.272808"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:11.150015" elapsed="0.000105"/>
</return>
<msg time="2026-05-28T21:04:11.150478" 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-28T21:04:10.876342" elapsed="0.274219"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.153101" 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-28T21:04:11.151822" elapsed="0.001453"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.154639" 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-28T21:04:11.153628" elapsed="0.001067"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.155166" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.154929" elapsed="0.000309"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:11.151040" elapsed="0.004298"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.157289" level="INFO">${json_data} = {'code': 0, 'data': {'mn_0': {'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal', 'timeLimitType': 1, 'domesticLink': 'https://www.bitr...</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-28T21:04:11.156098" elapsed="0.001239"/>
</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-28T21:04:11.157523" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.158196" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.157994" elapsed="0.000271"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:11.155602" elapsed="0.002754"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.159887" level="INFO">${json_data} = {'code': 0, 'data': {'mn_0': {'visibilityScope': 'ALL', 'link': 'https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal', 'timeLimitType': 1, 'domesticLink': 'https://www.bitr...</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-28T21:04:11.158948" elapsed="0.000986"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.161331" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "mn_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
    ...</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-28T21:04:11.160158" elapsed="0.001220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.161838" level="INFO">{
  "code": 0,
  "data": {
    "mn_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "mn"
    },
    "ru_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "ru"
    },
    "pt_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "pt"
    },
    "tw_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "tw"
    },
    "kk_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "kk"
    },
    "ms_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "ms"
    },
    "ko_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "ko"
    },
    "az_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "az"
    },
    "pt_br_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "pt_br"
    },
    "es_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "es"
    },
    "cn_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "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,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "cn"
    },
    "vi_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "vi"
    },
    "th_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "th"
    },
    "en_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "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,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "en"
    },
    "ja_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "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,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "ja"
    },
    "id_0": {
      "visibilityScope": "ALL",
      "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "timeLimitType": 1,
      "domesticLink": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament//internal",
      "templateCode": "app_open_screen",
      "type": 0,
      "priority": 122,
      "title": "",
      "url": "",
      "content": "",
      "isNeedLogin": 2,
      "deliveryId": 32,
      "timeLimitStart": "17:00:00",
      "timeLimitEnabled": 1,
      "id": 94,
      "timeLimitEnd": "23:00:00",
      "lang": "id"
    }
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779973451131
}</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-28T21:04:11.161562" elapsed="0.000631"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:11.158581" elapsed="0.003697"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.163449" 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-28T21:04:11.162912" elapsed="0.000568"/>
</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-28T21:04:11.164105" elapsed="0.000535"/>
</kw>
<msg time="2026-05-28T21:04:11.164731" 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-28T21:04:11.163628" elapsed="0.001131"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.165056" 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-28T21:04:11.164894" elapsed="0.000189"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.165442" 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-28T21:04:11.165210" elapsed="0.000259"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.165789" 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-28T21:04:11.165605" elapsed="0.000212"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.166242" 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-28T21:04:11.165943" elapsed="0.000334"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.166619" 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-28T21:04:11.166403" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.166900" 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-28T21:04:11.166769" 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-28T21:04:11.162525" elapsed="0.004487"/>
</kw>
<doc>验证开屏广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:10.871102" elapsed="0.296115"/>
</test>
<doc>开屏广告列表接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:10.859014" elapsed="0.308651"/>
</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-28T21:04:11.174122" 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-28T21:04:11.173889" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.174642" 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-28T21:04:11.174490" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:11.174259" elapsed="0.000477"/>
</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-28T21:04:11.174875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.174763" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.174233" elapsed="0.000718"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.175679" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.175539" elapsed="0.000190"/>
</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-28T21:04:11.175957" 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-28T21:04:11.176072" 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-28T21:04:11.176186" 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-28T21:04:11.176292" 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-28T21:04:11.176393" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.175801" elapsed="0.000634"/>
</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-28T21:04:11.177918" 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-28T21:04:11.178071" 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-28T21:04:11.178177" 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-28T21:04:11.178280" 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-28T21:04:11.178382" 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-28T21:04:11.178486" 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-28T21:04:11.178584" 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-28T21:04:11.178683" 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-28T21:04:11.178783" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.177758" elapsed="0.001067"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.179132" 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-28T21:04:11.178930" elapsed="0.000242"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.179465" 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-28T21:04:11.179271" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.179787" 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-28T21:04:11.179605" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.180100" 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-28T21:04:11.179922" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.180417" 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-28T21:04:11.180234" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.180734" 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-28T21:04:11.180549" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.181061" 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-28T21:04:11.180868" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.181398" 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-28T21:04:11.181194" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.181726" 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-28T21:04:11.181532" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:11.178845" elapsed="0.002948"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.175782" elapsed="0.006030"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.182045" 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-28T21:04:11.181901" elapsed="0.000185"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:11.182456" 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-28T21:04:11.182183" elapsed="0.000425"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:11.175254" elapsed="0.007418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.182851" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.182770" elapsed="0.000119"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:11.173604" elapsed="0.009331"/>
</kw>
<test id="s1-s1-s7-t1" name="获取开屏广告语言列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.185447" 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-28T21:04:11.184898" elapsed="0.000574"/>
</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-28T21:04:11.186019" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.185593" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.185578" elapsed="0.000507"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:11.186113" elapsed="0.000030"/>
</return>
<msg time="2026-05-28T21:04:11.186281" 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-28T21:04:11.184202" elapsed="0.002101"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:11.554492" 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-28T21:04:11.554897" 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 13: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/open-screen/list/lang', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '21b740bbb8e0820b0f999a2128b9e4fb', 'X-Transparent': '00-21b740bbb8e0820b0f999a2128b9e4fb-e606b1bde63efd92-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76b77bef094a-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":1779973451541} 
 </msg>
<msg time="2026-05-28T21:04:11.555151" 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-28T21:04:11.555555" 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-28T21:04:11.186977" elapsed="0.368648"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:11.555871" elapsed="0.000127"/>
</return>
<msg time="2026-05-28T21:04:11.556386" 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-28T21:04:11.186419" elapsed="0.370022"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.559197" 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-28T21:04:11.557902" elapsed="0.001466"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.560722" 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-28T21:04:11.559667" elapsed="0.001113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.561312" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.561026" elapsed="0.000385"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:11.557031" elapsed="0.004505"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.563615" 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-28T21:04:11.562552" elapsed="0.001100"/>
</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-28T21:04:11.563859" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.564380" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.564229" elapsed="0.000204"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:11.561917" elapsed="0.002582"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.565717" 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-28T21:04:11.565042" elapsed="0.000709"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.566996" 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-28T21:04:11.565902" elapsed="0.001129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.567400" 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": 1779973451541
}</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-28T21:04:11.567182" elapsed="0.000336"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:11.564706" elapsed="0.002874"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:11.568312" 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-28T21:04:11.567702" elapsed="0.000645"/>
</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-28T21:04:11.568480" elapsed="0.000289"/>
</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-28T21:04:11.569562" elapsed="0.000215"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.570033" level="INFO">Length is 3.</msg>
<msg time="2026-05-28T21:04:11.570110" 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-28T21:04:11.569896" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.570374" level="INFO">语言列表包含 3 个语言项</msg>
<arg>语言列表包含 ${length} 个语言项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.570246" elapsed="0.000173"/>
</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-28T21:04:11.571551" elapsed="0.000206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.571982" 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-28T21:04:11.571857" elapsed="0.000171"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:11.572505" 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-28T21:04:11.572265" elapsed="0.000374">Dictionary does not contain key 'code'.</status>
</kw>
<msg time="2026-05-28T21:04:11.572724" 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-28T21:04:11.572135" elapsed="0.000610"/>
</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-28T21:04:11.572854" elapsed="0.000100"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:11.573345" 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-28T21:04:11.573184" elapsed="0.000215">Dictionary does not contain key 'name'.</status>
</kw>
<msg time="2026-05-28T21:04:11.573483" 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-28T21:04:11.573056" elapsed="0.000450"/>
</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-28T21:04:11.573617" elapsed="0.000104"/>
</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-28T21:04:11.573946" elapsed="0.000128"/>
</kw>
<msg time="2026-05-28T21:04:11.574152" 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-28T21:04:11.573827" elapsed="0.000346"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.574921" 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-28T21:04:11.574439" elapsed="0.000526"/>
</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-28T21:04:11.574286" elapsed="0.000720"/>
</kw>
<arg>${lang_list[0]}</arg>
<doc>验证单个语言项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:11.570822" elapsed="0.004242"/>
</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-28T21:04:11.570531" elapsed="0.004575"/>
</kw>
<arg>${data}</arg>
<doc>验证语言列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:11.569278" elapsed="0.005878"/>
</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-28T21:04:11.568919" elapsed="0.006279"/>
</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-28T21:04:11.575307" elapsed="0.000154"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.576332" 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-28T21:04:11.575917" elapsed="0.000436"/>
</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-28T21:04:11.576570" elapsed="0.000412"/>
</kw>
<msg time="2026-05-28T21:04:11.577054" 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-28T21:04:11.576444" elapsed="0.000628"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.577310" 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-28T21:04:11.577176" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.577584" 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-28T21:04:11.577426" elapsed="0.000177"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.577998" 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-28T21:04:11.577697" elapsed="0.000326"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.578349" 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-28T21:04:11.578119" elapsed="0.000252"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.578621" 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-28T21:04:11.578465" elapsed="0.000179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.578823" 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-28T21:04:11.578731" elapsed="0.000165"/>
</kw>
<arg>获取开屏广告语言列表</arg>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:11.575640" elapsed="0.003304"/>
</kw>
<doc>验证开屏广告语言列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:11.182992" elapsed="0.396120"/>
</test>
<doc>开屏广告语言列表接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:11.168758" elapsed="0.410751"/>
</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-28T21:04:11.584833" 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-28T21:04:11.584643" elapsed="0.000218"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.585252" 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-28T21:04:11.585130" elapsed="0.000172"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:11.584940" elapsed="0.000393"/>
</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-28T21:04:11.585449" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.585358" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.584920" elapsed="0.000593"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.586113" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.585994" elapsed="0.000165"/>
</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-28T21:04:11.586372" 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-28T21:04:11.586490" 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-28T21:04:11.586598" elapsed="0.000017"/>
</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-28T21:04:11.586708" 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-28T21:04:11.586816" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.586221" elapsed="0.000638"/>
</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-28T21:04:11.587018" 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-28T21:04:11.587123" 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-28T21:04:11.587226" 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-28T21:04:11.587329" 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-28T21:04:11.587429" 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-28T21:04:11.587526" 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-28T21:04:11.587625" 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-28T21:04:11.587724" 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-28T21:04:11.587823" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.586879" elapsed="0.000992"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.588297" 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-28T21:04:11.587976" elapsed="0.000360"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.588620" 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-28T21:04:11.588436" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.588944" 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-28T21:04:11.588760" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.589267" 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-28T21:04:11.589079" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.589588" 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-28T21:04:11.589407" elapsed="0.000253"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.589953" 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-28T21:04:11.589761" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.590290" 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-28T21:04:11.590092" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.590626" 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-28T21:04:11.590428" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.590960" 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-28T21:04:11.590764" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:11.587890" elapsed="0.003139"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.586205" elapsed="0.004843"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.591275" 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-28T21:04:11.591135" elapsed="0.000180"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:11.591684" 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-28T21:04:11.591414" elapsed="0.000414"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:11.585763" elapsed="0.006126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.592067" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.591989" elapsed="0.000125"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:11.584409" elapsed="0.007751"/>
</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-28T21:04:11.594238" 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-28T21:04:11.593692" elapsed="0.000571"/>
</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-28T21:04:11.594778" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.594359" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.594345" elapsed="0.000499"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:11.594871" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T21:04:11.595073" 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-28T21:04:11.593025" elapsed="0.002070"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.595329" 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-28T21:04:11.595185" elapsed="0.000165"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:11.899835" 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-28T21:04:11.900163" 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 13: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': '5ed2e69f43800214af39005622009156', 'X-Transparent': '00-5ed2e69f43800214af39005622009156-ddfc33f1d246f88b-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.013', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76b9dfd504a1-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":1779973451879} 
 </msg>
<msg time="2026-05-28T21:04:11.900590" 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-28T21:04:11.900892" 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-28T21:04:11.595822" elapsed="0.305126"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:11.901119" elapsed="0.000100"/>
</return>
<msg time="2026-05-28T21:04:11.901511" 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-28T21:04:11.595467" elapsed="0.306083"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.903604" 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-28T21:04:11.902698" elapsed="0.001024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.904645" 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-28T21:04:11.903918" elapsed="0.000770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.905072" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.904869" elapsed="0.000265"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:11.902013" elapsed="0.003212"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.907211" 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-28T21:04:11.905971" elapsed="0.001316"/>
</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-28T21:04:11.907530" elapsed="0.000359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.908258" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.908053" elapsed="0.000288"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:11.905521" elapsed="0.002918"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.910809" 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-28T21:04:11.909172" elapsed="0.001687"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.912282" 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-28T21:04:11.911035" elapsed="0.001284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.912739" 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": 1779973451879
}</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-28T21:04:11.912465" elapsed="0.000718"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:11.908709" elapsed="0.004570"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.914743" 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-28T21:04:11.914097" elapsed="0.000681"/>
</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-28T21:04:11.915166" elapsed="0.000666"/>
</kw>
<msg time="2026-05-28T21:04:11.915959" 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-28T21:04:11.914949" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.916325" 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-28T21:04:11.916144" elapsed="0.000209"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.916789" 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-28T21:04:11.916491" elapsed="0.000328"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.917186" 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-28T21:04:11.916968" elapsed="0.000246"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.917672" 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-28T21:04:11.917352" elapsed="0.000356"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.918078" 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-28T21:04:11.917846" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.918404" 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-28T21:04:11.918246" elapsed="0.000209"/>
</kw>
<arg>获取Vajra District列表</arg>
<arg>/v1/app/public/vajra-district/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:11.913632" elapsed="0.004911"/>
</kw>
<doc>验证Vajra District列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T21:04:11.592214" elapsed="0.326556"/>
</test>
<doc>Vajra District 接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:11.580726" elapsed="0.338629"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:08.114556" elapsed="3.806188"/>
</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-28T21:04:11.930207" 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-28T21:04:11.929982" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.930707" 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-28T21:04:11.930554" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:11.930335" elapsed="0.000463"/>
</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-28T21:04:11.930933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.930826" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.930312" elapsed="0.000697"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.931718" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.931579" elapsed="0.000189"/>
</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-28T21:04:11.932018" 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-28T21:04:11.932158" 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-28T21:04:11.932294" 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-28T21:04:11.932433" 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-28T21:04:11.932559" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.931840" elapsed="0.000839"/>
</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-28T21:04:11.932878" 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-28T21:04:11.933009" 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-28T21:04:11.933136" 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-28T21:04:11.933261" 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-28T21:04:11.933392" 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-28T21:04:11.933515" 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-28T21:04:11.933636" elapsed="0.000030"/>
</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-28T21:04:11.933785" 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-28T21:04:11.933916" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.932705" elapsed="0.001263"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.934337" 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-28T21:04:11.934092" elapsed="0.000291"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.934730" 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-28T21:04:11.934503" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.935058" 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-28T21:04:11.934867" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.935389" 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-28T21:04:11.935193" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.935719" 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-28T21:04:11.935522" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.936054" 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-28T21:04:11.935854" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.936396" 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-28T21:04:11.936187" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.936739" 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-28T21:04:11.936531" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.937089" 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-28T21:04:11.936875" elapsed="0.000250"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:11.933991" elapsed="0.003166"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.931821" elapsed="0.005355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.937411" 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-28T21:04:11.937264" elapsed="0.000187"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:11.937808" 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-28T21:04:11.937549" elapsed="0.000419"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:11.931303" elapsed="0.006728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.938210" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:11.938129" elapsed="0.000121"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:11.929706" elapsed="0.008594"/>
</kw>
<test id="s1-s2-s1-s1-t1" name="获取期货U本位交易对详情" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.939789" 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-28T21:04:11.939629" elapsed="0.000182"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:11.941138" 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-28T21:04:11.940601" elapsed="0.000583"/>
</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-28T21:04:11.941712" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:11.941285" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:11.941270" elapsed="0.000508"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:11.941804" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T21:04:11.941968" 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-28T21:04:11.939965" elapsed="0.002025"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:12.234038" 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-28T21:04:12.234409" 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 13: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': 'b1397f057e646003b8950852afe655e0', 'X-Transparent': '00-b1397f057e646003b8950852afe655e0-c83bd0c73a845e44-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.021', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76bbee6de2fc-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":1779973452215} 
 </msg>
<msg time="2026-05-28T21:04:12.234589" 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-28T21:04:12.234982" 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-28T21:04:11.942436" elapsed="0.292604"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:12.235238" elapsed="0.000119"/>
</return>
<msg time="2026-05-28T21:04:12.235717" 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-28T21:04:11.942101" elapsed="0.293664"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.238002" 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-28T21:04:12.237077" elapsed="0.001047"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.239239" 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-28T21:04:12.238366" elapsed="0.000921"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.239719" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.239494" elapsed="0.000305"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:12.236291" elapsed="0.003623"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.241993" 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-28T21:04:12.240768" elapsed="0.001278"/>
</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-28T21:04:12.242244" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.242982" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.242755" elapsed="0.000302"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:12.240219" elapsed="0.002934"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.245009" 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-28T21:04:12.243932" elapsed="0.001157"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.246139" 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-28T21:04:12.245358" elapsed="0.000831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.246726" 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": 1779973452215
}</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-28T21:04:12.246435" elapsed="0.000506"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:12.243452" elapsed="0.003597"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:12.248136" 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-28T21:04:12.247235" elapsed="0.000942"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.248637" 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-28T21:04:12.248366" elapsed="0.000347"/>
</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-28T21:04:12.248875" elapsed="0.000394"/>
</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-28T21:04:12.249521" elapsed="0.000251"/>
</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-28T21:04:12.250798" elapsed="0.000270"/>
</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-28T21:04:12.251194" elapsed="0.000207"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:12.251720" 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-28T21:04:12.251531" elapsed="0.000217"/>
</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-28T21:04:12.252288" elapsed="0.000180"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.253216" 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-28T21:04:12.252588" elapsed="0.000680"/>
</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-28T21:04:12.253419" elapsed="0.000398"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:12.251932" elapsed="0.001971"/>
</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-28T21:04:12.254124" elapsed="0.000246"/>
</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-28T21:04:12.254512" elapsed="0.000155"/>
</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-28T21:04:12.254779" 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-28T21:04:12.255029" 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-28T21:04:12.255277" elapsed="0.000132"/>
</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-28T21:04:12.255515" elapsed="0.000128"/>
</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-28T21:04:12.255749" elapsed="0.000126"/>
</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-28T21:04:12.255981" elapsed="0.000130"/>
</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-28T21:04:12.256220" elapsed="0.000151"/>
</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-28T21:04:12.256482" 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-28T21:04:12.256724" elapsed="0.000134"/>
</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-28T21:04:12.256966" elapsed="0.000141"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.257373" level="INFO">✅ 期货交易对详情项验证通过: btc_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.257208" elapsed="0.000211"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:12.250439" elapsed="0.007062"/>
</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-28T21:04:12.249927" elapsed="0.007624"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.258731" 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-28T21:04:12.258172" elapsed="0.000588"/>
</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-28T21:04:12.259269" elapsed="0.000335"/>
</kw>
<msg time="2026-05-28T21:04:12.259663" 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-28T21:04:12.258960" elapsed="0.000717"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.259940" 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-28T21:04:12.259764" elapsed="0.000207"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.260347" 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-28T21:04:12.260107" elapsed="0.000269"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.260701" 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-28T21:04:12.260511" elapsed="0.000218"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.261184" 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-28T21:04:12.260868" elapsed="0.000350"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.261581" 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-28T21:04:12.261346" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.261948" 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-28T21:04:12.261803" elapsed="0.000196"/>
</kw>
<arg>获取期货U本位交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:12.257820" elapsed="0.004250"/>
</kw>
<doc>验证期货U本位交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:11.938357" elapsed="0.323859"/>
</test>
<test id="s1-s2-s1-s1-t2" name="获取期货U本位其他交易对详情" line="35">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.263745" 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-28T21:04:12.263641" elapsed="0.000118"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.265165" 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-28T21:04:12.264537" elapsed="0.000656"/>
</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-28T21:04:12.265852" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.265326" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:12.265304" elapsed="0.000634"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:12.265969" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T21:04:12.266161" 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-28T21:04:12.263883" elapsed="0.002304"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:12.459523" 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-28T21:04:12.459763" 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 13: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': 'e3fbf7b0ddd5f9d3023d12b1f15f2477', 'X-Transparent': '00-e3fbf7b0ddd5f9d3023d12b1f15f2477-a2948ecc811bff1b-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': 'a02d76bd0950e2fc-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":1779973452442} 
 </msg>
<msg time="2026-05-28T21:04:12.459899" 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-28T21:04:12.461074" 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-28T21:04:12.266733" elapsed="0.194400"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:12.461277" elapsed="0.000088"/>
</return>
<msg time="2026-05-28T21:04:12.461694" 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-28T21:04:12.266326" elapsed="0.195404"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.463391" 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-28T21:04:12.462625" elapsed="0.000857"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.464261" 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-28T21:04:12.463652" elapsed="0.000641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.464608" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.464436" elapsed="0.000225"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:12.462103" elapsed="0.002633"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.466051" 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-28T21:04:12.465317" elapsed="0.000769"/>
</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-28T21:04:12.466230" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.466735" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.466589" elapsed="0.000197"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:12.464942" elapsed="0.001909"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.468387" 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-28T21:04:12.467719" elapsed="0.000705"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.469196" 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-28T21:04:12.468580" elapsed="0.000647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.469555" 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": 1779973452442
}</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-28T21:04:12.469354" elapsed="0.000313"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:12.467032" elapsed="0.002701"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:12.470482" 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-28T21:04:12.469851" elapsed="0.000664"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.470847" 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-28T21:04:12.470638" elapsed="0.000265"/>
</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-28T21:04:12.471084" elapsed="0.000373"/>
</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-28T21:04:12.471622" 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-28T21:04:12.472662" elapsed="0.000224"/>
</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-28T21:04:12.473058" elapsed="0.000191"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:12.473510" 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-28T21:04:12.473354" elapsed="0.000180"/>
</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-28T21:04:12.473919" elapsed="0.000142"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.474282" 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-28T21:04:12.474156" elapsed="0.000165"/>
</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-28T21:04:12.474416" elapsed="0.000161"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:12.473674" elapsed="0.000960"/>
</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-28T21:04:12.474745" elapsed="0.000152"/>
</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-28T21:04:12.475001" elapsed="0.000133"/>
</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-28T21:04:12.475242" elapsed="0.000126"/>
</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-28T21:04:12.475467" elapsed="0.000126"/>
</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-28T21:04:12.475696" elapsed="0.000124"/>
</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-28T21:04:12.475921" elapsed="0.000122"/>
</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-28T21:04:12.476143" elapsed="0.000123"/>
</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-28T21:04:12.476398" elapsed="0.000126"/>
</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-28T21:04:12.476627" elapsed="0.000129"/>
</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-28T21:04:12.476856" elapsed="0.000126"/>
</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-28T21:04:12.477079" elapsed="0.000118"/>
</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-28T21:04:12.477348" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.477974" level="INFO">✅ 期货交易对详情项验证通过: eth_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.477740" elapsed="0.000301"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:12.472347" elapsed="0.005773"/>
</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-28T21:04:12.471954" elapsed="0.006221"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.479349" 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-28T21:04:12.478774" elapsed="0.000607"/>
</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-28T21:04:12.479684" elapsed="0.000554"/>
</kw>
<msg time="2026-05-28T21:04:12.480337" 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-28T21:04:12.479519" elapsed="0.000845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.480668" 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-28T21:04:12.480509" elapsed="0.000186"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.481052" 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-28T21:04:12.480826" elapsed="0.000254"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.481455" 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-28T21:04:12.481255" elapsed="0.000229"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.481907" 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-28T21:04:12.481609" elapsed="0.000330"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.482292" 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-28T21:04:12.482067" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.482579" 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-28T21:04:12.482446" elapsed="0.000181"/>
</kw>
<arg>获取期货U本位其他交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:12.478394" elapsed="0.004289"/>
</kw>
<doc>验证期货U本位其他交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:12.262455" elapsed="0.220366"/>
</test>
<doc>期货U本位交易对详情接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:11.925388" elapsed="0.557770"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:11.923924" elapsed="0.560568"/>
</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-28T21:04:12.490202" 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-28T21:04:12.490030" elapsed="0.000195"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.490554" 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-28T21:04:12.490452" elapsed="0.000138"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:12.490297" elapsed="0.000319"/>
</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-28T21:04:12.490716" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.490638" elapsed="0.000121"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:12.490276" elapsed="0.000500"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.491306" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.491208" elapsed="0.000131"/>
</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-28T21:04:12.491528" 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-28T21:04:12.491630" 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-28T21:04:12.491726" 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-28T21:04:12.491815" 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-28T21:04:12.491906" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.491392" elapsed="0.000552"/>
</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-28T21:04:12.492086" 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-28T21:04:12.492186" 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-28T21:04:12.492279" elapsed="0.000014"/>
</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-28T21:04:12.492368" elapsed="0.000012"/>
</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-28T21:04:12.492452" 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-28T21:04:12.492540" 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-28T21:04:12.492625" elapsed="0.000012"/>
</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-28T21:04:12.492738" elapsed="0.000014"/>
</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-28T21:04:12.492827" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.491961" elapsed="0.000904"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.493140" 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-28T21:04:12.492956" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.493432" 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-28T21:04:12.493258" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.493714" 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-28T21:04:12.493548" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.494000" 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-28T21:04:12.493831" elapsed="0.000200"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.494287" 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-28T21:04:12.494116" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.494574" 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-28T21:04:12.494402" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.494961" 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-28T21:04:12.494688" elapsed="0.000305"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.495259" 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-28T21:04:12.495079" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.495567" 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-28T21:04:12.495381" elapsed="0.000217"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:12.492882" elapsed="0.002744"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:12.491379" elapsed="0.004263"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.495841" 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-28T21:04:12.495717" elapsed="0.000159"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:12.496223" 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-28T21:04:12.495966" elapsed="0.000405"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:12.491006" elapsed="0.005417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.496578" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.496507" elapsed="0.000105"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:12.489817" elapsed="0.006836"/>
</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-28T21:04:12.498984" 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-28T21:04:12.498501" elapsed="0.000504"/>
</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-28T21:04:12.499463" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.499091" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:12.499079" elapsed="0.000441"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:12.499545" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T21:04:12.499704" 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-28T21:04:12.497906" elapsed="0.001817"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:12.762934" 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-28T21:04:12.763447" 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 13: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': '34e0d156f9051236793ecb7c7547b8d2', 'X-Transparent': '00-34e0d156f9051236793ecb7c7547b8d2-e4557ee8322d11b6-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': 'a02d76bf5dbb0965-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779973452749,"s":"btc_usdt","u":1423261128930,"b":[["73350.6","24684"],["73350.5","25588"],["73350.4","19845"],["73350.2","32095"],["73350.1","22698"],["73349.8","141576"],["73349.7","27530"],["73349.3","209721"],["73349.2","165540"],["73349","5369"],["73348.6","3648"],["73348.4","17042"],["73348.1","27875"],["73346.2","4832"],["73346.1","32924"],["73345.4","4652"],["73345.1","3441"],["73344.9","3057"],["73344.6","29124"],["73343.8","2261"],["73343.2","19226"],["73343.1","22326"],["73342.6","4164"],["73341.4","4099"],["73341.2","12647"],["73340.5","28576"],["73340","21273"],["73338.9","23546"],["73336.6","5177"],["73335.8","2672"],["73335.4","25855"],["73334.5","13188"],["73334.4","1740"],["73334.2","21568"],["73332.5","3196"],["73331.2","21186"],["73330","3135"],["73329.3","5030"],["73328.8","29888"],["73328.4","2876"],["73326.9","43060"],["73326.7","4590"],["73325","3880"],["73321.8","3675"],["73321.5","13064"],["73321.3","16501"],["73321.2","3149"],["73320.1","4067"],["73319.2","3852"],["73316.9","4147"],["73315.4","13721"],["73314","15925"],["73313.3","10211"],["73311.8","4029"],["73311.1","28706"],["73310.3","3647"],["73308","6095"],["73307.2","27473"],["73305.8","3559"],["73304.2","3517"],["73300.6","14677"],["73300.2","6534"],["73295.5","3109"],["73293.1","4965"],["73292.9","14059"],["73292.8","9631"],["73292.4","7475"],["73290.2","17428"],["73290.1","2911"],["73287","3599"],["73283.3","6946"],["73281.2","1872"],["73280.3","2055"],["73279.4","32789"],["73279","5686"],["73273.8","36527"],["73273.7","10872"],["73273.1","3809"],["73271.4","5591"],["73270.1","5145"],["73269.3","651"],["73268.6","10273"],["73262","16407"],["73261.7","4755"],["73259.4","34376"],["73253.7","23113"],["73251.8","4791"],["73249.8","4075"],["73249.6","17999"],["73248.9","3392"],["73248.7","6875"],["73243","3362"],["73241.9","11990"],["73241.2","36157"],["73237.2","10302"],["73233.1","35849"],["73233","3163"],["73231.7","2415"],["73227.6","6948"],["73226.5","11849"]],"a":[["73805.4","21908"],["73805.5","25060"],["73805.7","19360"],["73805.8","5167"],["73806.1","4749"],["73806.2","4622"],["73806.4","172900"],["73806.5","168440"],["73806.7","172308"],["73806.9","9214"],["73807.8","64189"],["73807.9","15762"],["73808","30888"],["73808.5","1409"],["73808.9","19572"],["73809.5","33506"],["73810.3","7014"],["73810.6","4200"],["73810.8","18141"],["73811.1","27419"],["73812.2","11542"],["73813.2","4428"],["73814","6628"],["73814.9","33020"],["73815.1","23952"],["73815.2","19704"],["73815.7","1792"],["73815.8","14138"],["73817.5","22189"],["73819.2","22676"],["73819.8","18832"],["73821.4","3866"],["73822","3757"],["73823","2717"],["73823.4","2456"],["73824.6","2521"],["73825.2","13296"],["73827.2","4428"],["73828.5","14711"],["73829.1","3499"],["73829.8","20708"],["73830.3","13868"],["73830.4","41076"],["73831.4","3904"],["73831.8","18920"],["73833.8","45971"],["73834.1","32659"],["73835.4","25132"],["73835.9","2952"],["73836.1","6942"],["73836.6","3420"],["73837.9","5143"],["73838.5","3997"],["73842.3","24621"],["73842.6","13758"],["73844.8","4930"],["73846.5","3333"],["73847.8","20824"],["73848.4","4464"],["73850.5","11480"],["73851.4","29732"],["73851.7","3949"],["73853.5","5093"],["73857.4","3684"],["73857.7","22600"],["73858.1","11634"],["73859.5","13628"],["73861.3","31444"],["73863.1","27307"],["73865.1","30684"],["73865.2","22386"],["73867.3","26118"],["73867.5","16214"],["73870.8","23968"],["73875.6","4721"],["73875.9","6291"],["73876.8","14974"],["73877.1","48309"],["73882.2","30541"],["73882.4","1332"],["73888.4","5555"],["73889.1","18959"],["73889.2","44506"],["73892.5","3389"],["73893.1","23506"],["73894.1","2375"],["73896.1","5677"],["73897.2","3143"],["73899.9","4452"],["73901","15545"],["73905.2","4269"],["73907.7","3559"],["73909.2","5611"],["73911.4","15361"],["73913.1","22829"],["73915.8","7155"],["73916.6","6879"],["73917.9","24534"],["73919.6","2835"],["73921.9","5749"]]},"ts":1779973452749} 
 </msg>
<msg time="2026-05-28T21:04:12.763711" 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-28T21:04:12.764069" 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-28T21:04:12.500094" elapsed="0.264040"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:12.764377" elapsed="0.000131"/>
</return>
<msg time="2026-05-28T21:04:12.764880" 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-28T21:04:12.499826" elapsed="0.265109"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.767669" 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-28T21:04:12.766402" elapsed="0.001418"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.769129" 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-28T21:04:12.768104" elapsed="0.001080"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.769586" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.769373" elapsed="0.000280"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:12.765532" elapsed="0.004269"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.770851" 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-28T21:04:12.769978" elapsed="0.000961"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.772069" level="INFO">${data} = {'t': 1779973452749, 's': 'btc_usdt', 'u': 1423261128930, 'b': [['73350.6', '24684'], ['73350.5', '25588'], ['73350.4', '19845'], ['73350.2', '32095'], ['73350.1', '22698'], ['73349.8', '141576'], ['7...</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-28T21:04:12.771108" elapsed="0.001002"/>
</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-28T21:04:12.772291" elapsed="0.000219"/>
</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-28T21:04:12.772678" elapsed="0.000555"/>
</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-28T21:04:12.773408" elapsed="0.000168"/>
</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-28T21:04:12.773717" elapsed="0.000149"/>
</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-28T21:04:12.773994" elapsed="0.000148"/>
</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-28T21:04:12.774293" elapsed="0.000676"/>
</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-28T21:04:12.775116" 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-28T21:04:12.775932" elapsed="0.000606"/>
</kw>
<doc>验证期货U本位深度数据接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:12.496705" elapsed="0.280044"/>
</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-28T21:04:12.780708" 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-28T21:04:12.779884" elapsed="0.000859"/>
</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-28T21:04:12.781518" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.780919" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:12.780891" elapsed="0.000732"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:12.781668" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T21:04:12.781912" 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-28T21:04:12.779001" elapsed="0.002939"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:12.968998" 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-28T21:04:12.969309" 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 13: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': '6b787bcca1284f84a2b0766d355fd041', 'X-Transparent': '00-6b787bcca1284f84a2b0766d355fd041-f1ed526c2ffd499a-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': 'a02d76c038690965-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779973452956,"s":"eth_usdt","u":1423125091545,"b":[],"a":[]},"ts":1779973452956} 
 </msg>
<msg time="2026-05-28T21:04:12.969451" 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-28T21:04:12.969909" 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-28T21:04:12.782490" elapsed="0.187468"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:12.970142" elapsed="0.000112"/>
</return>
<msg time="2026-05-28T21:04:12.970557" 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-28T21:04:12.782104" elapsed="0.188487"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.972351" 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-28T21:04:12.971622" elapsed="0.000817"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.973208" 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-28T21:04:12.972615" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.973534" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:12.973380" elapsed="0.000201"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:12.971048" elapsed="0.002601"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.974313" 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-28T21:04:12.973768" elapsed="0.000595"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:12.975054" level="INFO">${data} = {'t': 1779973452956, '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-28T21:04:12.974484" elapsed="0.000610"/>
</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-28T21:04:12.975258" elapsed="0.000178"/>
</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-28T21:04:12.975565" elapsed="0.000148"/>
</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-28T21:04:12.975839" elapsed="0.000158"/>
</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-28T21:04:12.976124" elapsed="0.000154"/>
</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-28T21:04:12.976401" elapsed="0.000157"/>
</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-28T21:04:12.976686" elapsed="0.004052"/>
</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-28T21:04:12.981013" elapsed="0.000655"/>
</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-28T21:04:12.981820" elapsed="0.000469"/>
</kw>
<doc>验证期货U本位深度数据接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:12.777099" elapsed="0.205330"/>
</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-28T21:04:12.986597" 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-28T21:04:12.985635" elapsed="0.001007"/>
</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-28T21:04:12.987422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:12.986850" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:12.986808" elapsed="0.000712"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:12.987563" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T21:04:12.987796" 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-28T21:04:12.984551" elapsed="0.003272"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:13.105965" 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-28T21:04:13.106474" 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 13: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': '5937b2e5b087de442afb950e8b23d00b', 'X-Transparent': '00-5937b2e5b087de442afb950e8b23d00b-b9e1e1aea9cd79ec-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': 'a02d76c18c260965-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779973453092,"s":"sol_usdt","u":1423125089951,"b":[],"a":[["280.00","100"],["300.00","100"]]},"ts":1779973453092} 
 </msg>
<msg time="2026-05-28T21:04:13.106645" 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-28T21:04:13.106974" 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-28T21:04:12.988415" elapsed="0.118620"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:13.107253" elapsed="0.000118"/>
</return>
<msg time="2026-05-28T21:04:13.107731" 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-28T21:04:12.987997" elapsed="0.119787"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.110310" 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-28T21:04:13.109146" elapsed="0.001306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.111745" 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-28T21:04:13.110730" elapsed="0.001070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.112321" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:13.112045" elapsed="0.000370"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:13.108342" elapsed="0.004161"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.113436" 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-28T21:04:13.112674" elapsed="0.000831"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.114410" level="INFO">${data} = {'t': 1779973453092, '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-28T21:04:13.113682" elapsed="0.000767"/>
</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-28T21:04:13.114625" elapsed="0.000214"/>
</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-28T21:04:13.115005" 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-28T21:04:13.115363" elapsed="0.000191"/>
</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-28T21:04:13.115711" elapsed="0.000192"/>
</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-28T21:04:13.116064" elapsed="0.000197"/>
</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-28T21:04:13.116426" elapsed="0.000817"/>
</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-28T21:04:13.117414" elapsed="0.000817"/>
</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-28T21:04:13.118392" elapsed="0.000772"/>
</kw>
<doc>验证期货U本位深度数据接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:12.982683" elapsed="0.136730"/>
</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-28T21:04:13.125119" 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-28T21:04:13.123855" elapsed="0.001306"/>
</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-28T21:04:13.126015" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.125387" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:13.125353" elapsed="0.000765"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:13.126160" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T21:04:13.126391" 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-28T21:04:13.122789" elapsed="0.003631"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:13.307377" 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-28T21:04:13.307908" 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 13: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': 'fe37556c1b8976f1953a6022cd21638f', 'X-Transparent': '00-fe37556c1b8976f1953a6022cd21638f-c2a26c21c364a003-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': 'a02d76c26eea0965-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779973453238,"s":"btc_usdt","u":1423261128930,"b":[["73350.6","24684"],["73350.5","25588"],["73350.4","19845"],["73350.2","32095"],["73350.1","22698"],["73349.8","141576"],["73349.7","27530"],["73349.3","209721"],["73349.2","165540"],["73349","5369"],["73348.6","3648"],["73348.4","17042"],["73348.1","27875"],["73346.2","4832"],["73346.1","32924"],["73345.4","4652"],["73345.1","3441"],["73344.9","3057"],["73344.6","29124"],["73343.8","2261"],["73343.2","19226"],["73343.1","22326"],["73342.6","4164"],["73341.4","4099"],["73341.2","12647"],["73340.5","28576"],["73340","21273"],["73338.9","23546"],["73336.6","5177"],["73335.8","2672"],["73335.4","25855"],["73334.5","13188"],["73334.4","1740"],["73334.2","21568"],["73332.5","3196"],["73331.2","21186"],["73330","3135"],["73329.3","5030"],["73328.8","29888"],["73328.4","2876"],["73326.9","43060"],["73326.7","4590"],["73325","3880"],["73321.8","3675"],["73321.5","13064"],["73321.3","16501"],["73321.2","3149"],["73320.1","4067"],["73319.2","3852"],["73316.9","4147"],["73315.4","13721"],["73314","15925"],["73313.3","10211"],["73311.8","4029"],["73311.1","28706"],["73310.3","3647"],["73308","6095"],["73307.2","27473"],["73305.8","3559"],["73304.2","3517"],["73300.6","14677"],["73300.2","6534"],["73295.5","3109"],["73293.1","4965"],["73292.9","14059"],["73292.8","9631"],["73292.4","7475"],["73290.2","17428"],["73290.1","2911"],["73287","3599"],["73283.3","6946"],["73281.2","1872"],["73280.3","2055"],["73279.4","32789"],["73279","5686"],["73273.8","36527"],["73273.7","10872"],["73273.1","3809"],["73271.4","5591"],["73270.1","5145"],["73269.3","651"],["73268.6","10273"],["73262","16407"],["73261.7","4755"],["73259.4","34376"],["73253.7","23113"],["73251.8","4791"],["73249.8","4075"],["73249.6","17999"],["73248.9","3392"],["73248.7","6875"],["73243","3362"],["73241.9","11990"],["73241.2","36157"],["73237.2","10302"],["73233.1","35849"],["73233","3163"],["73231.7","2415"],["73227.6","6948"],["73226.5","11849"],["73223.1","11258"],["73218.9","4340"],["73218.4","10346"],["73217.9","1441"],["73216.2","15648"],["73213.8","15419"],["73213.5","3697"],["73205.6","3169"],["73204.9","3722"],["73203.8","22604"],["73202.6","7067"],["73199.9","3516"],["73198.5","7515"],["73198.3","9437"],["73193.6","17589"],["73193.1","22651"],["73192.8","3778"],["73191.4","3119"],["73189.7","4311"],["73189","13324"],["73187.9","5084"],["73184.3","14306"],["73183.9","1812"],["73179.7","5250"],["73172.6","4046"],["73167.4","23361"],["73165.9","3399"],["73165.3","15333"],["73160.3","4400"],["73158.8","4199"],["73157.9","17900"],["73149.8","4365"],["73147.1","4055"],["73140.8","5035"],["73137.5","24502"],["73136","22135"],["73133.4","14908"],["73132.5","15216"],["73130.7","16412"],["73128.9","21342"],["73127.5","3070"],["73126","3121"],["73117.4","2387"],["73108.3","12131"],["73106.8","38897"],["73105","3023"],["73097.8","9479"],["73097.3","4138"],["73095.5","3764"],["73095.3","2238"],["73087.3","22318"],["73086.4","19583"],["73083.6","31451"],["73080.3","29444"],["73079.1","10012"],["73077.5","4009"],["73070.8","14484"],["73069.9","21165"],["73069","29165"],["73068.7","44426"],["73058.5","1432"],["73052.6","23692"],["73049.3","3393"],["73042.4","4157"],["73040.9","25866"],["73037.5","4431"],["73035.6","13379"],["73028","3939"],["73026.2","6308"],["73023.9","10720"],["73015.7","21545"],["73013.9","30967"],["73008.6","4335"],["73004.6","3265"],["73002.8","4276"],["72999.7","2700"],["72996.4","7033"],["72989.3","17692"],["72987.5","6777"],["72983.4","27076"],["72982.2","2574"],["72977.1","4336"],["72974.8","13024"],["72974.4","11993"],["72974","2316"],["72970.7","2217"],["72969.8","6687"],["72969.3","62701"],["72969","27689"],["72968.3","33044"],["72965.4","2442"],["72957.1","5108"],["72957","2903"],["72950.3","27735"],["72938.7","4560"],["72938.5","4030"],["72932.2","5809"],["72931.7","55444"],["72930.1","5295"],["72928.5","9563"],["72926.2","33290"],["72924.2","4844"],["72922","3149"],["72920","12322"],["72919.7","22646"],["72918.1","18460"],["72915.4","5195"],["72901.8","4112"],["72897.1","254"],["72895.6","31672"],["72895.5","3593"],["72892.2","21897"],["72888.2","12260"],["72886.8","3857"],["72886.2","19155"],["72880.5","4051"],["72873.3","5280"],["72866.4","2922"],["72860","15188"],["72857.1","2585"],["72856.1","4006"],["72847.6","3602"],["72844.6","22461"],["72843.7","294"],["72843","5719"],["72841.8","5459"],["72841.1","2"],["72830.7","5716"],["72827.9","5300"],["72825.5","36580"],["72825.3","25008"],["72822.1","27653"],["72821.1","10182"],["72817.7","29938"],["72813.1","32029"],["72804","13005"],["72798","7066"],["72796.6","4670"],["72790.6","3989"],["72789.4","3832"],["72785.9","7948"],["72783.6","19923"],["72783","2639"],["72782.2","30256"],["72782","18364"],["72771.4","24459"],["72766.5","2941"],["72760","3328"],["72759","14286"],["72758.1","6345"],["72755.6","3837"],["72752.7","8188"],["72751","23445"],["72750.7","3220"],["72747.5","16585"],["72747.1","3717"],["72744.4","6303"],["72740.9","38732"],["72739.6","4223"],["72739.2","45491"],["72736","8458"],["72733.6","6690"],["72733.2","5767"],["72732.3","19904"],["72715.4","37325"],["72708","291"],["72701.9","20872"],["72700.3","46538"],["72695.5","42010"],["72688.1","2754"],["72684.9","31730"],["72682.9","49911"],["72671.3","26523"],["72662.5","21537"],["72656.5","5177"],["72654.2","2519"],["72637.7","31130"],["72617.5","4722"],["72607.8","32106"],["72598.6","4372"],["72584.7","5100"],["72548.6","24219"]],"a":[["73805.4","21908"],["73805.5","25060"],["73805.7","19360"],["73805.8","5167"],["73806.1","4749"],["73806.2","4622"],["73806.4","172900"],["73806.5","168440"],["73806.7","172308"],["73806.9","9214"],["73807.8","64189"],["73807.9","15762"],["73808","30888"],["73808.5","1409"],["73808.9","19572"],["73809.5","33506"],["73810.3","7014"],["73810.6","4200"],["73810.8","18141"],["73811.1","27419"],["73812.2","11542"],["73813.2","4428"],["73814","6628"],["73814.9","33020"],["73815.1","23952"],["73815.2","19704"],["73815.7","1792"],["73815.8","14138"],["73817.5","22189"],["73819.2","22676"],["73819.8","18832"],["73821.4","3866"],["73822","3757"],["73823","2717"],["73823.4","2456"],["73824.6","2521"],["73825.2","13296"],["73827.2","4428"],["73828.5","14711"],["73829.1","3499"],["73829.8","20708"],["73830.3","13868"],["73830.4","41076"],["73831.4","3904"],["73831.8","18920"],["73833.8","45971"],["73834.1","32659"],["73835.4","25132"],["73835.9","2952"],["73836.1","6942"],["73836.6","3420"],["73837.9","5143"],["73838.5","3997"],["73842.3","24621"],["73842.6","13758"],["73844.8","4930"],["73846.5","3333"],["73847.8","20824"],["73848.4","4464"],["73850.5","11480"],["73851.4","29732"],["73851.7","3949"],["73853.5","5093"],["73857.4","3684"],["73857.7","22600"],["73858.1","11634"],["73859.5","13628"],["73861.3","31444"],["73863.1","27307"],["73865.1","30684"],["73865.2","22386"],["73867.3","26118"],["73867.5","16214"],["73870.8","23968"],["73875.6","4721"],["73875.9","6291"],["73876.8","14974"],["73877.1","48309"],["73882.2","30541"],["73882.4","1332"],["73888.4","5555"],["73889.1","18959"],["73889.2","44506"],["73892.5","3389"],["73893.1","23506"],["73894.1","2375"],["73896.1","5677"],["73897.2","3143"],["73899.9","4452"],["73901","15545"],["73905.2","4269"],["73907.7","3559"],["73909.2","5611"],["73911.4","15361"],["73913.1","22829"],["73915.8","7155"],["73916.6","6879"],["73917.9","24534"],["73919.6","2835"],["73921.9","5749"],["73927.3","45821"],["73927.6","3140"],["73928.4","38701"],["73931.2","16036"],["73937.3","4541"],["73939.7","24133"],["73940.3","33213"],["73943.3","4381"],["73946.1","19251"],["73948.8","37862"],["73949","5230"],["73949.2","8271"],["73949.9","4416"],["73958.7","20468"],["73965.8","15297"],["73966.8","25119"],["73967","24716"],["73971.4","6507"],["73972.6","5473"],["73976.8","24242"],["73979.5","29331"],["73980.3","5142"],["73982.5","7832"],["73983.2","9910"],["73984.9","7848"],["73987.2","5042"],["73991.2","14220"],["73994.5","2929"],["73995.9","34664"],["73999.4","5052"],["73999.7","3657"],["74000.3","27987"],["74005.2","31689"],["74005.3","23937"],["74011","3707"],["74018.4","17881"],["74020.7","14735"],["74021.4","4701"],["74022.4","46167"],["74023.7","2435"],["74026.3","3102"],["74026.8","30321"],["74028.2","24961"],["74029.2","18912"],["74033","3179"],["74036.1","2833"],["74044.7","4898"],["74052.6","4787"],["74053.3","2880"],["74057.3","15794"],["74066.4","7573"],["74069","19080"],["74071.7","2811"],["74079.5","35150"],["74084.3","20763"],["74085","34661"],["74088.4","16692"],["74088.6","20036"],["74089.2","4865"],["74092.2","22817"],["74096.9","4853"],["74099.4","3327"],["74099.6","12740"],["74102.5","5556"],["74103.9","14937"],["74108.7","33169"],["74113.9","4821"],["74124.3","5459"],["74127.2","5942"],["74129.5","3260"],["74130","3139"],["74131.9","4635"],["74143.9","4638"],["74146.9","16049"],["74148.4","20341"],["74148.7","2133"],["74151.2","3366"],["74154.1","4471"],["74157.7","8479"],["74170.5","3783"],["74171.6","26438"],["74174.6","1948"],["74189.3","2867"],["74190.2","22409"],["74195.1","9417"],["74202.9","7518"],["74203.8","3060"],["74204.2","40932"],["74206.9","3605"],["74207.4","33140"],["74209.3","29380"],["74209.6","6250"],["74212.2","4541"],["74214","11878"],["74214.6","2844"],["74216.2","23923"],["74217.9","5145"],["74218","1497"],["74223","2669"],["74226.5","12773"],["74231","23010"],["74235.6","31136"],["74237.5","12219"],["74248.1","21468"],["74253.9","25564"],["74256.1","1876"],["74258.3","2888"],["74258.6","10577"],["74259.9","2636"],["74262.4","4239"],["74268.3","4669"],["74272.2","2882"],["74272.5","1551"],["74283","21626"],["74283.9","23218"],["74284.9","5026"],["74294.1","6264"],["74305.1","6594"],["74310.5","2742"],["74312.5","16290"],["74314.9","3383"],["74325","4038"],["74346.8","19230"],["74349.2","18214"],["74350.8","2940"],["74352.7","4544"],["74355.7","22732"],["74371.6","3730"],["74387.4","4046"],["74387.5","18656"],["74388.4","8067"],["... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T21:04:13.308477" 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-28T21:04:13.308886" 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-28T21:04:13.127034" elapsed="0.181922"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:13.309211" elapsed="0.000144"/>
</return>
<msg time="2026-05-28T21:04:13.309892" 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-28T21:04:13.126597" elapsed="0.183362"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.312808" 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-28T21:04:13.311597" elapsed="0.001359"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.314377" 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-28T21:04:13.313254" elapsed="0.001177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.314970" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:13.314688" elapsed="0.000371"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:13.310700" elapsed="0.004488"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.316860" 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-28T21:04:13.315427" elapsed="0.001585"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.319315" level="INFO">${data} = {'t': 1779973453238, 's': 'btc_usdt', 'u': 1423261128930, 'b': [['73350.6', '24684'], ['73350.5', '25588'], ['73350.4', '19845'], ['73350.2', '32095'], ['73350.1', '22698'], ['73349.8', '141576'], ['7...</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-28T21:04:13.317240" elapsed="0.002135"/>
</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-28T21:04:13.319613" elapsed="0.000297"/>
</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-28T21:04:13.320134" elapsed="0.000258"/>
</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-28T21:04:13.320625" elapsed="0.000255"/>
</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-28T21:04:13.321119" elapsed="0.000262"/>
</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-28T21:04:13.321603" elapsed="0.000262"/>
</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-28T21:04:13.322036" elapsed="0.000718"/>
</kw>
<doc>验证期货U本位深度数据接口不同深度级别功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:13.119821" elapsed="0.203179"/>
</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-28T21:04:13.328047" 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-28T21:04:13.327203" elapsed="0.000877"/>
</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-28T21:04:13.328907" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.328254" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:13.328222" elapsed="0.000790"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:13.329059" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T21:04:13.329284" 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-28T21:04:13.326282" elapsed="0.003032"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:13.453961" 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-28T21:04:13.454560" 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 13: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': '81173b3ccf8b89982e3e84e07db42166', 'X-Transparent': '00-81173b3ccf8b89982e3e84e07db42166-b83da62b5a057e0f-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.015', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76c3ab400965-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779973453441} 
 </msg>
<msg time="2026-05-28T21:04:13.454770" 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-28T21:04:13.455147" 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-28T21:04:13.329938" elapsed="0.125276"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:13.455462" elapsed="0.000158"/>
</return>
<msg time="2026-05-28T21:04:13.456033" 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-28T21:04:13.329487" elapsed="0.126605"/>
</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-28T21:04:13.456586" elapsed="0.003184"/>
</kw>
<doc>验证期货U本位深度数据接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:13.323418" elapsed="0.136742"/>
</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-28T21:04:13.466692" 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-28T21:04:13.465749" elapsed="0.000981"/>
</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-28T21:04:13.467649" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.466943" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:13.466907" elapsed="0.000864"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:13.467819" elapsed="0.000045"/>
</return>
<msg time="2026-05-28T21:04:13.468077" 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-28T21:04:13.464430" elapsed="0.003683"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:13.859975" 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-28T21:04:13.860399" 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 13: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': '6fb22de2f6bd04a9673cddc85f95da65', 'X-Transparent': '00-6fb22de2f6bd04a9673cddc85f95da65-f903f2171e4d36d2-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': 'a02d76c48e3d0965-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779973453579} 
 </msg>
<msg time="2026-05-28T21:04:13.860750" 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-28T21:04:13.861143" 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-28T21:04:13.468826" elapsed="0.392385"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:13.861462" elapsed="0.000161"/>
</return>
<msg time="2026-05-28T21:04:13.862056" 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-28T21:04:13.468322" elapsed="0.393790"/>
</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-28T21:04:13.862573" elapsed="0.003160"/>
</kw>
<doc>验证期货U本位深度数据接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:13.460732" elapsed="0.405404"/>
</test>
<doc>期货U本位深度数据接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:12.486444" elapsed="1.380549"/>
</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-28T21:04:13.876533" 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-28T21:04:13.876267" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.877155" 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-28T21:04:13.876978" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:13.876702" elapsed="0.000556"/>
</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-28T21:04:13.877424" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.877295" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:13.876663" elapsed="0.000853"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.878471" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:13.878333" elapsed="0.000191"/>
</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-28T21:04:13.878792" 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-28T21:04:13.878921" elapsed="0.000034"/>
</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-28T21:04:13.879056" elapsed="0.000024"/>
</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-28T21:04:13.879186" 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-28T21:04:13.879309" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.878604" elapsed="0.000772"/>
</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-28T21:04:13.879570" 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-28T21:04:13.879691" 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-28T21:04:13.879808" 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-28T21:04:13.879931" elapsed="0.000022"/>
</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-28T21:04:13.880068" elapsed="0.000028"/>
</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-28T21:04:13.880203" 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-28T21:04:13.880332" elapsed="0.000036"/>
</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-28T21:04:13.880475" elapsed="0.000072"/>
</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-28T21:04:13.880895" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.879412" elapsed="0.001537"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.881353" 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-28T21:04:13.881074" elapsed="0.000319"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.881728" 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-28T21:04:13.881500" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.882112" 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-28T21:04:13.881876" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.882498" 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-28T21:04:13.882258" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.882853" 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-28T21:04:13.882653" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.883186" 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-28T21:04:13.882991" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.883547" 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-28T21:04:13.883324" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.883889" 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-28T21:04:13.883680" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.884236" 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-28T21:04:13.884023" elapsed="0.000246"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:13.880976" elapsed="0.003333"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:13.878578" elapsed="0.005751"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.884565" 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-28T21:04:13.884418" elapsed="0.000191"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:13.885104" 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-28T21:04:13.884717" elapsed="0.000645"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:13.877977" elapsed="0.007451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:13.885607" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:13.885528" elapsed="0.000117"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:13.875910" elapsed="0.009793"/>
</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-28T21:04:13.889240" 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-28T21:04:13.888436" elapsed="0.000844"/>
</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-28T21:04:13.890055" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:13.889448" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:13.889423" elapsed="0.000733"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:13.890194" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T21:04:13.890428" 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-28T21:04:13.887357" elapsed="0.003100"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:14.479596" 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-28T21:04:14.480231" 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 13: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': '9b1dc127d88c7f281813c7f6cf62deae', 'X-Transparent': '00-9b1dc127d88c7f281813c7f6cf62deae-a14d03b9556cc5bd-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': 'a02d76c9ff340442-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"btc_usdt","fundingRate":0.00154,"nextCollectionTime":1779976800000,"collectionInternal":1},"ts":1779973454464} 
 </msg>
<msg time="2026-05-28T21:04:14.480410" 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-28T21:04:14.480800" 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-28T21:04:13.891057" elapsed="0.589809"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:14.481102" elapsed="0.000127"/>
</return>
<msg time="2026-05-28T21:04:14.481652" 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-28T21:04:13.890633" elapsed="0.591079"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.484520" 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-28T21:04:14.483231" elapsed="0.001438"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.486068" 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-28T21:04:14.484974" elapsed="0.001148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.486663" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:14.486373" elapsed="0.000383"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:14.482352" elapsed="0.004527"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.488109" 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-28T21:04:14.487121" elapsed="0.001057"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.489126" level="INFO">${data} = {'symbol': 'btc_usdt', 'fundingRate': 0.00154, 'nextCollectionTime': 1779976800000, '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-28T21:04:14.488355" elapsed="0.000812"/>
</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-28T21:04:14.489342" elapsed="0.000222"/>
</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-28T21:04:14.489736" elapsed="0.000202"/>
</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-28T21:04:14.490107" elapsed="0.000194"/>
</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-28T21:04:14.490468" elapsed="0.000192"/>
</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-28T21:04:14.490847" elapsed="0.000837"/>
</kw>
<doc>验证期货U本位资金费率接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:13.885785" elapsed="0.606198"/>
</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-28T21:04:14.497023" 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-28T21:04:14.496132" elapsed="0.000929"/>
</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-28T21:04:14.497884" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:14.497234" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:14.497201" elapsed="0.000850"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:14.498098" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T21:04:14.498341" 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-28T21:04:14.494615" elapsed="0.003756"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:14.631490" 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-28T21:04:14.631845" 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 13: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': '69ed4a421ac8a8ebba4bbcb3bc6c908d', 'X-Transparent': '00-69ed4a421ac8a8ebba4bbcb3bc6c908d-3f8c95da049b8a02-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': 'a02d76caffe60442-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":1779973454617} 
 </msg>
<msg time="2026-05-28T21:04:14.632076" 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-28T21:04:14.632427" 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-28T21:04:14.499029" elapsed="0.133462"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:14.632695" elapsed="0.000116"/>
</return>
<msg time="2026-05-28T21:04:14.633165" 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-28T21:04:14.498562" elapsed="0.134662"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.635708" 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-28T21:04:14.634508" elapsed="0.001341"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.637179" 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-28T21:04:14.636128" elapsed="0.001109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.637776" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:14.637493" elapsed="0.000380"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:14.633741" elapsed="0.004259"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.639269" 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-28T21:04:14.638226" elapsed="0.001144"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.640678" 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-28T21:04:14.639613" elapsed="0.001121"/>
</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-28T21:04:14.640969" elapsed="0.000304"/>
</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-28T21:04:14.641499" elapsed="0.000277"/>
</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-28T21:04:14.642014" elapsed="0.000285"/>
</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-28T21:04:14.642529" elapsed="0.000286"/>
</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-28T21:04:14.643047" elapsed="0.001141"/>
</kw>
<doc>验证期货U本位资金费率接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:14.492379" elapsed="0.152133"/>
</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-28T21:04:14.649165" 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-28T21:04:14.648216" elapsed="0.001043"/>
</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-28T21:04:14.650090" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:14.649447" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:14.649416" elapsed="0.000774"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:14.650233" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T21:04:14.650458" 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-28T21:04:14.647174" elapsed="0.003315"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:14.793189" 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-28T21:04:14.793600" 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 13: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': '7d6114437ba9ce8ad01a476868a76e7c', 'X-Transparent': '00-7d6114437ba9ce8ad01a476868a76e7c-c06e3cb2daeec477-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.018', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76cbe8930442-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":1779973454769} 
 </msg>
<msg time="2026-05-28T21:04:14.793782" 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-28T21:04:14.794211" 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-28T21:04:14.651104" elapsed="0.143175"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:14.794541" elapsed="0.000140"/>
</return>
<msg time="2026-05-28T21:04:14.795087" 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-28T21:04:14.650659" elapsed="0.144485"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.798166" 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-28T21:04:14.796539" elapsed="0.001742"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.799510" 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-28T21:04:14.798514" elapsed="0.001054"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.799998" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:14.799792" elapsed="0.000267"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:14.795775" elapsed="0.004369"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.800961" 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-28T21:04:14.800293" elapsed="0.000724"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:14.801778" 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-28T21:04:14.801158" elapsed="0.000654"/>
</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-28T21:04:14.801958" elapsed="0.000186"/>
</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-28T21:04:14.802276" elapsed="0.000158"/>
</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-28T21:04:14.802566" elapsed="0.000239"/>
</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-28T21:04:14.802940" elapsed="0.000157"/>
</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-28T21:04:14.803240" elapsed="0.000639"/>
</kw>
<doc>验证期货U本位资金费率接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:14.645040" elapsed="0.159061"/>
</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-28T21:04:14.808687" 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-28T21:04:14.807872" elapsed="0.000849"/>
</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-28T21:04:14.809466" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:14.808902" elapsed="0.000625"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:14.808865" elapsed="0.000695"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:14.809605" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T21:04:14.809813" 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-28T21:04:14.806945" elapsed="0.002896"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:15.000576" 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-28T21:04:15.000827" 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 13: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': '13f85474e6d45a77cd65191487d1f904', 'X-Transparent': '00-13f85474e6d45a77cd65191487d1f904-45d5af3b6b84fd37-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': 'a02d76ccf96d0442-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779973454930} 
 </msg>
<msg time="2026-05-28T21:04:15.000942" 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-28T21:04:15.001265" 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-28T21:04:14.810406" elapsed="0.190892"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:15.001444" elapsed="0.000135"/>
</return>
<msg time="2026-05-28T21:04:15.001960" 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-28T21:04:14.810002" elapsed="0.192014"/>
</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-28T21:04:15.002445" elapsed="0.001999"/>
</kw>
<doc>验证期货U本位资金费率接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:14.804463" elapsed="0.200179"/>
</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-28T21:04:15.009478" 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-28T21:04:15.008602" 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-28T21:04:15.010871" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.009926" elapsed="0.001041"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.009877" elapsed="0.001134"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:15.011069" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T21:04:15.011365" 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-28T21:04:15.007761" elapsed="0.003633"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:15.143155" 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-28T21:04:15.143574" 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 13: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': 'e2694d7400bac86004b72d48b0cf2aa3', 'X-Transparent': '00-e2694d7400bac86004b72d48b0cf2aa3-86c61a76cad85822-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': 'a02d76ce3a730442-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779973455129} 
 </msg>
<msg time="2026-05-28T21:04:15.143824" 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-28T21:04:15.144262" 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-28T21:04:15.012408" elapsed="0.131926"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:15.144570" elapsed="0.000147"/>
</return>
<msg time="2026-05-28T21:04:15.145123" 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-28T21:04:15.011586" elapsed="0.133597"/>
</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-28T21:04:15.145659" elapsed="0.003343"/>
</kw>
<doc>验证期货U本位资金费率接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:15.004929" elapsed="0.144450"/>
</test>
<doc>期货U本位资金费率接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:13.869616" elapsed="1.280588"/>
</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-28T21:04:15.160093" 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-28T21:04:15.159792" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.160758" 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-28T21:04:15.160568" elapsed="0.000251"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:15.160278" elapsed="0.000585"/>
</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-28T21:04:15.161027" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.160901" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.160241" elapsed="0.000876"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.162085" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:15.161931" elapsed="0.000210"/>
</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-28T21:04:15.162432" 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-28T21:04:15.162570" 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-28T21:04:15.162703" 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-28T21:04:15.162831" elapsed="0.000110"/>
</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-28T21:04:15.163080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.162224" elapsed="0.000912"/>
</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-28T21:04:15.163350" 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-28T21:04:15.163479" 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-28T21:04:15.163602" 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-28T21:04:15.163723" 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-28T21:04:15.163847" 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-28T21:04:15.163967" 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-28T21:04:15.164087" elapsed="0.000017"/>
</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-28T21:04:15.164204" 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-28T21:04:15.164323" elapsed="0.000361"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.163167" elapsed="0.001556"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.165197" 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-28T21:04:15.164862" elapsed="0.000383"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.165591" 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-28T21:04:15.165361" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.165961" 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-28T21:04:15.165751" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.166305" 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-28T21:04:15.166097" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.166652" 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-28T21:04:15.166447" elapsed="0.000242"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.167004" 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-28T21:04:15.166796" elapsed="0.000243"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.167356" 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-28T21:04:15.167137" elapsed="0.000254"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.167700" 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-28T21:04:15.167490" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.168049" 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-28T21:04:15.167831" elapsed="0.000253"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:15.164753" elapsed="0.003366"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.162202" elapsed="0.005942"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.168411" 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-28T21:04:15.168247" elapsed="0.000210"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:15.168936" 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-28T21:04:15.168559" elapsed="0.000652"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:15.161571" elapsed="0.007728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.169515" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:15.169421" elapsed="0.000133"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:15.159374" elapsed="0.010230"/>
</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-28T21:04:15.173204" 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-28T21:04:15.172449" elapsed="0.000826"/>
</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-28T21:04:15.174015" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.173429" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.173407" elapsed="0.000700"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:15.174147" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T21:04:15.174370" 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-28T21:04:15.171570" elapsed="0.002830"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:15.525206" 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-28T21:04:15.525623" 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 13: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': '1e8940f1d7b1f8c6483dba4b0024d714', 'X-Transparent': '00-1e8940f1d7b1f8c6483dba4b0024d714-7c0ed012e3cc9742-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': 'a02d76d018db1fbe-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":"1992.19","t":1779973454803},{"s":"sol_usdt","p":"81.2","t":1779973454805},{"s":"bnb_usdt","p":"599.36","t":1776061637754},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"73489.55","t":1779973454799},{"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.09828","t":1779973454808},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"73530.643","t":1779973454795},{"s":"xaut_usdt","p":"4543.7984","t":1779095550280}],"ts":1779973455439} 
 </msg>
<msg time="2026-05-28T21:04:15.525817" 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-28T21:04:15.526224" 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-28T21:04:15.175333" elapsed="0.350958"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:15.526520" elapsed="0.000135"/>
</return>
<msg time="2026-05-28T21:04:15.527033" 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-28T21:04:15.174564" elapsed="0.352524"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.529819" 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-28T21:04:15.528542" elapsed="0.001426"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.531320" 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-28T21:04:15.530260" elapsed="0.001113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.531897" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:15.531623" elapsed="0.000373"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:15.527662" elapsed="0.004458"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.534592" 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-28T21:04:15.533774" elapsed="0.000893"/>
</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-28T21:04:15.534842" elapsed="0.000477"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-05-28T21:04:15.532489" elapsed="0.002924"/>
</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-28T21:04:15.536795" elapsed="0.000807"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.537946" 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-28T21:04:15.537758" elapsed="0.000242"/>
</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-28T21:04:15.538932" elapsed="0.000211"/>
</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-28T21:04:15.539281" elapsed="0.000181"/>
</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-28T21:04:15.539597" elapsed="0.000181"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.540887" 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-28T21:04:15.540718" elapsed="0.000224"/>
</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-28T21:04:15.541088" 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-28T21:04:15.541418" elapsed="0.000466"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.539946" elapsed="0.002015"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.542891" 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-28T21:04:15.542751" elapsed="0.000192"/>
</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-28T21:04:15.543051" elapsed="0.000157"/>
</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-28T21:04:15.543320" elapsed="0.000327"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.542109" elapsed="0.001605"/>
</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-28T21:04:15.544502" elapsed="0.000247"/>
</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-28T21:04:15.544859" elapsed="0.000195"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.545388" 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-28T21:04:15.545184" elapsed="0.000232"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.545652" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.545729" 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-28T21:04:15.545533" elapsed="0.000223"/>
</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-28T21:04:15.545874" elapsed="0.000249"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.543869" elapsed="0.002318"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.538564" elapsed="0.007675"/>
</kw>
<var name="${index_price}">{'s': 'trb_usdt', 'p': '15.164', 't': 1776061641025}</var>
<status status="PASS" start="2026-05-28T21:04:15.538366" elapsed="0.007902"/>
</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-28T21:04:15.546772" elapsed="0.000157"/>
</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-28T21:04:15.547030" elapsed="0.000134"/>
</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-28T21:04:15.547262" elapsed="0.000149"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.548395" 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-28T21:04:15.548108" elapsed="0.000329"/>
</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-28T21:04:15.548532" elapsed="0.000123"/>
</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-28T21:04:15.548750" elapsed="0.000135"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.547535" elapsed="0.001405"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.549711" 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-28T21:04:15.549593" elapsed="0.000161"/>
</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-28T21:04:15.549843" elapsed="0.000122"/>
</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-28T21:04:15.550109" elapsed="0.000145"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.549049" elapsed="0.001297"/>
</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-28T21:04:15.551340" 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-28T21:04:15.551749" elapsed="0.000198"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.552270" 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-28T21:04:15.552069" elapsed="0.000229"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.552542" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.552621" 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-28T21:04:15.552417" elapsed="0.000230"/>
</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-28T21:04:15.552768" elapsed="0.000259"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.550582" elapsed="0.002518"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.546504" elapsed="0.006654"/>
</kw>
<var name="${index_price}">{'s': 'xrp_usdt', 'p': '1.8284', 't': 1744189287376}</var>
<status status="PASS" start="2026-05-28T21:04:15.546374" elapsed="0.006817"/>
</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-28T21:04:15.553732" elapsed="0.000176"/>
</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-28T21:04:15.554033" elapsed="0.000171"/>
</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-28T21:04:15.554332" elapsed="0.000169"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.555453" 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-28T21:04:15.555298" elapsed="0.000204"/>
</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-28T21:04:15.555617" elapsed="0.000163"/>
</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-28T21:04:15.555897" elapsed="0.000178"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.554646" elapsed="0.001497"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.557078" 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-28T21:04:15.556925" elapsed="0.000204"/>
</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-28T21:04:15.557243" elapsed="0.000159"/>
</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-28T21:04:15.557520" elapsed="0.000182"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.556282" elapsed="0.001486"/>
</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-28T21:04:15.558552" elapsed="0.000233"/>
</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-28T21:04:15.558903" elapsed="0.000189"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.559356" level="INFO">${timestamp_str} = 1779973454803</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:15.559196" elapsed="0.000184"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.559587" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.559653" 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-28T21:04:15.559483" elapsed="0.000191"/>
</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-28T21:04:15.559770" elapsed="0.000200"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.557914" elapsed="0.002109"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.553429" elapsed="0.006636"/>
</kw>
<var name="${index_price}">{'s': 'eth_usdt', 'p': '1992.19', 't': 1779973454803}</var>
<status status="PASS" start="2026-05-28T21:04:15.553294" elapsed="0.006794"/>
</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-28T21:04:15.560662" elapsed="0.000143"/>
</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-28T21:04:15.560908" elapsed="0.000138"/>
</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-28T21:04:15.561177" elapsed="0.000140"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.562089" 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-28T21:04:15.561964" elapsed="0.000167"/>
</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-28T21:04:15.562225" elapsed="0.000137"/>
</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-28T21:04:15.562460" elapsed="0.000141"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.561438" elapsed="0.001222"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.563425" 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-28T21:04:15.563299" elapsed="0.000167"/>
</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-28T21:04:15.563552" 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-28T21:04:15.563753" elapsed="0.000128"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.562771" elapsed="0.001159"/>
</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-28T21:04:15.564491" elapsed="0.000164"/>
</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-28T21:04:15.564741" elapsed="0.000135"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.565097" level="INFO">${timestamp_str} = 1779973454805</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:15.564962" elapsed="0.000155"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.565287" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.565344" 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-28T21:04:15.565199" elapsed="0.000164"/>
</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-28T21:04:15.565446" elapsed="0.000171"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.564031" elapsed="0.001634"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.560276" elapsed="0.005424"/>
</kw>
<var name="${index_price}">{'s': 'sol_usdt', 'p': '81.2', 't': 1779973454805}</var>
<status status="PASS" start="2026-05-28T21:04:15.560166" elapsed="0.005554"/>
</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-28T21:04:15.566087" elapsed="0.000120"/>
</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-28T21:04:15.566292" elapsed="0.000125"/>
</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-28T21:04:15.566501" elapsed="0.000119"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.567280" 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-28T21:04:15.567172" 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-28T21:04:15.567398" elapsed="0.000117"/>
</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-28T21:04:15.567599" elapsed="0.000125"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.566720" elapsed="0.001052"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.568429" 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-28T21:04:15.568323" elapsed="0.000141"/>
</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-28T21:04:15.568547" elapsed="0.000115"/>
</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-28T21:04:15.568744" elapsed="0.001371"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.567865" elapsed="0.002300"/>
</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-28T21:04:15.570728" elapsed="0.000163"/>
</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-28T21:04:15.570975" elapsed="0.000136"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.571333" 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-28T21:04:15.571195" elapsed="0.000180"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.571547" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.571602" 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-28T21:04:15.571460" 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-28T21:04:15.571700" elapsed="0.000173"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.570268" elapsed="0.001651"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.565879" elapsed="0.006076"/>
</kw>
<var name="${index_price}">{'s': 'bnb_usdt', 'p': '599.36', 't': 1776061637754}</var>
<status status="PASS" start="2026-05-28T21:04:15.565786" elapsed="0.006188"/>
</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-28T21:04:15.572339" 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-28T21:04:15.572551" 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-28T21:04:15.572747" elapsed="0.000107"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.573436" 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-28T21:04:15.573341" elapsed="0.000125"/>
</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-28T21:04:15.573538" elapsed="0.000103"/>
</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-28T21:04:15.573714" elapsed="0.000109"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.572945" elapsed="0.000920"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.574445" 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-28T21:04:15.574350" elapsed="0.000126"/>
</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-28T21:04:15.574548" 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-28T21:04:15.574725" elapsed="0.000114"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.573949" elapsed="0.000932"/>
</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-28T21:04:15.575369" 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-28T21:04:15.575591" elapsed="0.000121"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.575904" 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-28T21:04:15.575787" elapsed="0.000134"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.576071" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.576118" 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-28T21:04:15.575996" elapsed="0.000138"/>
</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-28T21:04:15.576205" elapsed="0.000153"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.574971" elapsed="0.001428"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.572132" elapsed="0.004300"/>
</kw>
<var name="${index_price}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-05-28T21:04:15.572042" elapsed="0.004409"/>
</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-28T21:04:15.576772" elapsed="0.000109"/>
</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-28T21:04:15.576957" elapsed="0.000099"/>
</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-28T21:04:15.577126" elapsed="0.000095"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.577818" 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-28T21:04:15.577733" elapsed="0.000114"/>
</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-28T21:04:15.577912" elapsed="0.000091"/>
</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-28T21:04:15.578069" elapsed="0.000097"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.577301" elapsed="0.000903"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.578745" 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-28T21:04:15.578659" elapsed="0.000115"/>
</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-28T21:04:15.578838" elapsed="0.000092"/>
</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-28T21:04:15.578996" elapsed="0.000100"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.578296" elapsed="0.000839"/>
</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-28T21:04:15.579572" elapsed="0.000128"/>
</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-28T21:04:15.579768" elapsed="0.000107"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.580050" level="INFO">${timestamp_str} = 1779973454799</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:15.579943" elapsed="0.000123"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.580209" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.580253" 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-28T21:04:15.580139" 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-28T21:04:15.580332" elapsed="0.000137"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.579217" elapsed="0.001290"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.576588" elapsed="0.003947"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '73489.55', 't': 1779973454799}</var>
<status status="PASS" start="2026-05-28T21:04:15.576506" elapsed="0.004045"/>
</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-28T21:04:15.580844" elapsed="0.000098"/>
</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-28T21:04:15.581010" elapsed="0.000101"/>
</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-28T21:04:15.581178" elapsed="0.000097"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.581804" 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-28T21:04:15.581713" elapsed="0.000119"/>
</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-28T21:04:15.581896" elapsed="0.000091"/>
</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-28T21:04:15.582053" elapsed="0.000097"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.581358" elapsed="0.000830"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.582716" 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-28T21:04:15.582629" elapsed="0.000115"/>
</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-28T21:04:15.582808" 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-28T21:04:15.582966" elapsed="0.000100"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.582262" 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-28T21:04:15.583543" elapsed="0.000128"/>
</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-28T21:04:15.583738" elapsed="0.000107"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.584019" 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-28T21:04:15.583912" elapsed="0.000123"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.584170" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.584294" 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-28T21:04:15.584100" elapsed="0.000209"/>
</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-28T21:04:15.584374" elapsed="0.000139"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.583184" elapsed="0.001366"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.580678" elapsed="0.003902"/>
</kw>
<var name="${index_price}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-05-28T21:04:15.580603" elapsed="0.003992"/>
</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-28T21:04:15.584906" elapsed="0.000101"/>
</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-28T21:04:15.585075" elapsed="0.000099"/>
</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-28T21:04:15.585242" elapsed="0.000096"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.585856" 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-28T21:04:15.585776" elapsed="0.000106"/>
</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-28T21:04:15.585943" elapsed="0.000083"/>
</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-28T21:04:15.586087" elapsed="0.000089"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.585420" elapsed="0.000791"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.586687" 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-28T21:04:15.586608" elapsed="0.000105"/>
</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-28T21:04:15.586771" elapsed="0.000084"/>
</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-28T21:04:15.586918" elapsed="0.000091"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.586279" elapsed="0.000766"/>
</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-28T21:04:15.587449" elapsed="0.000116"/>
</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-28T21:04:15.587628" elapsed="0.000098"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.587887" 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-28T21:04:15.587789" elapsed="0.000112"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.588027" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.588070" 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-28T21:04:15.587963" elapsed="0.000120"/>
</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-28T21:04:15.588141" elapsed="0.000125"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.587118" elapsed="0.001182"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.584723" elapsed="0.003604"/>
</kw>
<var name="${index_price}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-05-28T21:04:15.584646" elapsed="0.003695"/>
</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-28T21:04:15.588607" elapsed="0.000089"/>
</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-28T21:04:15.588759" elapsed="0.000087"/>
</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-28T21:04:15.588907" elapsed="0.000088"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.589477" 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-28T21:04:15.589398" elapsed="0.000104"/>
</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-28T21:04:15.589561" elapsed="0.000083"/>
</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-28T21:04:15.589703" elapsed="0.000089"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.589069" elapsed="0.000757"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.590354" 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-28T21:04:15.590278" elapsed="0.000100"/>
</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-28T21:04:15.590434" elapsed="0.000078"/>
</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-28T21:04:15.590567" elapsed="0.000085"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.589893" elapsed="0.000792"/>
</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-28T21:04:15.591063" elapsed="0.000109"/>
</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-28T21:04:15.591244" elapsed="0.000092"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.591484" 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-28T21:04:15.591393" elapsed="0.000104"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.591612" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.591649" 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-28T21:04:15.591553" elapsed="0.000109"/>
</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-28T21:04:15.591716" elapsed="0.000118"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.590752" elapsed="0.001114"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.588456" elapsed="0.003434"/>
</kw>
<var name="${index_price}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-05-28T21:04:15.588386" elapsed="0.003518"/>
</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-28T21:04:15.592150" elapsed="0.000084"/>
</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-28T21:04:15.592293" elapsed="0.000085"/>
</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-28T21:04:15.592436" elapsed="0.000082"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.592959" 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-28T21:04:15.592886" elapsed="0.000097"/>
</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-28T21:04:15.593037" elapsed="0.000077"/>
</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-28T21:04:15.593170" elapsed="0.000083"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.592585" elapsed="0.000700"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.593725" 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-28T21:04:15.593653" elapsed="0.000095"/>
</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-28T21:04:15.593802" elapsed="0.000078"/>
</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-28T21:04:15.593935" elapsed="0.000084"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.593350" elapsed="0.000701"/>
</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-28T21:04:15.594424" 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-28T21:04:15.594588" elapsed="0.000090"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.594826" level="INFO">${timestamp_str} = 1779973454808</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:15.594735" elapsed="0.000105"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.594954" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.594992" 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-28T21:04:15.594895" elapsed="0.000109"/>
</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-28T21:04:15.595058" elapsed="0.000113"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.594119" elapsed="0.001083"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.592010" elapsed="0.003216"/>
</kw>
<var name="${index_price}">{'s': 'doge_usdt', 'p': '0.09828', 't': 1779973454808}</var>
<status status="PASS" start="2026-05-28T21:04:15.591947" elapsed="0.003293"/>
</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-28T21:04:15.595487" elapsed="0.000082"/>
</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-28T21:04:15.595626" elapsed="0.000082"/>
</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-28T21:04:15.595768" elapsed="0.000147"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.596366" 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-28T21:04:15.596292" elapsed="0.000097"/>
</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-28T21:04:15.596444" elapsed="0.000078"/>
</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-28T21:04:15.596589" elapsed="0.000083"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.595985" elapsed="0.000720"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.597143" 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-28T21:04:15.597070" 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-28T21:04:15.597221" elapsed="0.000078"/>
</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-28T21:04:15.597356" elapsed="0.000085"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.596768" elapsed="0.000706"/>
</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-28T21:04:15.597850" elapsed="0.000108"/>
</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-28T21:04:15.598015" elapsed="0.000092"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.598256" 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-28T21:04:15.598165" elapsed="0.000105"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.598391" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.598428" 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-28T21:04:15.598326" elapsed="0.000114"/>
</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-28T21:04:15.598495" elapsed="0.000114"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.597544" elapsed="0.001095"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.595345" elapsed="0.003316"/>
</kw>
<var name="${index_price}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-05-28T21:04:15.595283" elapsed="0.003392"/>
</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-28T21:04:15.598906" 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-28T21:04:15.599037" 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-28T21:04:15.599167" elapsed="0.000076"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.599660" 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-28T21:04:15.599591" elapsed="0.000091"/>
</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-28T21:04:15.599733" elapsed="0.000073"/>
</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-28T21:04:15.599862" elapsed="0.000077"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.599307" elapsed="0.000662"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.600373" 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-28T21:04:15.600306" 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-28T21:04:15.600446" elapsed="0.000073"/>
</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-28T21:04:15.600577" elapsed="0.000079"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.600027" 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-28T21:04:15.601034" elapsed="0.000160"/>
</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-28T21:04:15.601248" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.601472" 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-28T21:04:15.601386" elapsed="0.000098"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.601592" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.601627" 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-28T21:04:15.601537" elapsed="0.000101"/>
</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-28T21:04:15.601690" elapsed="0.000108"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.600752" elapsed="0.001088"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.598774" elapsed="0.003089"/>
</kw>
<var name="${index_price}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-05-28T21:04:15.598715" elapsed="0.003161"/>
</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-28T21:04:15.602109" elapsed="0.000076"/>
</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-28T21:04:15.602240" 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-28T21:04:15.602377" elapsed="0.000078"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.602875" 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-28T21:04:15.602806" elapsed="0.000091"/>
</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-28T21:04:15.602951" 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-28T21:04:15.603067" elapsed="0.000070"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.602520" elapsed="0.000645"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.603542" 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-28T21:04:15.603479" 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-28T21:04:15.603610" elapsed="0.000067"/>
</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-28T21:04:15.603725" elapsed="0.000071"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.603218" elapsed="0.000606"/>
</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-28T21:04:15.604141" elapsed="0.000092"/>
</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-28T21:04:15.604283" elapsed="0.000077"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.604486" level="INFO">${timestamp_str} = 1779973454795</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:15.604408" elapsed="0.000089"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.604594" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.604626" 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-28T21:04:15.604544" elapsed="0.000093"/>
</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-28T21:04:15.604684" elapsed="0.000098"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.603882" elapsed="0.000927"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.601975" elapsed="0.002854"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdc', 'p': '73530.643', 't': 1779973454795}</var>
<status status="PASS" start="2026-05-28T21:04:15.601916" elapsed="0.002925"/>
</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-28T21:04:15.605052" elapsed="0.000071"/>
</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-28T21:04:15.605172" elapsed="0.000070"/>
</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-28T21:04:15.605290" elapsed="0.000070"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.605742" 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-28T21:04:15.605680" elapsed="0.000081"/>
</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-28T21:04:15.605809" elapsed="0.000066"/>
</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-28T21:04:15.605922" elapsed="0.000124"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.605418" elapsed="0.000656"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.606454" 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-28T21:04:15.606394" elapsed="0.000081"/>
</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-28T21:04:15.606522" elapsed="0.000067"/>
</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-28T21:04:15.606637" elapsed="0.000072"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.606128" elapsed="0.000623"/>
</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-28T21:04:15.607064" elapsed="0.000088"/>
</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-28T21:04:15.607198" elapsed="0.000076"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.607397" 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-28T21:04:15.607321" elapsed="0.000088"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.607504" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.607535" 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-28T21:04:15.607455" elapsed="0.000090"/>
</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-28T21:04:15.607590" elapsed="0.000096"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.606809" elapsed="0.000903"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.604930" elapsed="0.002802"/>
</kw>
<var name="${index_price}">{'s': 'xaut_usdt', 'p': '4543.7984', 't': 1779095550280}</var>
<status status="PASS" start="2026-05-28T21:04:15.604877" elapsed="0.002866"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-05-28T21:04:15.538099" elapsed="0.069656"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.535795" elapsed="0.071982"/>
</kw>
<doc>测试获取所有期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:15.169709" elapsed="0.438123"/>
</test>
<test id="s1-s2-s2-s3-t2" name="获取期货U本位单个指数价格" line="16">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.608648" 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-28T21:04:15.608573" elapsed="0.000087"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.609359" 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-28T21:04:15.609069" elapsed="0.000303"/>
</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-28T21:04:15.609657" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.609427" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.609419" elapsed="0.000274"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:15.609707" elapsed="0.000014"/>
</return>
<msg time="2026-05-28T21:04:15.609793" 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-28T21:04:15.608744" elapsed="0.001061"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:15.742978" 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-28T21:04:15.743197" 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 13: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': '7610d19e08b055253512af8ebd2baf15', 'X-Transparent': '00-7610d19e08b055253512af8ebd2baf15-1d44b6c0e7f4463a-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': 'a02d76d1ea441fbe-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"s":"btc_usdt","p":"73489.55","t":1779973454799}],"ts":1779973455724} 
 </msg>
<msg time="2026-05-28T21:04:15.743303" 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-28T21:04:15.743539" 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-28T21:04:15.610051" elapsed="0.133525"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:15.743759" elapsed="0.000078"/>
</return>
<msg time="2026-05-28T21:04:15.744050" 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-28T21:04:15.609869" elapsed="0.134209"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.745580" 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-28T21:04:15.744894" elapsed="0.000774"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.746402" 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-28T21:04:15.745826" elapsed="0.000604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.746710" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:15.746560" elapsed="0.000200"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:15.744414" elapsed="0.002410"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.748436" 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-28T21:04:15.747802" elapsed="0.000700"/>
</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-28T21:04:15.748646" elapsed="0.000336"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-05-28T21:04:15.747017" elapsed="0.002034"/>
</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-28T21:04:15.749997" elapsed="0.000240"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.750864" 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-28T21:04:15.750340" elapsed="0.000567"/>
</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-28T21:04:15.751575" elapsed="0.000159"/>
</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-28T21:04:15.751865" elapsed="0.000141"/>
</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-28T21:04:15.752114" elapsed="0.000144"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.753098" 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-28T21:04:15.752968" elapsed="0.000174"/>
</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-28T21:04:15.753246" elapsed="0.000135"/>
</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-28T21:04:15.753482" elapsed="0.000145"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.752385" elapsed="0.001300"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.754677" 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-28T21:04:15.754495" elapsed="0.000245"/>
</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-28T21:04:15.754855" elapsed="0.000160"/>
</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-28T21:04:15.755131" elapsed="0.000187"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.753801" elapsed="0.001589"/>
</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-28T21:04:15.756218" elapsed="0.000228"/>
</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-28T21:04:15.756563" elapsed="0.000190"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.757058" level="INFO">${timestamp_str} = 1779973454799</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:15.756866" elapsed="0.000221"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.757327" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:15.757404" 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-28T21:04:15.757204" elapsed="0.000226"/>
</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-28T21:04:15.757542" elapsed="0.000245"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.755551" elapsed="0.002304"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T21:04:15.751299" elapsed="0.006615"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '73489.55', 't': 1779973454799}</var>
<status status="PASS" start="2026-05-28T21:04:15.751166" elapsed="0.006808"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-05-28T21:04:15.750982" elapsed="0.007024"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.749271" elapsed="0.008794"/>
</kw>
<kw name="验证单个指数价格符号">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.758914" level="INFO">Length is 1.</msg>
<msg time="2026-05-28T21:04:15.758983" 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-28T21:04:15.758811" elapsed="0.000193"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.759244" 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-28T21:04:15.759102" elapsed="0.000198"/>
</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-28T21:04:15.759411" elapsed="0.000490"/>
</kw>
<arg>${response.json()['data']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-05-28T21:04:15.758203" elapsed="0.001757"/>
</kw>
<doc>测试获取单个期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:15.607922" elapsed="0.152149"/>
</test>
<test id="s1-s2-s2-s3-t3" name="获取期货U本位符号指数价格_BTC" line="27">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.761696" 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-28T21:04:15.761542" elapsed="0.000180"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.763182" 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-28T21:04:15.762580" elapsed="0.000629"/>
</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-28T21:04:15.763803" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.763330" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.763312" elapsed="0.000567"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:15.763908" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T21:04:15.764086" 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-28T21:04:15.761899" elapsed="0.002211"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:15.899934" 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-28T21:04:15.900263" 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 13: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': '66a5fd86ebdad5b5d67c61051a64719f', 'X-Transparent': '00-66a5fd86ebdad5b5d67c61051a64719f-93e25293ac49acec-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': 'a02d76d2eae91fbe-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"73489.55","t":1779973455825},"ts":1779973455881} 
 </msg>
<msg time="2026-05-28T21:04:15.900424" 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-28T21:04:15.900745" 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-28T21:04:15.764629" elapsed="0.136177"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:15.900988" elapsed="0.000100"/>
</return>
<msg time="2026-05-28T21:04:15.901428" 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-28T21:04:15.764237" elapsed="0.137243"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.903916" 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-28T21:04:15.902769" elapsed="0.001293"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.905398" 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-28T21:04:15.904336" elapsed="0.001115"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.905969" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:15.905696" elapsed="0.000364"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:15.902022" elapsed="0.004160"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.907523" level="INFO">${data} = {'s': 'btc_usdt', 'p': '73489.55', 't': 1779973455825}</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-28T21:04:15.906417" elapsed="0.001167"/>
</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-28T21:04:15.908563" elapsed="0.000356"/>
</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-28T21:04:15.909100" elapsed="0.000231"/>
</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-28T21:04:15.909500" elapsed="0.000228"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T21:04:15.907953" elapsed="0.001871"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.911374" 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-28T21:04:15.911146" elapsed="0.000299"/>
</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-28T21:04:15.911616" elapsed="0.000225"/>
</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-28T21:04:15.912013" elapsed="0.000310"/>
</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-28T21:04:15.912507" elapsed="0.000247"/>
</kw>
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-05-28T21:04:15.910058" elapsed="0.002790"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.914025" 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-28T21:04:15.913868" 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-28T21:04:15.914201" elapsed="0.000170"/>
</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-28T21:04:15.914504" elapsed="0.000197"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:15.913052" elapsed="0.001724"/>
</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-28T21:04:15.914905" elapsed="0.000711"/>
</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-28T21:04:15.915753" elapsed="0.000339"/>
</kw>
<doc>测试获取BTC期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:15.760241" elapsed="0.156046"/>
</test>
<test id="s1-s2-s2-s3-t4" name="获取期货U本位符号指数价格_ETH" line="41">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.918691" 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-28T21:04:15.918454" elapsed="0.000268"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:15.920548" 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-28T21:04:15.919808" elapsed="0.000772"/>
</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-28T21:04:15.921374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:15.920769" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:15.920726" elapsed="0.000750"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:15.921518" elapsed="0.000041"/>
</return>
<msg time="2026-05-28T21:04:15.921785" 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-28T21:04:15.918981" elapsed="0.002836"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:16.059926" 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-28T21:04:16.060350" 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 13: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': '6eb7c7c06cd6edd90d372c68cbcf6df6', 'X-Transparent': '00-6eb7c7c06cd6edd90d372c68cbcf6df6-feb5093c62335e76-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': 'a02d76d3db9b1fbe-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"1992.19","t":1779973455828},"ts":1779973456037} 
 </msg>
<msg time="2026-05-28T21:04:16.060546" 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-28T21:04:16.061010" 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-28T21:04:15.922618" elapsed="0.138463"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:16.061342" elapsed="0.000159"/>
</return>
<msg time="2026-05-28T21:04:16.061948" 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-28T21:04:15.921972" elapsed="0.140032"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.064862" 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-28T21:04:16.063597" elapsed="0.001412"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.066310" 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-28T21:04:16.065264" elapsed="0.001098"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.066929" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:16.066643" elapsed="0.000380"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:16.062670" elapsed="0.004476"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.068385" level="INFO">${data} = {'s': 'eth_usdt', 'p': '1992.19', 't': 1779973455828}</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-28T21:04:16.067379" elapsed="0.001046"/>
</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-28T21:04:16.069153" elapsed="0.000309"/>
</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-28T21:04:16.069628" elapsed="0.000240"/>
</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-28T21:04:16.070040" elapsed="0.000232"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T21:04:16.068713" elapsed="0.001656"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.071909" 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-28T21:04:16.071681" elapsed="0.000300"/>
</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-28T21:04:16.072153" elapsed="0.000218"/>
</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-28T21:04:16.072520" elapsed="0.000259"/>
</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-28T21:04:16.072917" elapsed="0.000218"/>
</kw>
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<status status="PASS" start="2026-05-28T21:04:16.070591" elapsed="0.002621"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.074352" 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-28T21:04:16.074190" elapsed="0.000217"/>
</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-28T21:04:16.074613" elapsed="0.000175"/>
</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-28T21:04:16.074917" elapsed="0.000198"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:16.073384" elapsed="0.001806"/>
</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-28T21:04:16.075324" elapsed="0.000715"/>
</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-28T21:04:16.076173" elapsed="0.000342"/>
</kw>
<doc>测试获取ETH期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:15.916598" elapsed="0.160108"/>
</test>
<test id="s1-s2-s2-s3-t5" name="获取期货U本位符号指数价格_SOL" line="55">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.079004" 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-28T21:04:16.078740" elapsed="0.000295"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.080960" 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-28T21:04:16.080228" elapsed="0.000764"/>
</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-28T21:04:16.081715" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.081154" elapsed="0.000621"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:16.081123" elapsed="0.000685"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:16.081846" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T21:04:16.082044" 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-28T21:04:16.079317" elapsed="0.002752"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:16.219240" 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-28T21:04:16.219620" 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 13: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': '089763c7712ebed03a9cc6bc4f98074e', 'X-Transparent': '00-089763c7712ebed03a9cc6bc4f98074e-413623359be21fd5-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': 'a02d76d4dc5d1fbe-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"sol_usdt","p":"81.21","t":1779973455830},"ts":1779973456199} 
 </msg>
<msg time="2026-05-28T21:04:16.219793" 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-28T21:04:16.220191" 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-28T21:04:16.082942" elapsed="0.137312"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:16.220475" elapsed="0.000127"/>
</return>
<msg time="2026-05-28T21:04:16.220975" 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-28T21:04:16.082223" elapsed="0.138805"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.223570" 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-28T21:04:16.222385" elapsed="0.001327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.225011" 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-28T21:04:16.223978" elapsed="0.001182"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.225690" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:16.225402" elapsed="0.000380"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:16.221582" elapsed="0.004316"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.227234" level="INFO">${data} = {'s': 'sol_usdt', 'p': '81.21', 't': 1779973455830}</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-28T21:04:16.226127" elapsed="0.001162"/>
</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-28T21:04:16.228041" elapsed="0.000302"/>
</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-28T21:04:16.228520" 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-28T21:04:16.228914" elapsed="0.000218"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T21:04:16.227610" elapsed="0.001622"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.230735" 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-28T21:04:16.230519" elapsed="0.000287"/>
</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-28T21:04:16.230978" elapsed="0.000229"/>
</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-28T21:04:16.231388" elapsed="0.000295"/>
</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-28T21:04:16.231823" elapsed="0.000199"/>
</kw>
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<status status="PASS" start="2026-05-28T21:04:16.229444" elapsed="0.002658"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.233208" 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-28T21:04:16.233055" elapsed="0.000207"/>
</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-28T21:04:16.233388" elapsed="0.000172"/>
</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-28T21:04:16.233688" elapsed="0.000201"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T21:04:16.232267" elapsed="0.001699"/>
</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-28T21:04:16.234105" elapsed="0.000728"/>
</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-28T21:04:16.234972" elapsed="0.000345"/>
</kw>
<doc>测试获取SOL期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:16.076994" elapsed="0.158537"/>
</test>
<test id="s1-s2-s2-s3-t6" name="获取期货U本位符号指数价格_无效交易对" line="69">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.238174" 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-28T21:04:16.237940" elapsed="0.000262"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.240110" 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-28T21:04:16.239376" elapsed="0.000761"/>
</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-28T21:04:16.240853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.240298" elapsed="0.000614"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:16.240266" elapsed="0.000676"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:16.240987" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T21:04:16.241185" 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-28T21:04:16.238476" elapsed="0.002733"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:16.377597" 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-28T21:04:16.378119" 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 13: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': '2dd637f633f8c0c17d306dc266cc98b1', 'X-Transparent': '00-2dd637f633f8c0c17d306dc266cc98b1-e372c9fdcfe62628-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': 'a02d76d5ed171fbe-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779973456358} 
 </msg>
<msg time="2026-05-28T21:04:16.378306" 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-28T21:04:16.378684" 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-28T21:04:16.241982" elapsed="0.136770"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:16.378999" elapsed="0.000149"/>
</return>
<msg time="2026-05-28T21:04:16.379538" 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-28T21:04:16.241349" elapsed="0.138242"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.381592" 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-28T21:04:16.380102" elapsed="0.001637"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.383275" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': []}, 'data': None, 'ts': 1779973456358}</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-28T21:04:16.382050" elapsed="0.001286"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.384424" 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-28T21:04:16.383581" elapsed="0.000931"/>
</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-28T21:04:16.384708" elapsed="0.000821"/>
</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-28T21:04:16.385716" elapsed="0.000832"/>
</kw>
<doc>测试获取无效交易对的符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:16.235836" elapsed="0.151007"/>
</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-28T21:04:16.392980" 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-28T21:04:16.391867" elapsed="0.001151"/>
</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-28T21:04:16.394009" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.393242" elapsed="0.000854"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:16.393201" elapsed="0.000937"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:16.394186" elapsed="0.000041"/>
</return>
<msg time="2026-05-28T21:04:16.394466" 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-28T21:04:16.390540" elapsed="0.003961"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:16.574198" 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-28T21:04:16.574798" 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 13: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': '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': 'c6a0e9d77bd256237b63db736944fdfc', 'X-Transparent': '00-c6a0e9d77bd256237b63db736944fdfc-9deb93a959b4d2f9-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': 'a02d76d6ddfc1fbe-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779973456511} 
 </msg>
<msg time="2026-05-28T21:04:16.574998" 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-28T21:04:16.575379" 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-28T21:04:16.395661" elapsed="0.179783"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:16.575686" elapsed="0.000168"/>
</return>
<msg time="2026-05-28T21:04:16.576272" 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-28T21:04:16.394723" elapsed="0.181604"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.578389" 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-28T21:04:16.576844" elapsed="0.001692"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.580069" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': ['symbol']}, 'data': None, 'ts': 1779973456511}</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-28T21:04:16.578852" elapsed="0.001280"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.581302" 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-28T21:04:16.580386" elapsed="0.001013"/>
</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-28T21:04:16.581612" elapsed="0.000808"/>
</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-28T21:04:16.582611" elapsed="0.000845"/>
</kw>
<doc>测试缺少symbol参数的符号指数价格请求</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:16.387325" elapsed="0.196445"/>
</test>
<doc>期货U本位指数价格接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:15.152916" elapsed="1.431566"/>
</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-28T21:04:16.594200" 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-28T21:04:16.593991" elapsed="0.000236"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.594682" 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-28T21:04:16.594555" elapsed="0.000169"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:16.594329" elapsed="0.000426"/>
</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-28T21:04:16.594876" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.594785" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:16.594300" elapsed="0.000642"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.595616" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:16.595507" 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-28T21:04:16.595874" 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-28T21:04:16.595985" 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-28T21:04:16.596091" 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-28T21:04:16.596199" 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-28T21:04:16.596342" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.595720" elapsed="0.000666"/>
</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-28T21:04:16.596538" 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-28T21:04:16.596645" 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-28T21:04:16.596756" 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-28T21:04:16.596863" 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-28T21:04:16.596971" 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-28T21:04:16.597079" 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-28T21:04:16.597180" 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-28T21:04:16.597282" elapsed="0.000014"/>
</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-28T21:04:16.597393" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.596407" elapsed="0.001033"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.597951" 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-28T21:04:16.597631" elapsed="0.000373"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.598377" 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-28T21:04:16.598141" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.598780" 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-28T21:04:16.598543" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.599171" 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-28T21:04:16.598938" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.599568" 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-28T21:04:16.599329" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.599956" 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-28T21:04:16.599724" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.600366" 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-28T21:04:16.600116" elapsed="0.000292"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.600769" 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-28T21:04:16.600523" elapsed="0.000288"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.601178" 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-28T21:04:16.600928" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:16.597461" elapsed="0.003806"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:16.595705" elapsed="0.005589"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.601592" 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-28T21:04:16.601405" elapsed="0.000239"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:16.602254" 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-28T21:04:16.601771" elapsed="0.000683"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:16.595269" elapsed="0.007264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:16.602746" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:16.602650" elapsed="0.000142"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:16.593698" elapsed="0.009153"/>
</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-28T21:04:16.605957" 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-28T21:04:16.605256" elapsed="0.000754"/>
</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-28T21:04:16.606612" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:16.606136" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:16.606117" elapsed="0.000576"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:16.606721" elapsed="0.000029"/>
</return>
<msg time="2026-05-28T21:04:16.606905" 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-28T21:04:16.604418" elapsed="0.002511"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:17.098958" 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-28T21:04:17.099391" 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 13: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': '07a136dfbf1df71aefaf912156bd412a', 'X-Transparent': '00-07a136dfbf1df71aefaf912156bd412a-2b37090ad653ba1b-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': 'a02d76d91b1420fc-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":1779973456875},{"s":"sol_usdt","p":"85.15","t":1779973456867},{"s":"bnb_usdt","p":"2085","t":1779973456875},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"73582.12","t":1779973456862},{"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.09824","t":1779973456871},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"73530.643","t":1779973456848},{"s":"xaut_usdt","p":"4543.7984","t":1779095550280}],"ts":1779973457032} 
 </msg>
<msg time="2026-05-28T21:04:17.099662" 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-28T21:04:17.100111" 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-28T21:04:16.607688" elapsed="0.492497"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:17.100406" elapsed="0.000131"/>
</return>
<msg time="2026-05-28T21:04:17.100958" 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-28T21:04:16.607065" elapsed="0.493955"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.103702" 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-28T21:04:17.102463" elapsed="0.001397"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.105228" 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-28T21:04:17.104149" elapsed="0.001126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.105727" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:17.105492" elapsed="0.000307"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:17.101594" elapsed="0.004299"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.106999" 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': 1779973456875}, {'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-28T21:04:17.106074" elapsed="0.000972"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.107512" 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-28T21:04:17.107235" elapsed="0.000355"/>
</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-28T21:04:17.107901" elapsed="0.000465"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.108745" level="INFO">Length is 15.</msg>
<msg time="2026-05-28T21:04:17.108871" 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-28T21:04:17.108557" elapsed="0.000359"/>
</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-28T21:04:17.109077" elapsed="0.000248"/>
</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-28T21:04:17.110701" elapsed="0.000334"/>
</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-28T21:04:17.111190" elapsed="0.000616"/>
</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-28T21:04:17.111959" elapsed="0.000212"/>
</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-28T21:04:17.112307" elapsed="0.000189"/>
</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-28T21:04:17.113069" elapsed="0.000186"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.113538" 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-28T21:04:17.113390" elapsed="0.000196"/>
</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-28T21:04:17.113710" elapsed="0.000177"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.112689" elapsed="0.001273"/>
</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-28T21:04:17.114462" elapsed="0.000172"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.114898" 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-28T21:04:17.114751" elapsed="0.000194"/>
</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-28T21:04:17.115067" elapsed="0.000186"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.115586" 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-28T21:04:17.115379" elapsed="0.000237"/>
</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-28T21:04:17.115733" elapsed="0.000209"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.114136" elapsed="0.001875"/>
</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-28T21:04:17.116503" elapsed="0.000264"/>
</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-28T21:04:17.116891" elapsed="0.000207"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.117446" 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-28T21:04:17.117231" elapsed="0.000249"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.117699" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.117769" 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-28T21:04:17.117586" elapsed="0.000207"/>
</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-28T21:04:17.117898" elapsed="0.000250"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.116186" elapsed="0.002026"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.110353" elapsed="0.007911"/>
</kw>
<var name="${mark_price_item}">{'s': 'trb_usdt', 'p': '44.994', 't': 1776061641025}</var>
<status status="PASS" start="2026-05-28T21:04:17.110165" elapsed="0.008129"/>
</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-28T21:04:17.118838" elapsed="0.000251"/>
</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-28T21:04:17.119216" elapsed="0.000203"/>
</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-28T21:04:17.119530" elapsed="0.000172"/>
</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-28T21:04:17.119813" elapsed="0.000162"/>
</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-28T21:04:17.120542" elapsed="0.000145"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.120920" 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-28T21:04:17.120785" elapsed="0.000179"/>
</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-28T21:04:17.121061" elapsed="0.000151"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.120222" elapsed="0.001049"/>
</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-28T21:04:17.121645" elapsed="0.000340"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.122211" 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-28T21:04:17.122085" elapsed="0.000163"/>
</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-28T21:04:17.122342" elapsed="0.000144"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.122782" 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-28T21:04:17.122593" elapsed="0.000210"/>
</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-28T21:04:17.122904" elapsed="0.000174"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.121405" elapsed="0.001729"/>
</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-28T21:04:17.123520" elapsed="0.000226"/>
</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-28T21:04:17.123853" elapsed="0.000177"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.124286" 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-28T21:04:17.124127" elapsed="0.000185"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.124521" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.124584" 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-28T21:04:17.124406" elapsed="0.000197"/>
</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-28T21:04:17.124691" elapsed="0.000200"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.123273" elapsed="0.001674"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.118554" elapsed="0.006438"/>
</kw>
<var name="${mark_price_item}">{'s': 'xrp_usdt', 'p': '1.8795', 't': 1744189287376}</var>
<status status="PASS" start="2026-05-28T21:04:17.118408" elapsed="0.006611"/>
</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-28T21:04:17.125487" elapsed="0.000322"/>
</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-28T21:04:17.125947" elapsed="0.000196"/>
</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-28T21:04:17.126262" elapsed="0.000179"/>
</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-28T21:04:17.126560" elapsed="0.000177"/>
</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-28T21:04:17.127199" elapsed="0.000161"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.127625" 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-28T21:04:17.127475" elapsed="0.000199"/>
</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-28T21:04:17.127791" elapsed="0.000173"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.126892" elapsed="0.001138"/>
</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-28T21:04:17.128471" elapsed="0.000159"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.128888" 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-28T21:04:17.128743" elapsed="0.000192"/>
</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-28T21:04:17.129048" elapsed="0.000178"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.129593" 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-28T21:04:17.129391" elapsed="0.000230"/>
</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-28T21:04:17.129737" elapsed="0.000190"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.128177" elapsed="0.001804"/>
</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-28T21:04:17.130356" elapsed="0.000188"/>
</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-28T21:04:17.130643" elapsed="0.000160"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.131064" level="INFO">${timestamp_str} = 1779973456875</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.130903" elapsed="0.000185"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.131286" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.131349" 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-28T21:04:17.131185" elapsed="0.000185"/>
</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-28T21:04:17.131464" elapsed="0.000204"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.130104" elapsed="0.001620"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.125238" elapsed="0.006532"/>
</kw>
<var name="${mark_price_item}">{'s': 'eth_usdt', 'p': '76000', 't': 1779973456875}</var>
<status status="PASS" start="2026-05-28T21:04:17.125115" elapsed="0.006682"/>
</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-28T21:04:17.132402" elapsed="0.000190"/>
</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-28T21:04:17.132692" 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-28T21:04:17.132945" elapsed="0.000148"/>
</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-28T21:04:17.133190" elapsed="0.000148"/>
</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-28T21:04:17.133711" elapsed="0.000134"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.134065" 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-28T21:04:17.133941" elapsed="0.000164"/>
</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-28T21:04:17.134200" elapsed="0.000141"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.133460" elapsed="0.000936"/>
</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-28T21:04:17.134762" elapsed="0.000133"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.135111" 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-28T21:04:17.134991" elapsed="0.000159"/>
</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-28T21:04:17.135246" elapsed="0.000145"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.135656" 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-28T21:04:17.135494" elapsed="0.000186"/>
</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-28T21:04:17.135774" elapsed="0.000155"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.134517" elapsed="0.001465"/>
</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-28T21:04:17.136352" 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-28T21:04:17.136639" elapsed="0.000157"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.137049" level="INFO">${timestamp_str} = 1779973456867</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.136895" elapsed="0.000178"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.137271" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.137335" 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-28T21:04:17.137169" elapsed="0.000187"/>
</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-28T21:04:17.137448" elapsed="0.000204"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.136104" elapsed="0.001626"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.132006" elapsed="0.005770"/>
</kw>
<var name="${mark_price_item}">{'s': 'sol_usdt', 'p': '85.15', 't': 1779973456867}</var>
<status status="PASS" start="2026-05-28T21:04:17.131888" elapsed="0.005915"/>
</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-28T21:04:17.138220" elapsed="0.000162"/>
</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-28T21:04:17.138465" elapsed="0.000130"/>
</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-28T21:04:17.138679" elapsed="0.000128"/>
</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-28T21:04:17.138891" elapsed="0.000127"/>
</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-28T21:04:17.139339" elapsed="0.000115"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.139641" 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-28T21:04:17.139536" elapsed="0.000139"/>
</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-28T21:04:17.139756" elapsed="0.000121"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.139123" elapsed="0.000801"/>
</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-28T21:04:17.140337" elapsed="0.000129"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.140674" 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-28T21:04:17.140565" 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-28T21:04:17.140791" elapsed="0.000140"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.141159" 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-28T21:04:17.141020" elapsed="0.000159"/>
</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-28T21:04:17.141260" elapsed="0.000135"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.140029" elapsed="0.001411"/>
</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-28T21:04:17.141759" elapsed="0.000158"/>
</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-28T21:04:17.142001" elapsed="0.000134"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.142335" level="INFO">${timestamp_str} = 1779973456875</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.142216" elapsed="0.000137"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.142500" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.142548" 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-28T21:04:17.142425" elapsed="0.000139"/>
</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-28T21:04:17.142636" elapsed="0.000154"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.141547" elapsed="0.001285"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.137992" elapsed="0.004875"/>
</kw>
<var name="${mark_price_item}">{'s': 'bnb_usdt', 'p': '2085', 't': 1779973456875}</var>
<status status="PASS" start="2026-05-28T21:04:17.137878" elapsed="0.005008"/>
</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-28T21:04:17.143235" elapsed="0.000141"/>
</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-28T21:04:17.143451" elapsed="0.000115"/>
</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-28T21:04:17.143642" elapsed="0.000110"/>
</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-28T21:04:17.143827" 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-28T21:04:17.144229" elapsed="0.000116"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.144548" 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-28T21:04:17.144420" elapsed="0.000158"/>
</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-28T21:04:17.144652" elapsed="0.000109"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.144034" elapsed="0.000769"/>
</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-28T21:04:17.145083" elapsed="0.000101"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.145352" 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-28T21:04:17.145258" elapsed="0.000124"/>
</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-28T21:04:17.145455" elapsed="0.000113"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.145767" 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-28T21:04:17.145647" elapsed="0.000137"/>
</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-28T21:04:17.145855" elapsed="0.000119"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.144895" elapsed="0.001120"/>
</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-28T21:04:17.146298" elapsed="0.000140"/>
</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-28T21:04:17.146513" elapsed="0.000119"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.146827" 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-28T21:04:17.146707" elapsed="0.000138"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.146992" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.147040" 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-28T21:04:17.146916" 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-28T21:04:17.147126" elapsed="0.000243"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.146108" elapsed="0.001303"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.143039" elapsed="0.004408"/>
</kw>
<var name="${mark_price_item}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-05-28T21:04:17.142945" elapsed="0.004522"/>
</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-28T21:04:17.147795" elapsed="0.000142"/>
</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-28T21:04:17.148010" elapsed="0.000114"/>
</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-28T21:04:17.148200" elapsed="0.000112"/>
</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-28T21:04:17.148385" elapsed="0.000111"/>
</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-28T21:04:17.148792" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.149064" 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-28T21:04:17.148971" elapsed="0.000123"/>
</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-28T21:04:17.149167" elapsed="0.000108"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.148588" elapsed="0.000730"/>
</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-28T21:04:17.149606" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.149876" 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-28T21:04:17.149783" elapsed="0.000123"/>
</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-28T21:04:17.149979" elapsed="0.000111"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.150293" level="INFO">${price_float} = 73582.12</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-28T21:04:17.150168" elapsed="0.000142"/>
</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-28T21:04:17.150381" elapsed="0.000122"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.149413" elapsed="0.001157"/>
</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-28T21:04:17.150853" elapsed="0.000140"/>
</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-28T21:04:17.151061" elapsed="0.000108"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.151346" level="INFO">${timestamp_str} = 1779973456862</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.151238" elapsed="0.000124"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.151497" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.151540" 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-28T21:04:17.151428" elapsed="0.000127"/>
</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-28T21:04:17.151618" elapsed="0.000138"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.150662" elapsed="0.001132"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.147610" elapsed="0.004214"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdt', 'p': '73582.12', 't': 1779973456862}</var>
<status status="PASS" start="2026-05-28T21:04:17.147524" elapsed="0.004319"/>
</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-28T21:04:17.152137" elapsed="0.000127"/>
</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-28T21:04:17.152332" elapsed="0.000106"/>
</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-28T21:04:17.152505" elapsed="0.000100"/>
</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-28T21:04:17.152672" elapsed="0.000097"/>
</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-28T21:04:17.153026" elapsed="0.000161"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.153336" 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-28T21:04:17.153253" elapsed="0.000111"/>
</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-28T21:04:17.153429" elapsed="0.000104"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.152853" elapsed="0.000718"/>
</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-28T21:04:17.153822" elapsed="0.000091"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.154064" 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-28T21:04:17.153979" elapsed="0.000111"/>
</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-28T21:04:17.154156" elapsed="0.000102"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.154441" 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-28T21:04:17.154328" elapsed="0.000128"/>
</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-28T21:04:17.154521" elapsed="0.000108"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.153654" elapsed="0.001011"/>
</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-28T21:04:17.154917" 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-28T21:04:17.155110" elapsed="0.000109"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.155389" 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-28T21:04:17.155287" elapsed="0.000117"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.155526" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.155566" 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-28T21:04:17.155464" elapsed="0.000115"/>
</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-28T21:04:17.155638" elapsed="0.000124"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.154748" elapsed="0.001048"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.151972" elapsed="0.003852"/>
</kw>
<var name="${mark_price_item}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-05-28T21:04:17.151894" elapsed="0.003947"/>
</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-28T21:04:17.156138" elapsed="0.000115"/>
</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-28T21:04:17.156314" elapsed="0.000099"/>
</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-28T21:04:17.156474" elapsed="0.000092"/>
</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-28T21:04:17.156628" elapsed="0.000091"/>
</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-28T21:04:17.156951" elapsed="0.000084"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.157171" 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-28T21:04:17.157094" elapsed="0.000102"/>
</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-28T21:04:17.157255" elapsed="0.000088"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.156795" elapsed="0.000582"/>
</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-28T21:04:17.157611" elapsed="0.000083"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.157828" 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-28T21:04:17.157752" 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-28T21:04:17.157911" elapsed="0.000091"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.158170" 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-28T21:04:17.158068" elapsed="0.000117"/>
</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-28T21:04:17.158243" elapsed="0.000096"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.157452" elapsed="0.000920"/>
</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-28T21:04:17.158603" elapsed="0.000182"/>
</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-28T21:04:17.158847" elapsed="0.000098"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.159104" 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-28T21:04:17.159006" elapsed="0.000112"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.159241" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.159282" 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-28T21:04:17.159177" elapsed="0.000118"/>
</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-28T21:04:17.159353" elapsed="0.000125"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.158448" elapsed="0.001063"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.155986" elapsed="0.003553"/>
</kw>
<var name="${mark_price_item}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-05-28T21:04:17.155915" elapsed="0.003640"/>
</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-28T21:04:17.159827" elapsed="0.000116"/>
</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-28T21:04:17.160004" elapsed="0.000098"/>
</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-28T21:04:17.160165" elapsed="0.000091"/>
</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-28T21:04:17.160318" elapsed="0.000090"/>
</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-28T21:04:17.160640" elapsed="0.000082"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.160861" 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-28T21:04:17.160783" 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-28T21:04:17.160946" elapsed="0.000088"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.160483" elapsed="0.000598"/>
</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-28T21:04:17.161311" elapsed="0.000082"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.161534" 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-28T21:04:17.161453" elapsed="0.000105"/>
</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-28T21:04:17.161618" elapsed="0.000091"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.161872" 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-28T21:04:17.161773" elapsed="0.000114"/>
</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-28T21:04:17.161946" elapsed="0.000096"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.161157" elapsed="0.000919"/>
</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-28T21:04:17.162307" 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-28T21:04:17.162483" elapsed="0.000098"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.162739" 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-28T21:04:17.162643" elapsed="0.000111"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.162876" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.162916" 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-28T21:04:17.162813" elapsed="0.000116"/>
</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-28T21:04:17.162987" elapsed="0.000123"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.162152" elapsed="0.000993"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.159673" elapsed="0.003500"/>
</kw>
<var name="${mark_price_item}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-05-28T21:04:17.159601" elapsed="0.003589"/>
</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-28T21:04:17.163460" elapsed="0.000115"/>
</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-28T21:04:17.163636" elapsed="0.000092"/>
</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-28T21:04:17.163790" elapsed="0.000091"/>
</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-28T21:04:17.163943" elapsed="0.000090"/>
</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-28T21:04:17.164314" elapsed="0.000081"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.164518" 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-28T21:04:17.164449" 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-28T21:04:17.164596" elapsed="0.000080"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.164108" elapsed="0.000601"/>
</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-28T21:04:17.164920" elapsed="0.000077"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.165123" 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-28T21:04:17.165052" elapsed="0.000094"/>
</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-28T21:04:17.165202" elapsed="0.000084"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.165438" level="INFO">${price_float} = 0.09824</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-28T21:04:17.165345" elapsed="0.000106"/>
</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-28T21:04:17.165505" elapsed="0.000097"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.164779" elapsed="0.000853"/>
</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-28T21:04:17.165843" 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-28T21:04:17.166021" elapsed="0.000091"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.166260" level="INFO">${timestamp_str} = 1779973456871</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.166170" elapsed="0.000104"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.166387" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.166423" 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-28T21:04:17.166330" elapsed="0.000106"/>
</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-28T21:04:17.166489" elapsed="0.000115"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.165701" elapsed="0.000935"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.163306" elapsed="0.003355"/>
</kw>
<var name="${mark_price_item}">{'s': 'doge_usdt', 'p': '0.09824', 't': 1779973456871}</var>
<status status="PASS" start="2026-05-28T21:04:17.163235" elapsed="0.003441"/>
</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-28T21:04:17.166923" elapsed="0.000106"/>
</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-28T21:04:17.167085" 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-28T21:04:17.167232" 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-28T21:04:17.167374" elapsed="0.000086"/>
</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-28T21:04:17.167671" elapsed="0.000077"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.167874" 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-28T21:04:17.167803" elapsed="0.000094"/>
</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-28T21:04:17.167952" elapsed="0.000081"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.167528" elapsed="0.000537"/>
</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-28T21:04:17.168271" elapsed="0.000070"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.168459" 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-28T21:04:17.168392" 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-28T21:04:17.168531" elapsed="0.000078"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.168749" 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-28T21:04:17.168663" elapsed="0.000099"/>
</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-28T21:04:17.168811" elapsed="0.000086"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.168134" elapsed="0.000790"/>
</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-28T21:04:17.169127" elapsed="0.000156"/>
</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-28T21:04:17.169336" elapsed="0.000085"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.169563" 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-28T21:04:17.169473" elapsed="0.000103"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.169683" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.169718" 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-28T21:04:17.169628" elapsed="0.000101"/>
</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-28T21:04:17.169780" elapsed="0.000109"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.168990" elapsed="0.000929"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.166784" elapsed="0.003159"/>
</kw>
<var name="${mark_price_item}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-05-28T21:04:17.166719" elapsed="0.003238"/>
</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-28T21:04:17.170190" elapsed="0.000098"/>
</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-28T21:04:17.170342" elapsed="0.000094"/>
</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-28T21:04:17.170491" elapsed="0.000079"/>
</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-28T21:04:17.170628" elapsed="0.000080"/>
</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-28T21:04:17.170906" elapsed="0.000071"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.171095" 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-28T21:04:17.171030" elapsed="0.000086"/>
</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-28T21:04:17.171168" elapsed="0.000077"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.170774" elapsed="0.000501"/>
</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-28T21:04:17.171472" elapsed="0.000071"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.171660" 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-28T21:04:17.171595" elapsed="0.000086"/>
</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-28T21:04:17.171732" elapsed="0.000078"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.171951" 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-28T21:04:17.171864" elapsed="0.000099"/>
</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-28T21:04:17.172013" elapsed="0.000084"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.171340" elapsed="0.000786"/>
</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-28T21:04:17.172324" elapsed="0.000103"/>
</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-28T21:04:17.172480" elapsed="0.000085"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.172696" 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-28T21:04:17.172616" elapsed="0.000093"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.172809" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.172842" 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-28T21:04:17.172757" elapsed="0.000096"/>
</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-28T21:04:17.172901" elapsed="0.000101"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.172192" elapsed="0.000838"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.170058" elapsed="0.002995"/>
</kw>
<var name="${mark_price_item}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-05-28T21:04:17.169997" elapsed="0.003069"/>
</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-28T21:04:17.173287" elapsed="0.000095"/>
</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-28T21:04:17.173432" elapsed="0.000078"/>
</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-28T21:04:17.173571" elapsed="0.000076"/>
</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-28T21:04:17.173697" 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-28T21:04:17.174027" elapsed="0.000069"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.174209" 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-28T21:04:17.174146" elapsed="0.000084"/>
</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-28T21:04:17.174279" elapsed="0.000073"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.173841" elapsed="0.000538"/>
</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-28T21:04:17.174571" elapsed="0.000068"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.174765" 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-28T21:04:17.174701" elapsed="0.000085"/>
</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-28T21:04:17.174835" elapsed="0.000076"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.175046" level="INFO">${price_float} = 73530.643</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-28T21:04:17.174963" 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-28T21:04:17.175106" elapsed="0.000082"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.174444" elapsed="0.000771"/>
</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-28T21:04:17.175406" elapsed="0.000094"/>
</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-28T21:04:17.175551" elapsed="0.000081"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.175765" level="INFO">${timestamp_str} = 1779973456848</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.175685" elapsed="0.000092"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.175877" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.175910" 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-28T21:04:17.175826" elapsed="0.000096"/>
</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-28T21:04:17.175970" elapsed="0.000107"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.175277" elapsed="0.000828"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.173163" elapsed="0.002965"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdc', 'p': '73530.643', 't': 1779973456848}</var>
<status status="PASS" start="2026-05-28T21:04:17.173104" elapsed="0.003037"/>
</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-28T21:04:17.176361" 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-28T21:04:17.176505" 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-28T21:04:17.176633" elapsed="0.000074"/>
</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-28T21:04:17.176758" elapsed="0.000074"/>
</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-28T21:04:17.177012" elapsed="0.000068"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.177186" 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-28T21:04:17.177127" elapsed="0.000078"/>
</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-28T21:04:17.177253" elapsed="0.000070"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.176892" elapsed="0.000458"/>
</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-28T21:04:17.177537" elapsed="0.000069"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.177715" 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-28T21:04:17.177654" elapsed="0.000080"/>
</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-28T21:04:17.177782" elapsed="0.000071"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.177982" 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-28T21:04:17.177903" elapsed="0.000090"/>
</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-28T21:04:17.178039" elapsed="0.000077"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.177410" elapsed="0.000732"/>
</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-28T21:04:17.178664" elapsed="0.000090"/>
</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-28T21:04:17.178803" elapsed="0.000077"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.179006" 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-28T21:04:17.178928" elapsed="0.000090"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.179127" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.179159" 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-28T21:04:17.179075" 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-28T21:04:17.179215" elapsed="0.000099"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.178201" elapsed="0.001140"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.176237" elapsed="0.003126"/>
</kw>
<var name="${mark_price_item}">{'s': 'xaut_usdt', 'p': '4543.7984', 't': 1779095550280}</var>
<status status="PASS" start="2026-05-28T21:04:17.176179" elapsed="0.003197"/>
</iter>
<var>${mark_price_item}</var>
<value>@{mark_price_list}</value>
<status status="PASS" start="2026-05-28T21:04:17.109945" elapsed="0.069443"/>
</for>
<arg>${data}</arg>
<doc>验证期货标记价格列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.109610" elapsed="0.069801"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.179840" 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-28T21:04:17.179623" elapsed="0.000230"/>
</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-28T21:04:17.179971" elapsed="0.000218"/>
</kw>
<msg time="2026-05-28T21:04:17.180228" 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-28T21:04:17.179906" elapsed="0.000334"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.180360" 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-28T21:04:17.180294" elapsed="0.000077"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.180514" 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-28T21:04:17.180424" elapsed="0.000102"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.180653" 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-28T21:04:17.180579" elapsed="0.000085"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.180838" 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-28T21:04:17.180718" elapsed="0.000134"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.180993" 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-28T21:04:17.180903" elapsed="0.000103"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.181112" 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-28T21:04:17.181058" elapsed="0.000074"/>
</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-28T21:04:17.179485" elapsed="0.001671"/>
</kw>
<doc>验证期货U本位标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:16.602920" elapsed="0.578292"/>
</test>
<doc>期货U本位标记价格接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:16.586285" elapsed="0.595046"/>
</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-28T21:04:17.183537" 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-28T21:04:17.183458" elapsed="0.000091"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.183720" 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-28T21:04:17.183667" elapsed="0.000072"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:17.183582" 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-28T21:04:17.183805" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.183763" elapsed="0.000063"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.183574" elapsed="0.000260"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.184174" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:17.184051" elapsed="0.000142"/>
</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-28T21:04:17.184289" 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-28T21:04:17.184356" 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-28T21:04:17.184407" 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-28T21:04:17.184456" 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-28T21:04:17.184503" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.184221" elapsed="0.000303"/>
</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-28T21:04:17.184599" 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-28T21:04:17.184649" 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-28T21:04:17.184698" elapsed="0.000007"/>
</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-28T21:04:17.184745" 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-28T21:04:17.184791" 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-28T21:04:17.184838" elapsed="0.000007"/>
</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-28T21:04:17.184883" 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-28T21:04:17.184929" 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-28T21:04:17.184975" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.184533" elapsed="0.000461"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.185138" 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-28T21:04:17.185043" elapsed="0.000112"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.185289" 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-28T21:04:17.185201" elapsed="0.000105"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.185440" 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-28T21:04:17.185351" elapsed="0.000106"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.185592" 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-28T21:04:17.185502" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.185739" 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-28T21:04:17.185653" elapsed="0.000102"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.185887" 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-28T21:04:17.185799" elapsed="0.000105"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.186042" 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-28T21:04:17.185947" elapsed="0.000112"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.186194" 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-28T21:04:17.186103" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.186349" 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-28T21:04:17.186254" elapsed="0.000111"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:17.185003" elapsed="0.001376"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.184214" elapsed="0.002173"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.186489" 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-28T21:04:17.186426" elapsed="0.000082"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:17.186661" 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-28T21:04:17.186551" elapsed="0.000176"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:17.183949" elapsed="0.002804"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.186843" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:17.186796" elapsed="0.000065"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:17.183367" elapsed="0.003516"/>
</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-28T21:04:17.188245" 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-28T21:04:17.187969" elapsed="0.000288"/>
</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-28T21:04:17.188520" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.188307" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.188300" elapsed="0.000254"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:17.188567" elapsed="0.000014"/>
</return>
<msg time="2026-05-28T21:04:17.188649" 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-28T21:04:17.187659" elapsed="0.001001"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:17.436605" 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-28T21:04:17.437019" 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 13: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': 'f501880c24bb493a3db9da650954a79f', 'X-Transparent': '00-f501880c24bb493a3db9da650954a79f-b03b5285651e5cef-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': 'a02d76dc999d02cc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"73582.12","t":1779973456862},"ts":1779973457424} 
 </msg>
<msg time="2026-05-28T21:04:17.437188" 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-28T21:04:17.437590" 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-28T21:04:17.189006" elapsed="0.248653"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:17.437893" elapsed="0.000154"/>
</return>
<msg time="2026-05-28T21:04:17.438445" 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-28T21:04:17.188716" elapsed="0.249785"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.441270" 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-28T21:04:17.440008" elapsed="0.001405"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.442853" 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-28T21:04:17.441697" elapsed="0.001214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.443483" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:17.443172" elapsed="0.000408"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:17.439136" elapsed="0.004575"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.445228" level="INFO">${response_data} = {'s': 'btc_usdt', 'p': '73582.12', 't': 1779973456862}</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-28T21:04:17.443964" elapsed="0.001318"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.445909" 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-28T21:04:17.445531" elapsed="0.000469"/>
</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-28T21:04:17.446324" elapsed="0.000478"/>
</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-28T21:04:17.447663" elapsed="0.000901"/>
</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-28T21:04:17.448747" elapsed="0.000265"/>
</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-28T21:04:17.449175" elapsed="0.000237"/>
</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-28T21:04:17.449575" 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-28T21:04:17.450528" elapsed="0.000186"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.450998" 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-28T21:04:17.450842" elapsed="0.000207"/>
</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-28T21:04:17.451183" elapsed="0.000189"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T21:04:17.451714" 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-28T21:04:17.451525" elapsed="0.000219"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T21:04:17.452046" 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-28T21:04:17.451870" elapsed="0.000210"/>
</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-28T21:04:17.452218" elapsed="0.000267"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.450075" elapsed="0.002497"/>
</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-28T21:04:17.453148" elapsed="0.000186"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.453618" 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-28T21:04:17.453458" elapsed="0.000212"/>
</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-28T21:04:17.453872" elapsed="0.000211"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.454475" level="INFO">${price_float} = 73582.12</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-28T21:04:17.454233" elapsed="0.000275"/>
</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-28T21:04:17.454637" elapsed="0.000223"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.452795" elapsed="0.002129"/>
</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-28T21:04:17.455420" elapsed="0.000249"/>
</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-28T21:04:17.455781" elapsed="0.000172"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.456261" level="INFO">${timestamp_str} = 1779973456862</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.456081" elapsed="0.000209"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.456524" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.456600" 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-28T21:04:17.456403" elapsed="0.000223"/>
</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-28T21:04:17.456742" elapsed="0.000267"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-05-28T21:04:17.457428" level="INFO">${current_time} = 1779973457.457322</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-28T21:04:17.457130" elapsed="0.000326"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.457789" level="INFO">${current_timestamp} = 1779973457457</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-28T21:04:17.457582" elapsed="0.000234"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.458142" level="INFO">${time_diff} = 595</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-28T21:04:17.457927" elapsed="0.000240"/>
</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-28T21:04:17.458270" elapsed="0.000177"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.455118" elapsed="0.003456"/>
</kw>
<arg>${response_data}</arg>
<arg>btc_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.447143" elapsed="0.011488"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.459738" 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-28T21:04:17.459236" elapsed="0.000528"/>
</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-28T21:04:17.460069" elapsed="0.000478"/>
</kw>
<msg time="2026-05-28T21:04:17.460632" 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-28T21:04:17.459896" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.460929" 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-28T21:04:17.460784" elapsed="0.000168"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.461244" 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-28T21:04:17.461064" elapsed="0.000202"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.461530" 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-28T21:04:17.461374" elapsed="0.000183"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.461915" 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-28T21:04:17.461663" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.462386" 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-28T21:04:17.462045" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.462625" 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-28T21:04:17.462524" elapsed="0.000145"/>
</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-28T21:04:17.458872" elapsed="0.003845"/>
</kw>
<doc>验证期货U本位单个交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:17.186906" elapsed="0.275992"/>
</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-28T21:04:17.466180" 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-28T21:04:17.465566" elapsed="0.000637"/>
</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-28T21:04:17.466820" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.466356" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.466324" elapsed="0.000578"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:17.466936" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T21:04:17.467121" 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-28T21:04:17.464883" elapsed="0.002261"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:17.623284" 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-28T21:04:17.623794" 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 13: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': '3548c6300fd57c2ce7ad9a0aca795ddf', 'X-Transparent': '00-3548c6300fd57c2ce7ad9a0aca795ddf-b33f894f0d6d67cf-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': 'a02d76dd8c7902cc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"76000","t":1779973456875},"ts":1779973457570} 
 </msg>
<msg time="2026-05-28T21:04:17.623972" 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-28T21:04:17.624300" 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-28T21:04:17.468298" elapsed="0.156062"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:17.624563" elapsed="0.000118"/>
</return>
<msg time="2026-05-28T21:04:17.625031" 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-28T21:04:17.467395" elapsed="0.157690"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.627694" 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-28T21:04:17.626461" elapsed="0.001377"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.629176" 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-28T21:04:17.628099" elapsed="0.001135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.629815" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:17.629512" elapsed="0.000404"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:17.625636" elapsed="0.004410"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.631228" level="INFO">${response_data} = {'s': 'eth_usdt', 'p': '76000', 't': 1779973456875}</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-28T21:04:17.630275" elapsed="0.000993"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.631724" 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-28T21:04:17.631452" elapsed="0.000341"/>
</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-28T21:04:17.631972" elapsed="0.000440"/>
</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-28T21:04:17.633244" elapsed="0.000328"/>
</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-28T21:04:17.633749" elapsed="0.000283"/>
</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-28T21:04:17.634192" elapsed="0.000191"/>
</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-28T21:04:17.634522" elapsed="0.000180"/>
</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-28T21:04:17.635338" elapsed="0.000193"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.636128" 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-28T21:04:17.635655" elapsed="0.000527"/>
</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-28T21:04:17.636327" elapsed="0.000202"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T21:04:17.636857" 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-28T21:04:17.636677" elapsed="0.000209"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T21:04:17.637189" 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-28T21:04:17.637014" elapsed="0.000258"/>
</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-28T21:04:17.637404" elapsed="0.000264"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.634923" elapsed="0.002826"/>
</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-28T21:04:17.638284" elapsed="0.000166"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.638707" 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-28T21:04:17.638578" elapsed="0.000171"/>
</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-28T21:04:17.638858" elapsed="0.000174"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.639346" 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-28T21:04:17.639156" elapsed="0.000216"/>
</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-28T21:04:17.639485" elapsed="0.000189"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.637947" elapsed="0.001789"/>
</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-28T21:04:17.640201" elapsed="0.000213"/>
</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-28T21:04:17.640523" elapsed="0.000163"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.640989" level="INFO">${timestamp_str} = 1779973456875</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:17.640806" elapsed="0.000213"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.641245" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:17.641314" 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-28T21:04:17.641140" elapsed="0.000198"/>
</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-28T21:04:17.641440" elapsed="0.000239"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-05-28T21:04:17.642091" level="INFO">${current_time} = 1779973457.641987</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-28T21:04:17.641796" elapsed="0.000320"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.642448" level="INFO">${current_timestamp} = 1779973457641</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-28T21:04:17.642247" elapsed="0.000232"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.642804" level="INFO">${time_diff} = 766</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-28T21:04:17.642589" elapsed="0.000241"/>
</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-28T21:04:17.642933" elapsed="0.000158"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:17.639926" elapsed="0.003220"/>
</kw>
<arg>${response_data}</arg>
<arg>eth_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:17.632751" elapsed="0.010442"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.644152" 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-28T21:04:17.643661" elapsed="0.000520"/>
</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-28T21:04:17.644466" elapsed="0.000473"/>
</kw>
<msg time="2026-05-28T21:04:17.645015" 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-28T21:04:17.644311" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.645298" 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-28T21:04:17.645164" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.645595" 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-28T21:04:17.645422" elapsed="0.000195"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.645868" 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-28T21:04:17.645719" elapsed="0.000170"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.646246" 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-28T21:04:17.645992" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.646600" 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-28T21:04:17.646417" elapsed="0.000211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.646836" 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-28T21:04:17.646735" elapsed="0.000141"/>
</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-28T21:04:17.643381" elapsed="0.003544"/>
</kw>
<doc>验证期货U本位ETH交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:17.463196" elapsed="0.183914"/>
</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-28T21:04:17.651514" 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-28T21:04:17.650729" elapsed="0.000823"/>
</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-28T21:04:17.652277" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.651725" elapsed="0.000611"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.651701" elapsed="0.000658"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:17.652392" elapsed="0.000029"/>
</return>
<msg time="2026-05-28T21:04:17.652585" 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-28T21:04:17.649816" elapsed="0.002794"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:17.766467" 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-28T21:04:17.766834" 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 13: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': '13043f27ac0b0a2a7cce8fb877c74e35', 'X-Transparent': '00-13043f27ac0b0a2a7cce8fb877c74e35-60441f6c741a792e-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': 'a02d76deaf9202cc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779973457756} 
 </msg>
<msg time="2026-05-28T21:04:17.767034" 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-28T21:04:17.767374" 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-28T21:04:17.653386" elapsed="0.114050"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:17.767639" elapsed="0.000125"/>
</return>
<msg time="2026-05-28T21:04:17.768114" 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-28T21:04:17.652738" elapsed="0.115430"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.770040" 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-28T21:04:17.768606" elapsed="0.001575"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.771711" 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-28T21:04:17.770477" elapsed="0.001295"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.773152" 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-28T21:04:17.772042" elapsed="0.001164"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.774530" 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-28T21:04:17.773449" elapsed="0.001133"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.775136" 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-28T21:04:17.774815" elapsed="0.000434"/>
</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-28T21:04:17.775491" 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-28T21:04:17.776114" elapsed="0.000422"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.779074" 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-28T21:04:17.778016" elapsed="0.001104"/>
</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-28T21:04:17.779610" elapsed="0.000807"/>
</kw>
<msg time="2026-05-28T21:04:17.780553" 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-28T21:04:17.779345" elapsed="0.001245"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.781037" 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-28T21:04:17.780800" elapsed="0.000276"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.781589" 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-28T21:04:17.781261" elapsed="0.000369"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.782080" 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-28T21:04:17.781822" elapsed="0.000306"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.782731" 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-28T21:04:17.782299" elapsed="0.000482"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.783233" 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-28T21:04:17.782960" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.783584" 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-28T21:04:17.783427" elapsed="0.000218"/>
</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-28T21:04:17.777045" elapsed="0.006682"/>
</kw>
<doc>验证期货U本位标记价格接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:17.647403" elapsed="0.136557"/>
</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-28T21:04:17.788650" 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-28T21:04:17.787946" elapsed="0.000731"/>
</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-28T21:04:17.789409" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.788871" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.788842" elapsed="0.000662"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:17.789542" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T21:04:17.789759" 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-28T21:04:17.787063" elapsed="0.002721"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:17.902163" 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-28T21:04:17.902458" 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 13: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': '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': '36a0b9f41316ed27d6d95c4e7c0b7ee2', 'X-Transparent': '00-36a0b9f41316ed27d6d95c4e7c0b7ee2-cabdf5f2475257a1-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': 'a02d76df8a1702cc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779973457892} 
 </msg>
<msg time="2026-05-28T21:04:17.902603" 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-28T21:04:17.902882" 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-28T21:04:17.790647" elapsed="0.112291"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:17.903093" elapsed="0.000085"/>
</return>
<msg time="2026-05-28T21:04:17.903484" 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-28T21:04:17.789946" elapsed="0.113592"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.905095" 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-28T21:04:17.903850" elapsed="0.001373"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.906629" 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-28T21:04:17.905494" elapsed="0.001187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.907991" 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-28T21:04:17.906920" elapsed="0.001126"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:17.909384" 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-28T21:04:17.908292" elapsed="0.001147"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.910334" 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-28T21:04:17.909610" elapsed="0.000806"/>
</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-28T21:04:17.910589" elapsed="0.000259"/>
</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-28T21:04:17.911025" elapsed="0.000301"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.912915" 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-28T21:04:17.912174" elapsed="0.000779"/>
</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-28T21:04:17.913362" elapsed="0.000703"/>
</kw>
<msg time="2026-05-28T21:04:17.914171" 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-28T21:04:17.913138" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.914621" 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-28T21:04:17.914441" elapsed="0.000210"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.915045" 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-28T21:04:17.914792" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.915420" 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-28T21:04:17.915220" elapsed="0.000230"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.915912" 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-28T21:04:17.915582" elapsed="0.000364"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.916318" 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-28T21:04:17.916085" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:17.916627" 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-28T21:04:17.916486" elapsed="0.000195"/>
</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-28T21:04:17.911660" elapsed="0.005088"/>
</kw>
<doc>验证期货U本位标记价格接口对缺少参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:17.784306" elapsed="0.132629"/>
</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-28T21:04:17.921966" 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-28T21:04:17.921163" elapsed="0.000838"/>
</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-28T21:04:17.922780" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:17.922173" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:17.922137" elapsed="0.000734"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:17.922908" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T21:04:17.923122" 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-28T21:04:17.920208" elapsed="0.002939"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:18.040418" 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-28T21:04:18.040843" 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 13: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': '22750e1c1efc3b0c3d10f5f8bcf08482', 'X-Transparent': '00-22750e1c1efc3b0c3d10f5f8bcf08482-a0384438aae992ac-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.015', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76e05ca402cc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779973458029} 
 </msg>
<msg time="2026-05-28T21:04:18.041158" 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-28T21:04:18.041575" 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-28T21:04:17.923995" elapsed="0.117644"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:18.041888" elapsed="0.000143"/>
</return>
<msg time="2026-05-28T21:04:18.042434" 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-28T21:04:17.923309" elapsed="0.119180"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.044467" 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-28T21:04:18.042987" elapsed="0.001624"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:18.046130" 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-28T21:04:18.044925" elapsed="0.001271"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:18.047613" 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-28T21:04:18.046465" elapsed="0.001204"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:18.048981" 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-28T21:04:18.047919" elapsed="0.001114"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.049594" 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-28T21:04:18.049265" elapsed="0.000444"/>
</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-28T21:04:18.049946" elapsed="0.000361"/>
</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-28T21:04:18.050545" elapsed="0.000316"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.052731" 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-28T21:04:18.051953" elapsed="0.000816"/>
</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-28T21:04:18.053712" elapsed="0.000770"/>
</kw>
<msg time="2026-05-28T21:04:18.054610" 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-28T21:04:18.052977" elapsed="0.001669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.055017" 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-28T21:04:18.054834" elapsed="0.000213"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.055443" 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-28T21:04:18.055185" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.055818" 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-28T21:04:18.055619" elapsed="0.000228"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.056325" 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-28T21:04:18.055992" elapsed="0.000370"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.056726" 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-28T21:04:18.056494" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.057114" 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-28T21:04:18.056967" elapsed="0.000201"/>
</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-28T21:04:18.051302" elapsed="0.005938"/>
</kw>
<doc>验证期货U本位标记价格接口对大写交易对的处理（应返回错误）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:17.917231" elapsed="0.140253"/>
</test>
<doc>期货U本位单个交易对标记价格接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:17.181797" elapsed="0.876263"/>
</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-28T21:04:18.064940" 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-28T21:04:18.064749" elapsed="0.000220"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.065406" 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-28T21:04:18.065289" elapsed="0.000168"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:18.065069" elapsed="0.000420"/>
</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-28T21:04:18.065606" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.065517" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:18.065041" elapsed="0.000636"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.066311" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:18.066206" elapsed="0.000145"/>
</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-28T21:04:18.066560" 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-28T21:04:18.066682" 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-28T21:04:18.066790" 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-28T21:04:18.067047" 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-28T21:04:18.067154" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.066410" elapsed="0.000789"/>
</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-28T21:04:18.067362" 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-28T21:04:18.067465" 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-28T21:04:18.067576" 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-28T21:04:18.067678" 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-28T21:04:18.067785" 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-28T21:04:18.067887" 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-28T21:04:18.068080" elapsed="0.000040"/>
</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-28T21:04:18.068253" elapsed="0.000021"/>
</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-28T21:04:18.068383" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.067221" elapsed="0.001214"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.068878" 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-28T21:04:18.068578" elapsed="0.000356"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.069291" 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-28T21:04:18.069056" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.069684" 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-28T21:04:18.069453" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.070129" 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-28T21:04:18.069890" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.070528" 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-28T21:04:18.070294" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.070934" 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-28T21:04:18.070693" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.071352" 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-28T21:04:18.071097" elapsed="0.000303"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.071765" 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-28T21:04:18.071519" elapsed="0.000299"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.072182" 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-28T21:04:18.071934" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:18.068466" elapsed="0.003799"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:18.066392" elapsed="0.005896"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.072575" 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-28T21:04:18.072399" elapsed="0.000227"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:18.073067" 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-28T21:04:18.072752" elapsed="0.000497"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:18.065977" elapsed="0.007348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.073536" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:18.073441" elapsed="0.000141"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:18.064515" elapsed="0.009129"/>
</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-28T21:04:18.076968" 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-28T21:04:18.076272" elapsed="0.000723"/>
</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-28T21:04:18.077588" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.077110" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:18.077092" elapsed="0.000571"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:18.077693" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T21:04:18.077923" 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-28T21:04:18.075433" elapsed="0.002515"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:18.484790" 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-28T21:04:18.485227" 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 13: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': '3688d308f655253b65a42ba172a55739', 'X-Transparent': '00-3688d308f655253b65a42ba172a55739-a47596d73ee23661-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': 'a02d76e29d9ba6a8-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779973455910,"s":"btc_usdt","c":"73354.70","h":"78844.40","l":"72608.80","a":"240329","v":"1786614","o":"75991.60","r":"-0.0346"},"ts":1779973458468} 
 </msg>
<msg time="2026-05-28T21:04:18.485569" 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-28T21:04:18.485984" 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-28T21:04:18.078416" elapsed="0.407632"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:18.486303" elapsed="0.000161"/>
</return>
<msg time="2026-05-28T21:04:18.486890" 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-28T21:04:18.078076" elapsed="0.408868"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.489865" 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-28T21:04:18.488621" elapsed="0.001390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.491308" 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-28T21:04:18.490286" elapsed="0.001076"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.491895" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:18.491609" elapsed="0.000384"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:18.487647" elapsed="0.004461"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.493374" 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-28T21:04:18.492339" elapsed="0.001140"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.494507" level="INFO">${ticker_data} = {'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}</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-28T21:04:18.493701" elapsed="0.000849"/>
</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-28T21:04:18.495452" elapsed="0.000704"/>
</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-28T21:04:18.496334" elapsed="0.000195"/>
</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-28T21:04:18.496681" elapsed="0.000194"/>
</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-28T21:04:18.497023" elapsed="0.000182"/>
</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-28T21:04:18.497361" elapsed="0.000185"/>
</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-28T21:04:18.497697" elapsed="0.000186"/>
</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-28T21:04:18.498032" elapsed="0.000165"/>
</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-28T21:04:18.498314" elapsed="0.000144"/>
</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-28T21:04:18.498577" elapsed="0.000148"/>
</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-28T21:04:18.499741" elapsed="0.000324"/>
</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-28T21:04:18.500198" elapsed="0.000209"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.500770" level="INFO">${timestamp_str} = 1779973455910</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:18.500556" elapsed="0.000250"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.501080" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:18.501166" 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-28T21:04:18.500951" elapsed="0.000242"/>
</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-28T21:04:18.501312" elapsed="0.000300"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.498924" elapsed="0.002828"/>
</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-28T21:04:18.502654" elapsed="0.000148"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.503024" 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-28T21:04:18.502906" elapsed="0.000163"/>
</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-28T21:04:18.503168" elapsed="0.000131"/>
</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-28T21:04:18.503414" elapsed="0.000140"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.501931" elapsed="0.001680"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.504645" 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-28T21:04:18.504444" elapsed="0.000229"/>
</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-28T21:04:18.504777" elapsed="0.000230"/>
</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-28T21:04:18.505163" 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-28T21:04:18.505654" elapsed="0.000128"/>
</kw>
<msg time="2026-05-28T21:04:18.505868" level="INFO">${price_float} = 73354.70</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-28T21:04:18.505441" elapsed="0.000452"/>
</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-28T21:04:18.506017" elapsed="0.000296"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.503787" elapsed="0.002585"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.507275" 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-28T21:04:18.507111" 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-28T21:04:18.507391" elapsed="0.000181"/>
</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-28T21:04:18.507686" elapsed="0.000112"/>
</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-28T21:04:18.508074" elapsed="0.000100"/>
</kw>
<msg time="2026-05-28T21:04:18.508245" 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-28T21:04:18.507904" elapsed="0.000362"/>
</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-28T21:04:18.508370" elapsed="0.000219"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.506514" elapsed="0.002138"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.509700" 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-28T21:04:18.509531" 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-28T21:04:18.509818" 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-28T21:04:18.510101" elapsed="0.000110"/>
</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-28T21:04:18.510481" elapsed="0.000100"/>
</kw>
<msg time="2026-05-28T21:04:18.510803" 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-28T21:04:18.510315" elapsed="0.000525"/>
</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-28T21:04:18.511016" elapsed="0.000354"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.508777" elapsed="0.002670"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.512687" 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-28T21:04:18.512465" elapsed="0.000252"/>
</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-28T21:04:18.512835" elapsed="0.000242"/>
</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-28T21:04:18.513213" elapsed="0.000159"/>
</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-28T21:04:18.513741" elapsed="0.000141"/>
</kw>
<msg time="2026-05-28T21:04:18.513971" level="INFO">${price_float} = 75991.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-28T21:04:18.513514" elapsed="0.000484"/>
</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-28T21:04:18.514125" elapsed="0.000283"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.511630" elapsed="0.002848"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.515406" 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-28T21:04:18.515234" elapsed="0.000196"/>
</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-28T21:04:18.515532" elapsed="0.000195"/>
</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-28T21:04:18.515835" elapsed="0.000125"/>
</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-28T21:04:18.516264" elapsed="0.000108"/>
</kw>
<msg time="2026-05-28T21:04:18.516451" level="INFO">${amount_float} = 240329</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-28T21:04:18.516071" elapsed="0.000402"/>
</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-28T21:04:18.516584" elapsed="0.000235"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.514638" elapsed="0.002237"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.517744" 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-28T21:04:18.517567" elapsed="0.000204"/>
</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-28T21:04:18.517865" 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-28T21:04:18.518177" 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-28T21:04:18.518585" elapsed="0.000118"/>
</kw>
<msg time="2026-05-28T21:04:18.518776" level="INFO">${amount_float} = 1786614</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-28T21:04:18.518409" elapsed="0.000391"/>
</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-28T21:04:18.518907" elapsed="0.000231"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.517005" elapsed="0.002191"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.520050" 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-28T21:04:18.519875" 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-28T21:04:18.520168" elapsed="0.000173"/>
</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-28T21:04:18.520448" elapsed="0.000126"/>
</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-28T21:04:18.520863" elapsed="0.000109"/>
</kw>
<msg time="2026-05-28T21:04:18.521041" level="INFO">${rate_float} = -0.0346</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-28T21:04:18.520682" elapsed="0.000381"/>
</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-28T21:04:18.521193" elapsed="0.000251"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.519330" elapsed="0.002175"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.495001" elapsed="0.026553"/>
</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-28T21:04:18.521664" elapsed="0.000488"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（BTC交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:18.073718" elapsed="0.448584"/>
</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-28T21:04:18.525006" 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-28T21:04:18.524447" elapsed="0.000583"/>
</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-28T21:04:18.525575" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.525147" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:18.525125" elapsed="0.000523"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:18.525674" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T21:04:18.525837" 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-28T21:04:18.523840" elapsed="0.002018"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:18.703147" 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-28T21:04:18.703511" 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 13: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': 'd6a082489915f9013b7b13f1d4fd7b25', 'X-Transparent': '00-d6a082489915f9013b7b13f1d4fd7b25-f88e40789a293e13-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': 'a02d76e42973a6a8-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":1779973458688} 
 </msg>
<msg time="2026-05-28T21:04:18.703679" 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-28T21:04:18.704060" 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-28T21:04:18.526403" elapsed="0.177726"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:18.704344" elapsed="0.000122"/>
</return>
<msg time="2026-05-28T21:04:18.704853" 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-28T21:04:18.525967" elapsed="0.178947"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.707609" 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-28T21:04:18.706396" elapsed="0.001365"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.709082" 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-28T21:04:18.708055" elapsed="0.001082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.709686" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:18.709388" elapsed="0.000396"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:18.705496" elapsed="0.004493"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.711244" 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-28T21:04:18.710218" elapsed="0.001118"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.712640" 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-28T21:04:18.711567" elapsed="0.001130"/>
</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-28T21:04:18.713801" elapsed="0.000227"/>
</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-28T21:04:18.714202" elapsed="0.000203"/>
</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-28T21:04:18.714572" elapsed="0.000214"/>
</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-28T21:04:18.714956" 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-28T21:04:18.715303" elapsed="0.000191"/>
</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-28T21:04:18.715656" elapsed="0.000199"/>
</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-28T21:04:18.716046" elapsed="0.000199"/>
</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-28T21:04:18.716406" elapsed="0.000184"/>
</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-28T21:04:18.716751" elapsed="0.000187"/>
</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-28T21:04:18.718157" elapsed="0.000315"/>
</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-28T21:04:18.718614" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.719183" 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-28T21:04:18.718963" elapsed="0.000254"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.719481" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:18.719568" 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-28T21:04:18.719350" elapsed="0.000247"/>
</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-28T21:04:18.719723" elapsed="0.003262"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.717197" elapsed="0.005861"/>
</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-28T21:04:18.723928" elapsed="0.000141"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.724295" 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-28T21:04:18.724174" elapsed="0.000163"/>
</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-28T21:04:18.724441" elapsed="0.000135"/>
</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-28T21:04:18.724686" elapsed="0.000133"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.723236" elapsed="0.001644"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.725889" 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-28T21:04:18.725687" elapsed="0.000228"/>
</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-28T21:04:18.726020" elapsed="0.000220"/>
</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-28T21:04:18.726364" elapsed="0.000130"/>
</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-28T21:04:18.726761" elapsed="0.000091"/>
</kw>
<msg time="2026-05-28T21:04:18.726927" 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-28T21:04:18.726593" 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-28T21:04:18.727036" elapsed="0.000201"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.725034" elapsed="0.002249"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.728102" 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-28T21:04:18.727959" elapsed="0.000163"/>
</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-28T21:04:18.728204" elapsed="0.000162"/>
</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-28T21:04:18.728458" elapsed="0.000101"/>
</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-28T21:04:18.728806" elapsed="0.000088"/>
</kw>
<msg time="2026-05-28T21:04:18.728960" 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-28T21:04:18.728656" elapsed="0.000323"/>
</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-28T21:04:18.729072" elapsed="0.000193"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.727458" elapsed="0.001853"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.730051" 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-28T21:04:18.729914" elapsed="0.000157"/>
</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-28T21:04:18.730258" elapsed="0.000273"/>
</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-28T21:04:18.730661" elapsed="0.000147"/>
</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-28T21:04:18.731157" elapsed="0.000137"/>
</kw>
<msg time="2026-05-28T21:04:18.731391" 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-28T21:04:18.730938" elapsed="0.000480"/>
</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-28T21:04:18.731546" elapsed="0.000277"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.729422" elapsed="0.002474"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.732960" 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-28T21:04:18.732754" elapsed="0.000235"/>
</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-28T21:04:18.733102" elapsed="0.000233"/>
</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-28T21:04:18.733459" elapsed="0.000143"/>
</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-28T21:04:18.733943" elapsed="0.000129"/>
</kw>
<msg time="2026-05-28T21:04:18.734168" 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-28T21:04:18.733729" elapsed="0.000466"/>
</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-28T21:04:18.734325" elapsed="0.000238"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.732068" elapsed="0.002550"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.735491" 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-28T21:04:18.735311" elapsed="0.000204"/>
</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-28T21:04:18.735609" elapsed="0.000330"/>
</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-28T21:04:18.736044" 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-28T21:04:18.736461" elapsed="0.000107"/>
</kw>
<msg time="2026-05-28T21:04:18.736642" 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-28T21:04:18.736276" 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-28T21:04:18.736799" elapsed="0.000228"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.734754" elapsed="0.002329"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.737947" 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-28T21:04:18.737772" 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-28T21:04:18.738066" elapsed="0.000201"/>
</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-28T21:04:18.738376" 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-28T21:04:18.738792" elapsed="0.000108"/>
</kw>
<msg time="2026-05-28T21:04:18.738978" 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-28T21:04:18.738611" elapsed="0.000391"/>
</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-28T21:04:18.739108" elapsed="0.000233"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.737213" elapsed="0.002182"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.740232" 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-28T21:04:18.740062" elapsed="0.000194"/>
</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-28T21:04:18.740350" elapsed="0.000157"/>
</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-28T21:04:18.740613" 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-28T21:04:18.741032" elapsed="0.000108"/>
</kw>
<msg time="2026-05-28T21:04:18.741212" 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-28T21:04:18.740844" elapsed="0.000389"/>
</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-28T21:04:18.741342" elapsed="0.000240"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.739526" elapsed="0.002111"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.713271" elapsed="0.028418"/>
</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-28T21:04:18.741791" elapsed="0.000481"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（ETH交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:18.522520" elapsed="0.219878"/>
</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-28T21:04:18.744993" 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-28T21:04:18.744446" elapsed="0.000571"/>
</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-28T21:04:18.745543" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.745124" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:18.745107" elapsed="0.000503"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:18.745637" elapsed="0.000024"/>
</return>
<msg time="2026-05-28T21:04:18.745794" 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-28T21:04:18.743859" elapsed="0.001955"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:18.872498" 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-28T21:04:18.872839" 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 13: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': 'b43f2d73160558639ded480348c970fb', 'X-Transparent': '00-b43f2d73160558639ded480348c970fb-665c9b2321de7458-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': 'a02d76e58d39a6a8-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":1779973458858} 
 </msg>
<msg time="2026-05-28T21:04:18.873010" 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-28T21:04:18.873351" 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-28T21:04:18.746239" elapsed="0.127171"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:18.873599" elapsed="0.000121"/>
</return>
<msg time="2026-05-28T21:04:18.874059" 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-28T21:04:18.745941" elapsed="0.128171"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.876515" 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-28T21:04:18.875406" elapsed="0.001252"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.877989" 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-28T21:04:18.876936" elapsed="0.001106"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.878560" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:18.878285" elapsed="0.000366"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:18.874617" elapsed="0.004161"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.880050" 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-28T21:04:18.879018" elapsed="0.001132"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.881145" 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-28T21:04:18.880378" elapsed="0.000811"/>
</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-28T21:04:18.882522" 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-28T21:04:18.882920" elapsed="0.000190"/>
</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-28T21:04:18.883268" 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-28T21:04:18.883613" elapsed="0.000184"/>
</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-28T21:04:18.883958" elapsed="0.000181"/>
</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-28T21:04:18.884292" elapsed="0.000179"/>
</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-28T21:04:18.884636" elapsed="0.000181"/>
</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-28T21:04:18.884946" elapsed="0.000143"/>
</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-28T21:04:18.885216" 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-28T21:04:18.886324" 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-28T21:04:18.886751" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.887368" 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-28T21:04:18.887158" elapsed="0.000240"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.887658" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:18.887743" 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-28T21:04:18.887530" elapsed="0.000240"/>
</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-28T21:04:18.887896" elapsed="0.000303"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.885563" elapsed="0.002725"/>
</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-28T21:04:18.889225" elapsed="0.000156"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.889601" 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-28T21:04:18.889482" elapsed="0.000165"/>
</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-28T21:04:18.889750" elapsed="0.000138"/>
</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-28T21:04:18.889997" elapsed="0.000136"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.888468" elapsed="0.001725"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.891237" 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-28T21:04:18.891035" elapsed="0.000228"/>
</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-28T21:04:18.891374" elapsed="0.000226"/>
</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-28T21:04:18.891746" elapsed="0.000157"/>
</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-28T21:04:18.892251" elapsed="0.000124"/>
</kw>
<msg time="2026-05-28T21:04:18.892458" 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-28T21:04:18.892032" elapsed="0.000450"/>
</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-28T21:04:18.892600" elapsed="0.000255"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.890347" elapsed="0.002574"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.893851" 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-28T21:04:18.893691" 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-28T21:04:18.893968" 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-28T21:04:18.894255" elapsed="0.000112"/>
</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-28T21:04:18.894642" elapsed="0.000243"/>
</kw>
<msg time="2026-05-28T21:04:18.894955" 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-28T21:04:18.894472" elapsed="0.000504"/>
</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-28T21:04:18.895078" elapsed="0.000219"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.893077" elapsed="0.002281"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.896211" 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-28T21:04:18.896053" 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-28T21:04:18.896323" elapsed="0.000177"/>
</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-28T21:04:18.896602" elapsed="0.000109"/>
</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-28T21:04:18.896989" elapsed="0.000097"/>
</kw>
<msg time="2026-05-28T21:04:18.897201" 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-28T21:04:18.896821" elapsed="0.000401"/>
</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-28T21:04:18.897328" elapsed="0.000197"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.895484" elapsed="0.002089"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.898320" 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-28T21:04:18.898183" elapsed="0.000158"/>
</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-28T21:04:18.898421" 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-28T21:04:18.898668" elapsed="0.000096"/>
</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-28T21:04:18.899013" elapsed="0.000086"/>
</kw>
<msg time="2026-05-28T21:04:18.899167" 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-28T21:04:18.898862" elapsed="0.000324"/>
</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-28T21:04:18.899282" elapsed="0.000202"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.897688" elapsed="0.001842"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.900301" 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-28T21:04:18.900165" elapsed="0.000156"/>
</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-28T21:04:18.900401" 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-28T21:04:18.900653" elapsed="0.000098"/>
</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-28T21:04:18.901013" elapsed="0.000088"/>
</kw>
<msg time="2026-05-28T21:04:18.901165" 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-28T21:04:18.900855" elapsed="0.000328"/>
</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-28T21:04:18.901280" elapsed="0.000302"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.899654" elapsed="0.002005"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.902780" 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-28T21:04:18.902559" elapsed="0.000251"/>
</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-28T21:04:18.902926" elapsed="0.000230"/>
</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-28T21:04:18.903291" elapsed="0.000149"/>
</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-28T21:04:18.903801" elapsed="0.000137"/>
</kw>
<msg time="2026-05-28T21:04:18.904027" 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-28T21:04:18.903576" elapsed="0.000478"/>
</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-28T21:04:18.904185" elapsed="0.000270"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.901828" elapsed="0.002693"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:18.905531" 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-28T21:04:18.905319" elapsed="0.000241"/>
</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-28T21:04:18.905654" elapsed="0.000158"/>
</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-28T21:04:18.905948" elapsed="0.000123"/>
</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-28T21:04:18.906359" elapsed="0.000117"/>
</kw>
<msg time="2026-05-28T21:04:18.906550" 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-28T21:04:18.906182" elapsed="0.000393"/>
</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-28T21:04:18.906687" elapsed="0.000242"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.904678" elapsed="0.002308"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:18.881606" elapsed="0.025428"/>
</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-28T21:04:18.907136" elapsed="0.000467"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（SOL交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:18.742574" elapsed="0.165151"/>
</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-28T21:04:18.911048" 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-28T21:04:18.910433" elapsed="0.000646"/>
</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-28T21:04:18.911683" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:18.911199" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:18.911182" elapsed="0.000578"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:18.911793" elapsed="0.000030"/>
</return>
<msg time="2026-05-28T21:04:18.911974" 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-28T21:04:18.909613" elapsed="0.002388"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.041556" 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-28T21:04:19.041866" 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 13: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': '63d58e6b2e1ae04bc6e97f52123940b6', 'X-Transparent': '00-63d58e6b2e1ae04bc6e97f52123940b6-ddf87119d7d45223-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': 'a02d76e68899a6a8-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779973459027} 
 </msg>
<msg time="2026-05-28T21:04:19.042002" 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-28T21:04:19.042331" 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-28T21:04:18.912466" elapsed="0.129905"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:19.042550" elapsed="0.000122"/>
</return>
<msg time="2026-05-28T21:04:19.042945" 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-28T21:04:18.912127" elapsed="0.130849"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.044449" 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-28T21:04:19.043338" elapsed="0.001224"/>
</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-28T21:04:19.044775" elapsed="0.000719"/>
</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-28T21:04:19.045643" elapsed="0.000626"/>
</kw>
<doc>验证期货U本位单个Ticker接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:18.907888" elapsed="0.138639"/>
</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-28T21:04:19.053405" 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-28T21:04:19.052197" elapsed="0.001260"/>
</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-28T21:04:19.054631" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.053710" elapsed="0.001013"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.053665" elapsed="0.001101"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:19.054816" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T21:04:19.055092" 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-28T21:04:19.050820" elapsed="0.004306"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.195174" 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-28T21:04:19.195610" 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 13: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': 'a72535790dea7cb2de3d08dcf61beb77', 'X-Transparent': '00-a72535790dea7cb2de3d08dcf61beb77-412d5430ae56aacf-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': 'a02d76e77b50a6a8-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779973459169} 
 </msg>
<msg time="2026-05-28T21:04:19.195813" 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-28T21:04:19.196292" 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-28T21:04:19.056302" elapsed="0.140058"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:19.196624" elapsed="0.000165"/>
</return>
<msg time="2026-05-28T21:04:19.197226" 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-28T21:04:19.055348" elapsed="0.141934"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.199369" 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-28T21:04:19.197748" elapsed="0.001788"/>
</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-28T21:04:19.199868" elapsed="0.001196"/>
</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-28T21:04:19.201318" elapsed="0.001025"/>
</kw>
<doc>验证期货U本位单个Ticker接口对缺少symbol参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:19.046932" elapsed="0.155783"/>
</test>
<doc>期货U本位单个Ticker接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:18.059845" elapsed="1.143587"/>
</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-28T21:04:19.212854" 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-28T21:04:19.212581" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.213484" 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-28T21:04:19.213314" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.213018" elapsed="0.000569"/>
</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-28T21:04:19.213749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.213626" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.212984" elapsed="0.000855"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.214739" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.214596" elapsed="0.000196"/>
</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-28T21:04:19.215071" 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-28T21:04:19.215220" 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-28T21:04:19.215363" 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-28T21:04:19.215525" elapsed="0.000021"/>
</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-28T21:04:19.215656" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.214870" elapsed="0.000838"/>
</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-28T21:04:19.215886" 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-28T21:04:19.216016" 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-28T21:04:19.216139" 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-28T21:04:19.216267" 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-28T21:04:19.216384" 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-28T21:04:19.216509" 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-28T21:04:19.216627" elapsed="0.000020"/>
</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-28T21:04:19.216749" 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-28T21:04:19.216864" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.215732" elapsed="0.001186"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.217316" 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-28T21:04:19.217036" elapsed="0.000324"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.217708" 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-28T21:04:19.217473" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.218081" 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-28T21:04:19.217861" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.218456" 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-28T21:04:19.218226" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.218845" 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-28T21:04:19.218602" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.219226" 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-28T21:04:19.218993" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.219622" 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-28T21:04:19.219372" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.220017" 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-28T21:04:19.219813" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.220354" 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-28T21:04:19.220152" elapsed="0.000234"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.216943" elapsed="0.003475"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.214848" elapsed="0.005593"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.220663" 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-28T21:04:19.220525" elapsed="0.000177"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.221170" 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-28T21:04:19.220800" elapsed="0.000617"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:19.214272" elapsed="0.007210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.221657" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.221583" elapsed="0.000111"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:19.212235" elapsed="0.009507"/>
</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-28T21:04:19.225202" 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-28T21:04:19.224127" elapsed="0.001120"/>
</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-28T21:04:19.226112" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.225428" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.225401" elapsed="0.000814"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:19.226254" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T21:04:19.226497" 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-28T21:04:19.223078" elapsed="0.003450"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.497925" 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-28T21:04:19.498271" 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 13: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': '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': 'b9de0c0e37aaae4bc5671d1cb714d293', 'X-Transparent': '00-b9de0c0e37aaae4bc5671d1cb714d293-324bcbdaed770bbf-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': 'a02d76e969a60962-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779973455910,"s":"btc_usdt","c":"73354.70","h":"78844.40","l":"72608.80","a":"240329","v":"1786614","o":"75991.60","r":"-0.0346"},{"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":1779973456462,"s":"doge_usdt","c":"0.09822","h":"0.10363","l":"0.09707","a":"6761723","v":"6763559","o":"0.10201","r":"-0.0371"}],"ts":1779973459482} 
 </msg>
<msg time="2026-05-28T21:04:19.498487" 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-28T21:04:19.498847" 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-28T21:04:19.227204" elapsed="0.271697"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:19.499186" elapsed="0.000108"/>
</return>
<msg time="2026-05-28T21:04:19.499612" 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-28T21:04:19.226733" elapsed="0.272911"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.501478" 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-28T21:04:19.500782" elapsed="0.000801"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.502402" 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-28T21:04:19.501749" elapsed="0.000690"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.502786" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.502605" elapsed="0.000232"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:19.500109" elapsed="0.002805"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.503667" 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-28T21:04:19.503045" elapsed="0.000685"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.504455" level="INFO">${tickers_list} = [{'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}, {'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-28T21:04:19.503869" elapsed="0.000619"/>
</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-28T21:04:19.505531" elapsed="0.000196"/>
</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-28T21:04:19.505836" elapsed="0.000130"/>
</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-28T21:04:19.506077" elapsed="0.000153"/>
</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-28T21:04:19.506345" elapsed="0.000146"/>
</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-28T21:04:19.506603" elapsed="0.000140"/>
</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-28T21:04:19.506852" elapsed="0.000133"/>
</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-28T21:04:19.507086" elapsed="0.000125"/>
</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-28T21:04:19.507309" elapsed="0.000124"/>
</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-28T21:04:19.507537" elapsed="0.000131"/>
</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-28T21:04:19.508646" elapsed="0.000320"/>
</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-28T21:04:19.509113" elapsed="0.000193"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.509577" level="INFO">${timestamp_str} = 1779973455910</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:19.509404" elapsed="0.000197"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.509795" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.510214" 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-28T21:04:19.509696" elapsed="0.000545"/>
</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-28T21:04:19.510343" elapsed="0.000247"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.507865" elapsed="0.002792"/>
</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-28T21:04:19.511436" elapsed="0.000129"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.511780" 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-28T21:04:19.511657" elapsed="0.000163"/>
</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-28T21:04:19.511911" elapsed="0.000121"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.510817" elapsed="0.001270"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.513150" 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-28T21:04:19.512951" elapsed="0.000225"/>
</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-28T21:04:19.513279" elapsed="0.000226"/>
</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-28T21:04:19.513688" elapsed="0.000132"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.512240" elapsed="0.001640"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.514820" 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-28T21:04:19.514618" elapsed="0.000229"/>
</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-28T21:04:19.514949" 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-28T21:04:19.515281" elapsed="0.000121"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.514023" elapsed="0.001439"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.516379" 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-28T21:04:19.516183" 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-28T21:04:19.516514" elapsed="0.000214"/>
</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-28T21:04:19.516845" elapsed="0.000125"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.515593" elapsed="0.001444"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.518006" 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-28T21:04:19.517832" 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-28T21:04:19.518123" 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-28T21:04:19.518405" elapsed="0.000193"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.517186" elapsed="0.001490"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.519607" 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-28T21:04:19.519423" elapsed="0.000210"/>
</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-28T21:04:19.519735" elapsed="0.000210"/>
</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-28T21:04:19.520052" elapsed="0.000128"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.518819" elapsed="0.001423"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.521262" 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-28T21:04:19.521069" elapsed="0.000217"/>
</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-28T21:04:19.521382" elapsed="0.000200"/>
</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-28T21:04:19.521704" elapsed="0.000121"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.520372" elapsed="0.001508"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.522773" 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-28T21:04:19.522591" elapsed="0.000206"/>
</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-28T21:04:19.522891" elapsed="0.000173"/>
</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-28T21:04:19.523167" elapsed="0.000117"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.522009" elapsed="0.001334"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.505168" elapsed="0.018225"/>
</kw>
<var name="${ticker}">{'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}</var>
<status status="PASS" start="2026-05-28T21:04:19.504890" elapsed="0.018673"/>
</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-28T21:04:19.524491" elapsed="0.000141"/>
</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-28T21:04:19.524727" elapsed="0.000109"/>
</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-28T21:04:19.524930" elapsed="0.000110"/>
</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-28T21:04:19.525125" 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-28T21:04:19.525318" elapsed="0.000123"/>
</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-28T21:04:19.525525" elapsed="0.000106"/>
</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-28T21:04:19.525848" elapsed="0.000243"/>
</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-28T21:04:19.526233" elapsed="0.000163"/>
</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-28T21:04:19.526522" 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-28T21:04:19.527617" 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-28T21:04:19.527977" elapsed="0.000196"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.528501" 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-28T21:04:19.528294" elapsed="0.000238"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.528786" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.528868" 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-28T21:04:19.528652" elapsed="0.000242"/>
</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-28T21:04:19.529009" elapsed="0.000282"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.526863" elapsed="0.002498"/>
</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-28T21:04:19.530181" elapsed="0.000153"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.530574" 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-28T21:04:19.530448" elapsed="0.000172"/>
</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-28T21:04:19.530731" elapsed="0.000149"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.529508" elapsed="0.001435"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.531977" 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-28T21:04:19.531767" elapsed="0.000240"/>
</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-28T21:04:19.532122" elapsed="0.000243"/>
</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-28T21:04:19.532502" elapsed="0.000153"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.531085" elapsed="0.001642"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.533746" 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-28T21:04:19.533535" elapsed="0.000241"/>
</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-28T21:04:19.533895" elapsed="0.000230"/>
</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-28T21:04:19.534255" elapsed="0.000143"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.532868" elapsed="0.001597"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.535314" 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-28T21:04:19.535142" 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-28T21:04:19.535434" 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-28T21:04:19.535797" elapsed="0.000122"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.534583" elapsed="0.001396"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.536975" 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-28T21:04:19.536655" elapsed="0.000346"/>
</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-28T21:04:19.537103" elapsed="0.000290"/>
</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-28T21:04:19.537550" elapsed="0.000178"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.536097" elapsed="0.001706"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.538835" 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-28T21:04:19.538625" elapsed="0.000236"/>
</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-28T21:04:19.538959" elapsed="0.000198"/>
</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-28T21:04:19.539258" elapsed="0.000118"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.537961" elapsed="0.001472"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.540234" 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-28T21:04:19.540076" elapsed="0.000181"/>
</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-28T21:04:19.540347" elapsed="0.000176"/>
</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-28T21:04:19.540619" elapsed="0.000111"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.539548" elapsed="0.001234"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.541679" 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-28T21:04:19.541483" elapsed="0.000224"/>
</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-28T21:04:19.541810" elapsed="0.000176"/>
</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-28T21:04:19.542085" elapsed="0.000122"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.540892" elapsed="0.001372"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.523895" elapsed="0.018412"/>
</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-28T21:04:19.523702" elapsed="0.018632"/>
</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-28T21:04:19.542797" elapsed="0.000115"/>
</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-28T21:04:19.542998" 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-28T21:04:19.543187" elapsed="0.000106"/>
</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-28T21:04:19.543376" elapsed="0.000103"/>
</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-28T21:04:19.543559" 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-28T21:04:19.543741" 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-28T21:04:19.543922" elapsed="0.000100"/>
</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-28T21:04:19.544103" elapsed="0.000103"/>
</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-28T21:04:19.544286" 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-28T21:04:19.545097" elapsed="0.000164"/>
</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-28T21:04:19.545346" elapsed="0.000132"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.545709" 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-28T21:04:19.545567" elapsed="0.000163"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.545901" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.545960" 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-28T21:04:19.545813" elapsed="0.000167"/>
</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-28T21:04:19.546061" elapsed="0.000184"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.544568" elapsed="0.001725"/>
</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-28T21:04:19.546856" elapsed="0.000102"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.547130" 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-28T21:04:19.547039" elapsed="0.000251"/>
</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-28T21:04:19.547371" elapsed="0.000097"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.546393" elapsed="0.001115"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.548156" 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-28T21:04:19.548024" elapsed="0.000151"/>
</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-28T21:04:19.548249" elapsed="0.000150"/>
</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-28T21:04:19.548483" elapsed="0.000127"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.547596" elapsed="0.001066"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.549375" 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-28T21:04:19.549233" elapsed="0.000163"/>
</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-28T21:04:19.549473" elapsed="0.000156"/>
</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-28T21:04:19.549714" elapsed="0.000096"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.548762" elapsed="0.001094"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.550522" 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-28T21:04:19.550391" elapsed="0.000151"/>
</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-28T21:04:19.550616" elapsed="0.000148"/>
</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-28T21:04:19.550845" elapsed="0.000093"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.549949" elapsed="0.001035"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.551631" 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-28T21:04:19.551501" 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-28T21:04:19.551725" 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-28T21:04:19.551947" elapsed="0.000092"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.551073" elapsed="0.001011"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.552725" 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-28T21:04:19.552595" elapsed="0.000148"/>
</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-28T21:04:19.552815" elapsed="0.000172"/>
</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-28T21:04:19.553068" elapsed="0.000094"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.552172" elapsed="0.001034"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.553857" 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-28T21:04:19.553722" elapsed="0.000153"/>
</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-28T21:04:19.553948" elapsed="0.000146"/>
</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-28T21:04:19.554173" elapsed="0.000093"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.553294" elapsed="0.001015"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.554941" 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-28T21:04:19.554808" elapsed="0.000152"/>
</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-28T21:04:19.555033" elapsed="0.000119"/>
</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-28T21:04:19.555232" elapsed="0.000088"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.554399" elapsed="0.000966"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.542571" elapsed="0.012828"/>
</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-28T21:04:19.542422" elapsed="0.012997"/>
</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-28T21:04:19.555794" elapsed="0.000095"/>
</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-28T21:04:19.555962" elapsed="0.000089"/>
</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-28T21:04:19.556121" elapsed="0.000082"/>
</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-28T21:04:19.556266" elapsed="0.000180"/>
</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-28T21:04:19.556518" 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-28T21:04:19.556666" 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-28T21:04:19.556878" 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-28T21:04:19.557070" elapsed="0.000095"/>
</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-28T21:04:19.557235" elapsed="0.000091"/>
</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-28T21:04:19.557860" elapsed="0.000141"/>
</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-28T21:04:19.558075" elapsed="0.000119"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.558387" level="INFO">${timestamp_str} = 1779973456462</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:19.558267" elapsed="0.000138"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.558551" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.558600" 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-28T21:04:19.558476" elapsed="0.000140"/>
</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-28T21:04:19.558685" elapsed="0.000156"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.557431" elapsed="0.001451"/>
</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-28T21:04:19.559369" elapsed="0.000086"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.559598" 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-28T21:04:19.559523" elapsed="0.000105"/>
</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-28T21:04:19.559695" elapsed="0.000089"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.558971" elapsed="0.000878"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.560468" 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-28T21:04:19.560339" 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-28T21:04:19.560548" 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-28T21:04:19.560748" elapsed="0.000083"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.559935" elapsed="0.000935"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.561424" 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-28T21:04:19.561310" elapsed="0.000130"/>
</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-28T21:04:19.561503" 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-28T21:04:19.561698" elapsed="0.000079"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.560948" elapsed="0.000867"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.562359" 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-28T21:04:19.562244" 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-28T21:04:19.562437" 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-28T21:04:19.562627" elapsed="0.000080"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.561891" elapsed="0.000854"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.563285" 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-28T21:04:19.563172" elapsed="0.000128"/>
</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-28T21:04:19.563362" elapsed="0.000119"/>
</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-28T21:04:19.563549" elapsed="0.000079"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.562822" elapsed="0.000845"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.564853" 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-28T21:04:19.564736" 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-28T21:04:19.564926" elapsed="0.000115"/>
</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-28T21:04:19.565106" elapsed="0.000072"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.563743" elapsed="0.001471"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.565716" 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-28T21:04:19.565614" elapsed="0.000117"/>
</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-28T21:04:19.565790" 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-28T21:04:19.565970" elapsed="0.000073"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.565284" elapsed="0.000794"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.566573" 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-28T21:04:19.566469" elapsed="0.000119"/>
</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-28T21:04:19.566645" elapsed="0.000122"/>
</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-28T21:04:19.566832" elapsed="0.000071"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.566147" elapsed="0.000791"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.555608" elapsed="0.011357"/>
</kw>
<var name="${ticker}">{'t': 1779973456462, 's': 'doge_usdt', 'c': '0.09822', 'h': '0.10363', 'l': '0.09707', 'a': '6761723', 'v': '6763559', 'o': '0.10201', 'r': '-0.0371'}</var>
<status status="PASS" start="2026-05-28T21:04:19.555488" elapsed="0.011493"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T21:04:19.504611" elapsed="0.062387"/>
</for>
<doc>验证期货U本位Tickers接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:19.221821" elapsed="0.345252"/>
</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-28T21:04:19.568796" 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-28T21:04:19.568424" elapsed="0.000389"/>
</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-28T21:04:19.569176" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.568886" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.568873" elapsed="0.000350"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:19.569241" elapsed="0.000019"/>
</return>
<msg time="2026-05-28T21:04:19.569354" 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-28T21:04:19.568014" elapsed="0.001355"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.719637" 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-28T21:04:19.719902" 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 13: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': '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': '155fdfc1994964eb0209231784348256', 'X-Transparent': '00-155fdfc1994964eb0209231784348256-9630db5c2549ac23-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': 'a02d76eaad1e0962-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779973455910,"s":"btc_usdt","c":"73354.70","h":"78844.40","l":"72608.80","a":"240329","v":"1786614","o":"75991.60","r":"-0.0346"},{"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":1779973456462,"s":"doge_usdt","c":"0.09822","h":"0.10363","l":"0.09707","a":"6761723","v":"6763559","o":"0.10201","r":"-0.0371"}],"ts":1779973459670} 
 </msg>
<msg time="2026-05-28T21:04:19.720029" 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-28T21:04:19.720387" 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-28T21:04:19.569655" elapsed="0.150772"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:19.720571" elapsed="0.000097"/>
</return>
<msg time="2026-05-28T21:04:19.720912" 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-28T21:04:19.569448" elapsed="0.151487"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.722463" 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-28T21:04:19.721874" elapsed="0.000660"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.723247" 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-28T21:04:19.722742" elapsed="0.000531"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.723532" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.723391" elapsed="0.000182"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:19.721407" elapsed="0.002220"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.724243" 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-28T21:04:19.723722" elapsed="0.000577"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.724899" level="INFO">${tickers_list} = [{'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}, {'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-28T21:04:19.724415" elapsed="0.000507"/>
</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-28T21:04:19.725957" elapsed="0.000302"/>
</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-28T21:04:19.726499" elapsed="0.000278"/>
</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-28T21:04:19.727001" elapsed="0.000273"/>
</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-28T21:04:19.727488" elapsed="0.000643"/>
</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-28T21:04:19.728243" elapsed="0.000182"/>
</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-28T21:04:19.728539" elapsed="0.000129"/>
</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-28T21:04:19.728778" elapsed="0.000223"/>
</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-28T21:04:19.729181" elapsed="0.000203"/>
</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-28T21:04:19.729548" elapsed="0.000199"/>
</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-28T21:04:19.731296" elapsed="0.000339"/>
</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-28T21:04:19.731804" elapsed="0.000250"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.732511" level="INFO">${timestamp_str} = 1779973455910</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:19.732226" elapsed="0.000325"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.732882" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.732989" 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-28T21:04:19.732720" elapsed="0.000304"/>
</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-28T21:04:19.733167" elapsed="0.000328"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.730095" elapsed="0.003486"/>
</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-28T21:04:19.734714" elapsed="0.000172"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.735151" 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-28T21:04:19.735012" 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-28T21:04:19.735340" elapsed="0.000161"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.733800" elapsed="0.001763"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.736390" 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-28T21:04:19.736229" elapsed="0.000184"/>
</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-28T21:04:19.736519" elapsed="0.000226"/>
</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-28T21:04:19.736862" elapsed="0.000111"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.735683" elapsed="0.001350"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.737941" 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-28T21:04:19.737776" 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-28T21:04:19.738192" 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-28T21:04:19.738472" elapsed="0.000100"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.737163" elapsed="0.001461"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.739435" 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-28T21:04:19.739275" 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-28T21:04:19.739552" elapsed="0.000196"/>
</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-28T21:04:19.739926" elapsed="0.000169"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.738739" elapsed="0.001426"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.741130" 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-28T21:04:19.740928" elapsed="0.000228"/>
</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-28T21:04:19.741260" 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-28T21:04:19.741613" elapsed="0.000133"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.740308" elapsed="0.001503"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.742960" 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-28T21:04:19.742538" elapsed="0.000449"/>
</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-28T21:04:19.743086" elapsed="0.000230"/>
</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-28T21:04:19.743425" elapsed="0.000117"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.741954" elapsed="0.001648"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.744534" 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-28T21:04:19.744343" elapsed="0.000217"/>
</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-28T21:04:19.744686" elapsed="0.000188"/>
</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-28T21:04:19.744971" elapsed="0.000104"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.743733" elapsed="0.001405"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.746064" 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-28T21:04:19.745898" elapsed="0.000190"/>
</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-28T21:04:19.746181" elapsed="0.000391"/>
</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-28T21:04:19.746791" elapsed="0.000193"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.745301" elapsed="0.001777"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.725327" elapsed="0.021812"/>
</kw>
<var name="${ticker}">{'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}</var>
<status status="PASS" start="2026-05-28T21:04:19.725127" elapsed="0.022045"/>
</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-28T21:04:19.747864" elapsed="0.000165"/>
</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-28T21:04:19.748150" elapsed="0.000152"/>
</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-28T21:04:19.748418" elapsed="0.000214"/>
</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-28T21:04:19.748752" elapsed="0.000149"/>
</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-28T21:04:19.749020" elapsed="0.000178"/>
</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-28T21:04:19.749313" elapsed="0.000166"/>
</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-28T21:04:19.749611" elapsed="0.000143"/>
</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-28T21:04:19.749873" elapsed="0.000154"/>
</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-28T21:04:19.750150" elapsed="0.000175"/>
</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-28T21:04:19.751181" elapsed="0.000193"/>
</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-28T21:04:19.751473" elapsed="0.000168"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.751920" 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-28T21:04:19.751751" elapsed="0.000196"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.752146" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.752216" 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-28T21:04:19.752045" elapsed="0.000193"/>
</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-28T21:04:19.752335" elapsed="0.000218"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.750507" elapsed="0.002104"/>
</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-28T21:04:19.753422" elapsed="0.000135"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.753772" 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-28T21:04:19.753659" elapsed="0.000163"/>
</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-28T21:04:19.753926" elapsed="0.000125"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.752777" elapsed="0.001328"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.755000" 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-28T21:04:19.754812" elapsed="0.000213"/>
</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-28T21:04:19.755127" elapsed="0.000359"/>
</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-28T21:04:19.755601" elapsed="0.000138"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.754233" elapsed="0.001567"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.756670" 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-28T21:04:19.756497" 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-28T21:04:19.756795" elapsed="0.000197"/>
</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-28T21:04:19.757096" elapsed="0.000123"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.755924" elapsed="0.001354"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.758137" 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-28T21:04:19.757956" elapsed="0.000205"/>
</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-28T21:04:19.758266" 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-28T21:04:19.758560" elapsed="0.000121"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.757394" elapsed="0.001346"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.759569" 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-28T21:04:19.759421" elapsed="0.000202"/>
</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-28T21:04:19.759716" 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-28T21:04:19.759994" elapsed="0.000104"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.758857" elapsed="0.001291"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.760881" 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-28T21:04:19.760731" elapsed="0.000171"/>
</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-28T21:04:19.760985" elapsed="0.000168"/>
</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-28T21:04:19.761243" elapsed="0.000105"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.760254" elapsed="0.001144"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.762131" 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-28T21:04:19.761978" elapsed="0.000174"/>
</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-28T21:04:19.762234" 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-28T21:04:19.762486" elapsed="0.000103"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.761499" elapsed="0.001140"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.763374" 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-28T21:04:19.763229" elapsed="0.000165"/>
</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-28T21:04:19.763478" elapsed="0.000135"/>
</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-28T21:04:19.763703" elapsed="0.000103"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.762749" elapsed="0.001108"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.747529" elapsed="0.016368"/>
</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-28T21:04:19.747295" elapsed="0.016625"/>
</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-28T21:04:19.764348" elapsed="0.000104"/>
</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-28T21:04:19.764537" elapsed="0.000100"/>
</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-28T21:04:19.764718" elapsed="0.000105"/>
</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-28T21:04:19.764902" 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-28T21:04:19.765083" elapsed="0.000101"/>
</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-28T21:04:19.765265" elapsed="0.000102"/>
</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-28T21:04:19.765447" elapsed="0.000100"/>
</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-28T21:04:19.765627" elapsed="0.000100"/>
</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-28T21:04:19.765808" elapsed="0.000216"/>
</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-28T21:04:19.766606" 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-28T21:04:19.766833" elapsed="0.000132"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.767216" 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-28T21:04:19.767071" elapsed="0.000165"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.767436" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.767495" 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-28T21:04:19.767347" elapsed="0.000167"/>
</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-28T21:04:19.767596" elapsed="0.000164"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.766134" elapsed="0.001667"/>
</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-28T21:04:19.768305" elapsed="0.000088"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.768541" 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-28T21:04:19.768464" elapsed="0.000108"/>
</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-28T21:04:19.768642" elapsed="0.000093"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.767887" elapsed="0.000888"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.769421" 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-28T21:04:19.769290" 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-28T21:04:19.769513" 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-28T21:04:19.769736" elapsed="0.000093"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.768862" elapsed="0.001011"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.770522" 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-28T21:04:19.770388" elapsed="0.000152"/>
</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-28T21:04:19.770612" 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-28T21:04:19.770835" elapsed="0.000090"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.769961" elapsed="0.001008"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.771627" 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-28T21:04:19.771500" elapsed="0.000145"/>
</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-28T21:04:19.771718" 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-28T21:04:19.771942" elapsed="0.000091"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.771057" elapsed="0.001020"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.772720" 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-28T21:04:19.772591" 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-28T21:04:19.772813" 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-28T21:04:19.773035" elapsed="0.000091"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.772166" elapsed="0.001004"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.773807" 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-28T21:04:19.773672" elapsed="0.000153"/>
</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-28T21:04:19.773897" 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-28T21:04:19.774117" elapsed="0.000103"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.773258" elapsed="0.001011"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.777108" 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-28T21:04:19.774779" elapsed="0.002352"/>
</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-28T21:04:19.777219" elapsed="0.000167"/>
</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-28T21:04:19.777475" elapsed="0.000103"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.774356" elapsed="0.003270"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.778312" 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-28T21:04:19.778173" elapsed="0.000159"/>
</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-28T21:04:19.778410" elapsed="0.000134"/>
</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-28T21:04:19.778629" elapsed="0.000098"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.777727" elapsed="0.001049"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.764143" elapsed="0.014668"/>
</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-28T21:04:19.764005" elapsed="0.014827"/>
</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-28T21:04:19.779225" elapsed="0.000100"/>
</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-28T21:04:19.779402" 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-28T21:04:19.779577" elapsed="0.000096"/>
</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-28T21:04:19.779749" elapsed="0.000095"/>
</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-28T21:04:19.779919" elapsed="0.000094"/>
</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-28T21:04:19.780087" elapsed="0.000094"/>
</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-28T21:04:19.780256" elapsed="0.000094"/>
</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-28T21:04:19.780425" 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-28T21:04:19.780594" elapsed="0.000094"/>
</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-28T21:04:19.781208" elapsed="0.000135"/>
</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-28T21:04:19.781421" elapsed="0.000123"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.781751" level="INFO">${timestamp_str} = 1779973456462</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:19.781623" elapsed="0.000147"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.781929" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.781984" 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-28T21:04:19.781847" elapsed="0.000154"/>
</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-28T21:04:19.782075" elapsed="0.000169"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.780789" elapsed="0.001498"/>
</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-28T21:04:19.782793" elapsed="0.000098"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.783044" 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-28T21:04:19.782964" elapsed="0.000111"/>
</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-28T21:04:19.783147" elapsed="0.000095"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.782379" elapsed="0.000904"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.783947" 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-28T21:04:19.783810" elapsed="0.000156"/>
</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-28T21:04:19.784040" elapsed="0.000151"/>
</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-28T21:04:19.784295" elapsed="0.000090"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.783373" elapsed="0.001054"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.785118" 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-28T21:04:19.784914" 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-28T21:04:19.785205" elapsed="0.000134"/>
</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-28T21:04:19.785415" elapsed="0.000087"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.784511" elapsed="0.001033"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.786129" 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-28T21:04:19.786009" elapsed="0.000137"/>
</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-28T21:04:19.786214" elapsed="0.000135"/>
</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-28T21:04:19.786424" elapsed="0.000086"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.785626" elapsed="0.000925"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.787143" 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-28T21:04:19.787023" elapsed="0.000138"/>
</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-28T21:04:19.787230" elapsed="0.000135"/>
</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-28T21:04:19.787443" elapsed="0.000086"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.786632" elapsed="0.000947"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.788176" 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-28T21:04:19.788056" elapsed="0.000138"/>
</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-28T21:04:19.788261" elapsed="0.000133"/>
</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-28T21:04:19.788472" elapsed="0.000085"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.787667" elapsed="0.000931"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.789156" 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-28T21:04:19.789039" 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-28T21:04:19.789234" elapsed="0.000121"/>
</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-28T21:04:19.789422" elapsed="0.000078"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.788681" elapsed="0.000856"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.790060" 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-28T21:04:19.789949" elapsed="0.000126"/>
</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-28T21:04:19.790136" elapsed="0.000103"/>
</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-28T21:04:19.790306" elapsed="0.000077"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.789612" elapsed="0.000808"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.779029" elapsed="0.011421"/>
</kw>
<var name="${ticker}">{'t': 1779973456462, 's': 'doge_usdt', 'c': '0.09822', 'h': '0.10363', 'l': '0.09707', 'a': '6761723', 'v': '6763559', 'o': '0.10201', 'r': '-0.0371'}</var>
<status status="PASS" start="2026-05-28T21:04:19.778904" elapsed="0.011582"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T21:04:19.724986" elapsed="0.065518"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅预测交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:19.567191" elapsed="0.223400"/>
</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-28T21:04:19.792535" 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-28T21:04:19.792134" elapsed="0.000419"/>
</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-28T21:04:19.792943" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.792637" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.792622" elapsed="0.000371"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:19.793013" elapsed="0.000023"/>
</return>
<msg time="2026-05-28T21:04:19.793142" 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-28T21:04:19.791651" elapsed="0.001508"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.908007" 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-28T21:04:19.908244" 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 13: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': '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': '9a609bc477a5ad91dd562d60a78823a2', 'X-Transparent': '00-9a609bc477a5ad91dd562d60a78823a2-abdbcdd97d1d3d2e-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': 'a02d76ec09880962-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779973455910,"s":"btc_usdt","c":"73354.70","h":"78844.40","l":"72608.80","a":"240329","v":"1786614","o":"75991.60","r":"-0.0346"},{"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":1779973456462,"s":"doge_usdt","c":"0.09822","h":"0.10363","l":"0.09707","a":"6761723","v":"6763559","o":"0.10201","r":"-0.0371"}],"ts":1779973459893} 
 </msg>
<msg time="2026-05-28T21:04:19.908348" 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-28T21:04:19.908649" 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-28T21:04:19.793470" elapsed="0.115233"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:19.908840" elapsed="0.000074"/>
</return>
<msg time="2026-05-28T21:04:19.909112" 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-28T21:04:19.793247" elapsed="0.115889"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.910922" 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-28T21:04:19.909880" elapsed="0.001134"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.911756" 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-28T21:04:19.911193" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.912076" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.911933" elapsed="0.000187"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:19.909417" elapsed="0.002868"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.912897" 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-28T21:04:19.912399" elapsed="0.000540"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.913587" level="INFO">${tickers_list} = [{'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}, {'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-28T21:04:19.913068" elapsed="0.000544"/>
</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-28T21:04:19.914509" elapsed="0.000190"/>
</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-28T21:04:19.914812" elapsed="0.000133"/>
</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-28T21:04:19.915044" elapsed="0.000117"/>
</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-28T21:04:19.915253" elapsed="0.000127"/>
</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-28T21:04:19.915480" elapsed="0.000114"/>
</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-28T21:04:19.915685" elapsed="0.000107"/>
</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-28T21:04:19.915878" elapsed="0.000114"/>
</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-28T21:04:19.916084" elapsed="0.000111"/>
</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-28T21:04:19.916282" elapsed="0.000119"/>
</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-28T21:04:19.917401" elapsed="0.000242"/>
</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-28T21:04:19.917749" elapsed="0.000188"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.918253" level="INFO">${timestamp_str} = 1779973455910</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:19.918043" elapsed="0.000240"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.918478" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.918553" 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-28T21:04:19.918379" elapsed="0.000194"/>
</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-28T21:04:19.918667" elapsed="0.000258"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.916610" elapsed="0.002381"/>
</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-28T21:04:19.919782" elapsed="0.000132"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.920133" 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-28T21:04:19.920013" elapsed="0.000161"/>
</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-28T21:04:19.920265" elapsed="0.000116"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.919146" elapsed="0.001286"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.921319" 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-28T21:04:19.921100" elapsed="0.000254"/>
</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-28T21:04:19.921474" elapsed="0.000262"/>
</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-28T21:04:19.921858" elapsed="0.000134"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.920554" elapsed="0.001516"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.923376" 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-28T21:04:19.922938" elapsed="0.000466"/>
</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-28T21:04:19.923516" elapsed="0.000212"/>
</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-28T21:04:19.923840" elapsed="0.000118"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.922213" elapsed="0.001876"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.925229" 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-28T21:04:19.924970" elapsed="0.000294"/>
</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-28T21:04:19.925393" elapsed="0.000259"/>
</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-28T21:04:19.925803" elapsed="0.000145"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.924221" elapsed="0.001798"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.927175" 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-28T21:04:19.926934" 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-28T21:04:19.927324" 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-28T21:04:19.927693" elapsed="0.000151"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.926174" elapsed="0.001744"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.929125" 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-28T21:04:19.928882" elapsed="0.000276"/>
</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-28T21:04:19.929288" elapsed="0.000278"/>
</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-28T21:04:19.929716" elapsed="0.000156"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.928069" elapsed="0.001880"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.931033" 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-28T21:04:19.930815" elapsed="0.000248"/>
</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-28T21:04:19.931182" elapsed="0.000235"/>
</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-28T21:04:19.931548" elapsed="0.000149"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.930108" elapsed="0.001661"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.932781" 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-28T21:04:19.932570" elapsed="0.000241"/>
</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-28T21:04:19.932929" elapsed="0.000236"/>
</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-28T21:04:19.933293" elapsed="0.000161"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.931919" elapsed="0.001608"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.914128" elapsed="0.019456"/>
</kw>
<var name="${ticker}">{'t': 1779973455910, 's': 'btc_usdt', 'c': '73354.70', 'h': '78844.40', 'l': '72608.80', 'a': '240329', 'v': '1786614', 'o': '75991.60', 'r': '-0.0346'}</var>
<status status="PASS" start="2026-05-28T21:04:19.913876" elapsed="0.019742"/>
</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-28T21:04:19.934222" elapsed="0.000167"/>
</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-28T21:04:19.934508" elapsed="0.000148"/>
</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-28T21:04:19.934773" elapsed="0.000138"/>
</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-28T21:04:19.935007" elapsed="0.000122"/>
</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-28T21:04:19.935223" elapsed="0.000120"/>
</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-28T21:04:19.935440" elapsed="0.000117"/>
</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-28T21:04:19.935705" elapsed="0.000126"/>
</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-28T21:04:19.935930" elapsed="0.000123"/>
</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-28T21:04:19.936148" elapsed="0.000170"/>
</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-28T21:04:19.937064" elapsed="0.000319"/>
</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-28T21:04:19.937498" elapsed="0.000170"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.937931" 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-28T21:04:19.937767" elapsed="0.000188"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.938156" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.938227" 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-28T21:04:19.938052" 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-28T21:04:19.938343" elapsed="0.000215"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.936466" elapsed="0.002146"/>
</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-28T21:04:19.939228" elapsed="0.000101"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.939507" 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-28T21:04:19.939417" elapsed="0.000124"/>
</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-28T21:04:19.939621" elapsed="0.000108"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.938727" elapsed="0.001047"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.940581" 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-28T21:04:19.940418" elapsed="0.000184"/>
</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-28T21:04:19.940694" 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-28T21:04:19.940952" elapsed="0.000104"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.939874" elapsed="0.001231"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.941852" 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-28T21:04:19.941707" elapsed="0.000165"/>
</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-28T21:04:19.941954" elapsed="0.000156"/>
</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-28T21:04:19.942202" elapsed="0.000101"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.941204" elapsed="0.001149"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.943075" 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-28T21:04:19.942931" elapsed="0.000165"/>
</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-28T21:04:19.943188" elapsed="0.000166"/>
</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-28T21:04:19.943443" elapsed="0.000105"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.942453" elapsed="0.001145"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.944313" 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-28T21:04:19.944166" elapsed="0.000167"/>
</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-28T21:04:19.944415" elapsed="0.000163"/>
</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-28T21:04:19.944667" elapsed="0.000101"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.943697" elapsed="0.001144"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.945560" 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-28T21:04:19.945413" elapsed="0.000177"/>
</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-28T21:04:19.945671" elapsed="0.000173"/>
</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-28T21:04:19.945935" elapsed="0.000103"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.944942" elapsed="0.001146"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.946813" 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-28T21:04:19.946668" 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-28T21:04:19.946915" 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-28T21:04:19.947167" elapsed="0.000099"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.946187" elapsed="0.001123"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.948030" 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-28T21:04:19.947807" elapsed="0.000241"/>
</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-28T21:04:19.948121" elapsed="0.000126"/>
</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-28T21:04:19.948325" elapsed="0.000089"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.947409" elapsed="0.001050"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.933922" elapsed="0.014572"/>
</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-28T21:04:19.933728" elapsed="0.014787"/>
</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-28T21:04:19.948880" elapsed="0.000095"/>
</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-28T21:04:19.949051" elapsed="0.000092"/>
</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-28T21:04:19.949215" elapsed="0.000089"/>
</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-28T21:04:19.949375" 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-28T21:04:19.949551" elapsed="0.000091"/>
</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-28T21:04:19.949720" elapsed="0.000092"/>
</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-28T21:04:19.949882" elapsed="0.000090"/>
</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-28T21:04:19.950043" elapsed="0.000092"/>
</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-28T21:04:19.950205" elapsed="0.000090"/>
</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-28T21:04:19.950814" 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-28T21:04:19.951016" elapsed="0.000117"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.951327" 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-28T21:04:19.951208" elapsed="0.000137"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.951495" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.951552" 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-28T21:04:19.951420" elapsed="0.000149"/>
</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-28T21:04:19.951644" elapsed="0.000158"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.950391" elapsed="0.001471"/>
</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-28T21:04:19.952356" elapsed="0.000088"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.952595" 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-28T21:04:19.952515" elapsed="0.000110"/>
</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-28T21:04:19.952697" elapsed="0.000092"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.951952" elapsed="0.000877"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.953458" 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-28T21:04:19.953328" 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-28T21:04:19.953550" 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-28T21:04:19.953779" elapsed="0.000092"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.952916" elapsed="0.001008"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.954551" 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-28T21:04:19.954424" elapsed="0.000145"/>
</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-28T21:04:19.954648" elapsed="0.000153"/>
</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-28T21:04:19.954886" elapsed="0.000091"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.954012" elapsed="0.001009"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.955747" 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-28T21:04:19.955613" elapsed="0.000152"/>
</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-28T21:04:19.955838" elapsed="0.000137"/>
</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-28T21:04:19.956046" elapsed="0.000078"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.955109" elapsed="0.001054"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.956729" 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-28T21:04:19.956613" elapsed="0.000132"/>
</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-28T21:04:19.956810" elapsed="0.000128"/>
</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-28T21:04:19.957011" elapsed="0.000082"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.956244" elapsed="0.000889"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.957701" 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-28T21:04:19.957580" elapsed="0.000137"/>
</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-28T21:04:19.957783" elapsed="0.000131"/>
</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-28T21:04:19.957986" elapsed="0.000083"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.957212" elapsed="0.000897"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.958694" 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-28T21:04:19.958580" elapsed="0.000131"/>
</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-28T21:04:19.958774" elapsed="0.000129"/>
</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-28T21:04:19.958973" elapsed="0.000081"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.958188" elapsed="0.000920"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.959669" 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-28T21:04:19.959554" elapsed="0.000131"/>
</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-28T21:04:19.959753" 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-28T21:04:19.959945" elapsed="0.000081"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.959189" elapsed="0.000878"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.948698" elapsed="0.011400"/>
</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-28T21:04:19.948579" elapsed="0.011537"/>
</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-28T21:04:19.960426" elapsed="0.000076"/>
</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-28T21:04:19.960562" elapsed="0.000076"/>
</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-28T21:04:19.960697" elapsed="0.000074"/>
</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-28T21:04:19.960831" elapsed="0.000073"/>
</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-28T21:04:19.960962" elapsed="0.000071"/>
</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-28T21:04:19.961090" elapsed="0.000073"/>
</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-28T21:04:19.961221" elapsed="0.000074"/>
</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-28T21:04:19.961352" elapsed="0.000073"/>
</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-28T21:04:19.961483" elapsed="0.000071"/>
</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-28T21:04:19.961983" 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-28T21:04:19.962142" elapsed="0.000096"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.963070" level="INFO">${timestamp_str} = 1779973456462</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:19.962297" elapsed="0.000789"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.963209" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:19.963250" 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-28T21:04:19.963147" elapsed="0.000116"/>
</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-28T21:04:19.963320" elapsed="0.000129"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.961633" elapsed="0.001850"/>
</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-28T21:04:19.963879" elapsed="0.000076"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.964083" 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-28T21:04:19.964021" elapsed="0.000086"/>
</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-28T21:04:19.964163" elapsed="0.000079"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.963553" elapsed="0.000721"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.964781" 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-28T21:04:19.964680" elapsed="0.000116"/>
</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-28T21:04:19.964855" elapsed="0.000119"/>
</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-28T21:04:19.965038" elapsed="0.000074"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.964343" elapsed="0.000804"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.965660" 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-28T21:04:19.965555" elapsed="0.000133"/>
</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-28T21:04:19.965748" elapsed="0.000120"/>
</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-28T21:04:19.965940" elapsed="0.000075"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.965219" elapsed="0.000831"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.966564" 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-28T21:04:19.966460" 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-28T21:04:19.966638" 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-28T21:04:19.966818" elapsed="0.000071"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.966121" elapsed="0.000803"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.967439" 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-28T21:04:19.967334" 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-28T21:04:19.967513" 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-28T21:04:19.967697" elapsed="0.000072"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.966997" elapsed="0.000807"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.968321" 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-28T21:04:19.968215" 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-28T21:04:19.968394" 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-28T21:04:19.968576" elapsed="0.000075"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.967876" elapsed="0.000811"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.969188" 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-28T21:04:19.969091" 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-28T21:04:19.969257" 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-28T21:04:19.969423" elapsed="0.000069"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.968758" elapsed="0.000767"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.969988" 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-28T21:04:19.969891" 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-28T21:04:19.970055" elapsed="0.000091"/>
</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-28T21:04:19.970207" elapsed="0.000131"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.969591" elapsed="0.000782"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T21:04:19.960276" elapsed="0.010124"/>
</kw>
<var name="${ticker}">{'t': 1779973456462, 's': 'doge_usdt', 'c': '0.09822', 'h': '0.10363', 'l': '0.09707', 'a': '6761723', 'v': '6763559', 'o': '0.10201', 'r': '-0.0371'}</var>
<status status="PASS" start="2026-05-28T21:04:19.960169" elapsed="0.010246"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T21:04:19.913685" elapsed="0.056745"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅交割交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T21:04:19.790723" elapsed="0.179782"/>
</test>
<doc>期货U本位Tickers接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:19.205354" elapsed="0.765384"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:12.485100" elapsed="7.486272"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:11.921515" elapsed="8.050352"/>
</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-28T21:04:19.975568" 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-28T21:04:19.975471" elapsed="0.000111"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.975786" 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-28T21:04:19.975721" elapsed="0.000088"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.975627" elapsed="0.000199"/>
</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-28T21:04:19.975887" elapsed="0.000010"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.975838" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.975614" elapsed="0.000309"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.976311" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.976250" elapsed="0.000084"/>
</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-28T21:04:19.976446" 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-28T21:04:19.976508" 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-28T21:04:19.976564" 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-28T21:04:19.976618" 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-28T21:04:19.976674" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.976366" elapsed="0.000331"/>
</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-28T21:04:19.976786" 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-28T21:04:19.976845" 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-28T21:04:19.976900" elapsed="0.000009"/>
</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-28T21:04:19.976956" 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-28T21:04:19.977009" 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-28T21:04:19.977063" 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-28T21:04:19.977118" 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-28T21:04:19.977172" 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-28T21:04:19.977227" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.976708" elapsed="0.000541"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.977412" 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-28T21:04:19.977306" elapsed="0.000127"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.977586" 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-28T21:04:19.977487" elapsed="0.000120"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.977757" 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-28T21:04:19.977660" elapsed="0.000116"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.977924" 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-28T21:04:19.977829" elapsed="0.000114"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.978085" 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-28T21:04:19.977993" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.978246" 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-28T21:04:19.978153" elapsed="0.000112"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.978428" 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-28T21:04:19.978327" elapsed="0.000120"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.978599" 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-28T21:04:19.978498" elapsed="0.000120"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.978769" 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-28T21:04:19.978669" elapsed="0.000119"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.977260" elapsed="0.001544"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.976358" elapsed="0.002456"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.978931" 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-28T21:04:19.978858" elapsed="0.000094"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:19.979137" 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-28T21:04:19.979001" elapsed="0.000224"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:19.976122" elapsed="0.003135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.979346" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:19.979306" elapsed="0.000060"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:19.975360" elapsed="0.004030"/>
</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-28T21:04:19.979951" elapsed="0.000114"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.980222" 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-28T21:04:19.980119" elapsed="0.000116"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.980374" 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-28T21:04:19.980289" 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-28T21:04:19.980936" 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-28T21:04:19.980853" elapsed="0.000096"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.981088" 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-28T21:04:19.981002" elapsed="0.000098"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T21:04:19.981336" 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-28T21:04:19.981220" elapsed="0.000154">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</status>
</kw>
<msg time="2026-05-28T21:04:19.981418" 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-28T21:04:19.981154" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.981613" 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-28T21:04:19.981540" elapsed="0.000085"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T21:04:19.981829" 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-28T21:04:19.981741" elapsed="0.000115">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</status>
</kw>
<msg time="2026-05-28T21:04:19.981898" 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-28T21:04:19.981678" elapsed="0.000231"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.981462" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.981454" elapsed="0.000483"/>
</if>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.982108" 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-28T21:04:19.982036" elapsed="0.000086"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T21:04:19.982235" 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-28T21:04:19.982169" elapsed="0.000087"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.981961" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.981954" elapsed="0.000334"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-28T21:04:19.982389" 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-28T21:04:19.983600" 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-28T21:04:19.982331" elapsed="0.001280"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.983799" 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-28T21:04:19.983660" elapsed="0.000151"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:19.984169" 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-28T21:04:19.984091" elapsed="0.000090"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.983842" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.983835" elapsed="0.000373"/>
</if>
<if>
<branch type="IF" condition="'${refresh_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:19.984605" 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-28T21:04:19.984465" elapsed="0.000153"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.984231" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.984224" elapsed="0.000421"/>
</if>
<status status="PASS" start="2026-05-28T21:04:19.980420" elapsed="0.004234"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.980411" elapsed="0.004251"/>
</if>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.984758" 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-28T21:04:19.984702" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.984883" 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-28T21:04:19.984831" elapsed="0.000069"/>
</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-28T21:04:19.984949" elapsed="0.000063"/>
</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-28T21:04:19.985063" elapsed="0.000059"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.985238" 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-28T21:04:19.985172" elapsed="0.000077"/>
</kw>
<if>
<branch type="IF" condition="'${user_id}' == '${EMPTY}'">
<kw name="Split String" owner="String">
<msg time="2026-05-28T21:04:19.985583" 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-28T21:04:19.985506" elapsed="0.000089"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.985886" 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-28T21:04:19.985643" elapsed="0.000255"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.986151" 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-28T21:04:19.985945" elapsed="0.000219"/>
</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-28T21:04:19.986274" elapsed="0.000065"/>
</kw>
<msg time="2026-05-28T21:04:19.986376" 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-28T21:04:19.986214" elapsed="0.000172"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.986707" 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-28T21:04:19.986476" elapsed="0.000242"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.986416" elapsed="0.000318"/>
</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-28T21:04:19.986787" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:19.986744" elapsed="0.000072"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.986409" elapsed="0.000415"/>
</if>
<status status="PASS" start="2026-05-28T21:04:19.985277" elapsed="0.001556"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.985270" elapsed="0.001583"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.986974" 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-28T21:04:19.986898" elapsed="0.000087"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.987156" 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-28T21:04:19.987036" elapsed="0.000133"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:19.987783" 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-28T21:04:19.987461" elapsed="0.000336"/>
</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-28T21:04:19.988099" elapsed="0.000103"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:19.987851" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:19.987844" elapsed="0.000387"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:19.988247" elapsed="0.000017"/>
</return>
<msg time="2026-05-28T21:04:19.988346" 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-28T21:04:19.987257" elapsed="0.001102"/>
</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-28T21:04:19.988410" elapsed="0.000082"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:20.256893" 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-28T21:04:20.257327" 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 13: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': '3412a391cbaae089a5d28c82a9809a42', 'X-Transparent': '00-3412a391cbaae089a5d28c82a9809a42-7d8a54e3e3f853c9-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': 'a02d76ee3d78ddc4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":401,"msg":"登录失效，请重试","msgInfo":{"template":"Token expire."},"ts":1779973460245} 
 </msg>
<msg time="2026-05-28T21:04:20.257517" 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-28T21:04:20.257955" 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-28T21:04:19.988542" elapsed="0.269482"/>
</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-28T21:04:20.259207" elapsed="0.001734"/>
</kw>
<msg time="2026-05-28T21:04:20.261158" 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-28T21:04:20.258682" elapsed="0.002537"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.262955" 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-28T21:04:20.261519" elapsed="0.001493"/>
</kw>
<if>
<branch type="IF" condition="${has_code}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.264873" 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-28T21:04:20.263631" elapsed="0.001294"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:20.263261" elapsed="0.001743"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.263178" elapsed="0.001900"/>
</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-28T21:04:20.268877" 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-28T21:04:20.268691" elapsed="0.000271"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.271669" 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-28T21:04:20.270638" elapsed="0.001069"/>
</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-28T21:04:20.272736" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.271928" elapsed="0.000891"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.271898" elapsed="0.000958"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:20.272918" elapsed="0.000088"/>
</return>
<msg time="2026-05-28T21:04:20.273247" 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-28T21:04:20.269313" elapsed="0.003970"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:20.398986" 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-28T21:04:20.399432" 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 13: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': '7ab53bd6f15ba9a94a34750c8fb77ba4', 'X-Transparent': '00-7ab53bd6f15ba9a94a34750c8fb77ba4-0a4eff648b25fdbe-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76ef1fdcddc4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385} 
 </msg>
<msg time="2026-05-28T21:04:20.399657" 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-28T21:04:20.400079" 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-28T21:04:20.273440" elapsed="0.126704"/>
</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-28T21:04:20.403317" elapsed="0.000066"/>
</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-28T21:04:20.403627" elapsed="0.000037"/>
</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-28T21:04:20.403891" elapsed="0.000038"/>
</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-28T21:04:20.404178" elapsed="0.000038"/>
</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-28T21:04:20.404439" elapsed="0.000036"/>
</kw>
<kw name="获取统一请求头" owner="common">
<var>${new_headers}</var>
<arg>token=${new_access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="NOT RUN" start="2026-05-28T21:04:20.405130" elapsed="0.000077"/>
</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-28T21:04:20.405470" elapsed="0.000043"/>
</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-28T21:04:20.405925" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.405700" elapsed="0.000355"/>
</branch>
<status status="NOT RUN" start="2026-05-28T21:04:20.405646" elapsed="0.000485"/>
</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-28T21:04:20.406407" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.406248" elapsed="0.000264"/>
</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-28T21:04:20.406694" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.406548" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-05-28T21:04:20.406216" elapsed="0.000607"/>
</if>
<return>
<value>${final_resp}</value>
<status status="NOT RUN" start="2026-05-28T21:04:20.406886" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-05-28T21:04:20.400631" elapsed="0.006335"/>
</branch>
<branch type="ELSE">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.408496" level="FAIL">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</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-28T21:04:20.407157" elapsed="0.001490">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</kw>
<status status="FAIL" start="2026-05-28T21:04:20.407004" elapsed="0.001789">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</branch>
<status status="FAIL" start="2026-05-28T21:04:20.400519" elapsed="0.008322">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</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-28T21:04:20.267352" elapsed="0.141691">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</kw>
<msg time="2026-05-28T21:04:20.409299" level="INFO">${refresh_status} = FAIL</msg>
<msg time="2026-05-28T21:04:20.409377" level="INFO">${refresh_result} = Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</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-28T21:04:20.266536" elapsed="0.142886"/>
</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-28T21:04:20.409886" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.409582" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Skip" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.410497" level="SKIP">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</msg>
<arg>Token已失效且refreshToken不可用: ${refresh_result}</arg>
<doc>Skips the rest of the current test.</doc>
<status status="SKIP" start="2026-05-28T21:04:20.410158" elapsed="0.000449">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</kw>
<status status="SKIP" start="2026-05-28T21:04:20.410010" elapsed="0.000666">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</branch>
<status status="SKIP" start="2026-05-28T21:04:20.409548" elapsed="0.001166">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</if>
<status status="SKIP" start="2026-05-28T21:04:20.265203" elapsed="0.145570">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</branch>
<status status="SKIP" start="2026-05-28T21:04:20.265168" elapsed="0.145646">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</if>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T21:04:20.411076" elapsed="0.000100"/>
</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-28T21:04:20.411331" elapsed="0.000023"/>
</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-28T21:04:20.411487" elapsed="0.000023"/>
</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-28T21:04:20.411654" elapsed="0.000022"/>
</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-28T21:04:20.411887" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.411765" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-05-28T21:04:20.411743" elapsed="0.000236"/>
</if>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-05-28T21:04:20.412135" elapsed="0.000028"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T21:04:20.412343" elapsed="0.000029"/>
</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-28T21:04:20.412509" elapsed="0.000022"/>
</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-28T21:04:20.412663" 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-28T21:04:20.412812" elapsed="0.000023"/>
</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-28T21:04:20.412952" elapsed="0.000023"/>
</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-28T21:04:20.413124" elapsed="0.000023"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T21:04:20.413332" 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-28T21:04:20.413588" elapsed="0.000028"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="SKIP" start="2026-05-28T21:04:19.979419" elapsed="0.434508">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779973460385}</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="SKIP" start="2026-05-28T21:04:19.972998" elapsed="0.441549"/>
</suite>
<status status="SKIP" start="2026-05-28T21:04:19.972242" elapsed="0.443979"/>
</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-28T21:04:20.424339" 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-28T21:04:20.424141" elapsed="0.000229"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.424764" 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-28T21:04:20.424631" elapsed="0.000181"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:20.424445" 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-28T21:04:20.424948" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.424864" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.424427" elapsed="0.000581"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.425830" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.425721" elapsed="0.000152"/>
</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-28T21:04:20.426081" 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-28T21:04:20.426183" 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-28T21:04:20.426278" elapsed="0.000014"/>
</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-28T21:04:20.426375" 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-28T21:04:20.426469" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.425937" elapsed="0.000572"/>
</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-28T21:04:20.426654" 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-28T21:04:20.426798" 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-28T21:04:20.426892" elapsed="0.000014"/>
</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-28T21:04:20.426991" 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-28T21:04:20.427083" 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-28T21:04:20.427180" 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-28T21:04:20.427272" 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-28T21:04:20.427365" elapsed="0.000014"/>
</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-28T21:04:20.427459" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.426530" elapsed="0.000968"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.427819" 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-28T21:04:20.427594" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.428212" 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-28T21:04:20.427943" elapsed="0.000370"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.428829" 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-28T21:04:20.428511" elapsed="0.000371"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.429252" 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-28T21:04:20.429011" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.429660" 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-28T21:04:20.429420" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.430068" 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-28T21:04:20.429823" elapsed="0.000294"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.430488" 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-28T21:04:20.430242" elapsed="0.000290"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.430901" 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-28T21:04:20.430650" elapsed="0.000294"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.431307" 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-28T21:04:20.431061" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:20.427519" elapsed="0.003869"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.425920" elapsed="0.005500"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.431738" 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-28T21:04:20.431537" elapsed="0.000256"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:20.432267" 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-28T21:04:20.431913" elapsed="0.000527"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:20.425309" elapsed="0.007201"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.432694" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.432612" elapsed="0.000120"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:20.423896" elapsed="0.008886"/>
</kw>
<test id="s1-s4-s1-s1-t1" name="获取余额货币列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.436863" 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-28T21:04:20.436645" elapsed="0.000249"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.438507" 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-28T21:04:20.437863" elapsed="0.000674"/>
</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-28T21:04:20.439226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.438701" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.438678" elapsed="0.000633"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:20.439343" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T21:04:20.439540" 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-28T21:04:20.437103" elapsed="0.002465"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:20.770495" 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-28T21:04:20.770895" 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 13: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': 'c8f691f77720c47580514e3993f8423f', 'X-Transparent': '00-c8f691f77720c47580514e3993f8423f-579d06a88850b5f1-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76f10bba0930-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":1779973460687} 
 </msg>
<msg time="2026-05-28T21:04:20.771358" 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-28T21:04:20.771729" 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-28T21:04:20.439672" elapsed="0.332121"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.773776" 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-28T21:04:20.772335" elapsed="0.001591"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.776037" 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-28T21:04:20.774246" elapsed="0.001857"/>
</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-28T21:04:20.776368" elapsed="0.000367"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.779117" 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-28T21:04:20.776996" elapsed="0.002173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.779692" 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": 1779973460687
}</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-28T21:04:20.779374" elapsed="0.000720"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:20.781552" 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-28T21:04:20.780283" elapsed="0.001313"/>
</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-28T21:04:20.781782" elapsed="0.000915"/>
</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-28T21:04:20.782920" elapsed="0.000231"/>
</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-28T21:04:20.784287" elapsed="0.000253"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:20.784914" 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-28T21:04:20.784699" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.785241" 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-28T21:04:20.785082" elapsed="0.000211"/>
</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-28T21:04:20.785620" elapsed="0.000180"/>
</kw>
<msg time="2026-05-28T21:04:20.785905" 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-28T21:04:20.785441" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.786505" 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-28T21:04:20.786230" elapsed="0.000412">Dictionary does not contain key 'symbols'.</status>
</kw>
<msg time="2026-05-28T21:04:20.786758" 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-28T21:04:20.786077" elapsed="0.000709"/>
</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-28T21:04:20.787108" elapsed="0.000143"/>
</kw>
<msg time="2026-05-28T21:04:20.787337" 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-28T21:04:20.786941" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.787787" 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-28T21:04:20.787618" elapsed="0.000229">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T21:04:20.787941" 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-28T21:04:20.787487" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.788408" 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-28T21:04:20.788240" elapsed="0.000223">Dictionary does not contain key 'count'.</status>
</kw>
<msg time="2026-05-28T21:04:20.788554" 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-28T21:04:20.788096" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.788842" 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-28T21:04:20.788706" elapsed="0.000183"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.789116" 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-28T21:04:20.788993" elapsed="0.000170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.789391" 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-28T21:04:20.789274" elapsed="0.000163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.789687" 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-28T21:04:20.789561" elapsed="0.000172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.789955" 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-28T21:04:20.789837" elapsed="0.000163"/>
</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-28T21:04:20.791211" elapsed="0.000217"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.791707" level="INFO">Length is 29.</msg>
<msg time="2026-05-28T21:04:20.791775" 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-28T21:04:20.791588" elapsed="0.000209"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.791996" level="INFO">货币列表包含 29 种货币</msg>
<arg>货币列表包含 ${list_length} 种货币</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.791889" elapsed="0.000143"/>
</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-28T21:04:20.793158" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.793588" 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-28T21:04:20.793454" elapsed="0.000182"/>
</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-28T21:04:20.793871" elapsed="0.000131"/>
</kw>
<msg time="2026-05-28T21:04:20.794081" 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-28T21:04:20.793742" elapsed="0.000363"/>
</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-28T21:04:20.794324" elapsed="0.000123"/>
</kw>
<msg time="2026-05-28T21:04:20.794521" 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-28T21:04:20.794211" elapsed="0.000330"/>
</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-28T21:04:20.794762" elapsed="0.000116"/>
</kw>
<msg time="2026-05-28T21:04:20.794957" 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-28T21:04:20.794652" elapsed="0.000326"/>
</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-28T21:04:20.795354" elapsed="0.000227"/>
</kw>
<msg time="2026-05-28T21:04:20.795690" 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-28T21:04:20.795084" elapsed="0.000636"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.796022" 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-28T21:04:20.795854" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.796534" 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-28T21:04:20.796335" elapsed="0.000273">Dictionary does not contain key 'contractAddress'.</status>
</kw>
<msg time="2026-05-28T21:04:20.796713" 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-28T21:04:20.796180" elapsed="0.000560"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.797222" 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-28T21:04:20.797034" elapsed="0.000250">Dictionary does not contain key 'withdrawFee'.</status>
</kw>
<msg time="2026-05-28T21:04:20.797384" 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-28T21:04:20.796879" elapsed="0.000531"/>
</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-28T21:04:20.797696" elapsed="0.000163"/>
</kw>
<msg time="2026-05-28T21:04:20.797952" 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-28T21:04:20.797545" elapsed="0.000433"/>
</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-28T21:04:20.798256" elapsed="0.000154"/>
</kw>
<msg time="2026-05-28T21:04:20.798505" 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-28T21:04:20.798109" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.799045" 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-28T21:04:20.798865" elapsed="0.000240">Dictionary does not contain key 'networkList'.</status>
</kw>
<msg time="2026-05-28T21:04:20.799216" 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-28T21:04:20.798674" elapsed="0.000568"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.799874" 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-28T21:04:20.799516" elapsed="0.000409">Dictionary does not contain key 'isMarginTradingAllowed'.</status>
</kw>
<msg time="2026-05-28T21:04:20.800011" 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-28T21:04:20.799369" elapsed="0.000666"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.800417" 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-28T21:04:20.800267" elapsed="0.000199">Dictionary does not contain key 'isDebitEnabled'.</status>
</kw>
<msg time="2026-05-28T21:04:20.800556" 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-28T21:04:20.800143" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.800961" 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-28T21:04:20.800811" elapsed="0.000199">Dictionary does not contain key 'debitEnabled'.</status>
</kw>
<msg time="2026-05-28T21:04:20.801095" 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-28T21:04:20.800690" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.801505" 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-28T21:04:20.801353" elapsed="0.000200">Dictionary does not contain key 'ipoPurchasingAllowed'.</status>
</kw>
<msg time="2026-05-28T21:04:20.801638" 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-28T21:04:20.801224" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.802040" 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-28T21:04:20.801889" elapsed="0.000200">Dictionary does not contain key 'ipoSellingAllowed'.</status>
</kw>
<msg time="2026-05-28T21:04:20.802172" 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-28T21:04:20.801766" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:20.802576" 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-28T21:04:20.802420" elapsed="0.000205">Dictionary does not contain key 'isLegalMoney'.</status>
</kw>
<msg time="2026-05-28T21:04:20.802706" 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-28T21:04:20.802299" 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-28T21:04:20.803110" 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-28T21:04:20.802961" elapsed="0.000208">Dictionary does not contain key 'trading'.</status>
</kw>
<msg time="2026-05-28T21:04:20.803251" 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-28T21:04:20.802840" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.803509" 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-28T21:04:20.803376" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.803758" 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-28T21:04:20.803644" elapsed="0.000151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.804004" 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-28T21:04:20.803889" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.804244" 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-28T21:04:20.804133" elapsed="0.000175"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.804515" 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-28T21:04:20.804402" elapsed="0.000151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.804767" 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-28T21:04:20.804652" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.805011" 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-28T21:04:20.804902" elapsed="0.000148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.805379" 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-28T21:04:20.805145" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.805633" 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-28T21:04:20.805515" elapsed="0.000156"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.805874" 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-28T21:04:20.805764" elapsed="0.000148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.806124" 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-28T21:04:20.806004" elapsed="0.000159"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.806366" 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-28T21:04:20.806252" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.806609" 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-28T21:04:20.806498" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.806853" 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-28T21:04:20.806741" elapsed="0.000149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.807102" 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-28T21:04:20.806983" elapsed="0.000164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.807354" 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-28T21:04:20.807239" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.807596" 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-28T21:04:20.807484" elapsed="0.000151"/>
</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-28T21:04:20.808660" elapsed="0.000208"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.809075" 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-28T21:04:20.808960" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.809290" level="INFO">货币符号: btc</msg>
<arg>货币符号: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.809195" elapsed="0.000128"/>
</kw>
<arg>${currency_item['currency']}</arg>
<doc>验证货币符号格式</doc>
<status status="PASS" start="2026-05-28T21:04:20.807958" elapsed="0.001410"/>
</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-28T21:04:20.807745" elapsed="0.001659"/>
</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-28T21:04:20.810194" elapsed="0.000169"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.810557" 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-28T21:04:20.810449" elapsed="0.000142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.810769" level="INFO">货币名称: BTC</msg>
<arg>货币名称: ${name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.810673" elapsed="0.000131"/>
</kw>
<arg>${currency_item['displayName']}</arg>
<doc>验证货币名称格式</doc>
<status status="PASS" start="2026-05-28T21:04:20.809661" elapsed="0.001189"/>
</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-28T21:04:20.809494" elapsed="0.001392"/>
</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-28T21:04:20.811666" elapsed="0.000192"/>
</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-28T21:04:20.811946" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.812350" level="INFO">货币精度: 8</msg>
<arg>货币精度: ${precision}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.812230" elapsed="0.000156"/>
</kw>
<arg>${currency_item['maxPrecision']}</arg>
<doc>验证货币精度格式</doc>
<status status="PASS" start="2026-05-28T21:04:20.811149" elapsed="0.001280"/>
</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-28T21:04:20.810975" elapsed="0.001490"/>
</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-28T21:04:20.813246" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.813633" level="INFO">充值状态: 1</msg>
<arg>充值状态: ${deposit_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.813531" elapsed="0.000137"/>
</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-28T21:04:20.813753" elapsed="0.000128"/>
</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-28T21:04:20.814151" elapsed="0.000165"/>
</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-28T21:04:20.813980" elapsed="0.000378"/>
</kw>
<arg>${currency_item['depositStatus']}</arg>
<doc>验证充值状态值</doc>
<status status="PASS" start="2026-05-28T21:04:20.812724" elapsed="0.001682"/>
</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-28T21:04:20.812555" elapsed="0.001884"/>
</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-28T21:04:20.815222" elapsed="0.000189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.815600" level="INFO">提现状态: 1</msg>
<arg>提现状态: ${withdraw_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.815499" elapsed="0.000233"/>
</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-28T21:04:20.815821" elapsed="0.000148"/>
</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-28T21:04:20.816249" elapsed="0.000158"/>
</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-28T21:04:20.816076" elapsed="0.000372"/>
</kw>
<arg>${currency_item['withdrawStatus']}</arg>
<doc>验证提现状态值</doc>
<status status="PASS" start="2026-05-28T21:04:20.814699" elapsed="0.001797"/>
</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-28T21:04:20.814529" elapsed="0.002001"/>
</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-28T21:04:20.816617" elapsed="0.000089"/>
</kw>
<arg>${currency_list[0]}</arg>
<doc>验证单个货币的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:20.792541" elapsed="0.024213"/>
</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-28T21:04:20.792126" elapsed="0.024666"/>
</kw>
<arg>${currency_dict['currencies']}</arg>
<doc>验证货币列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:20.790376" elapsed="0.026463"/>
</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-28T21:04:20.790111" elapsed="0.026760"/>
</kw>
<arg>${data}</arg>
<doc>验证货币字典的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:20.783839" elapsed="0.033076"/>
</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-28T21:04:20.783301" elapsed="0.033648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.817379" 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-28T21:04:20.817031" elapsed="0.000381"/>
</kw>
<doc>验证余额货币列表接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T21:04:20.432846" elapsed="0.384663"/>
</test>
<doc>余额货币列表接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:20.420345" elapsed="0.397387"/>
</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-28T21:04:20.821385" 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-28T21:04:20.821260" elapsed="0.000142"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.821678" 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-28T21:04:20.821594" elapsed="0.000114"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:20.821466" elapsed="0.000283"/>
</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-28T21:04:20.821832" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.821768" elapsed="0.000097"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.821447" elapsed="0.000430"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.822294" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.822217" elapsed="0.000105"/>
</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-28T21:04:20.822461" elapsed="0.000013"/>
</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-28T21:04:20.822540" elapsed="0.000012"/>
</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-28T21:04:20.822614" elapsed="0.000011"/>
</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-28T21:04:20.822686" 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-28T21:04:20.822756" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.822362" elapsed="0.000424"/>
</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-28T21:04:20.822898" elapsed="0.000012"/>
</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-28T21:04:20.822974" 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-28T21:04:20.823046" elapsed="0.001072"/>
</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-28T21:04:20.824189" 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-28T21:04:20.824265" 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-28T21:04:20.824336" 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-28T21:04:20.824406" 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-28T21:04:20.824477" 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-28T21:04:20.824546" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.822800" elapsed="0.001778"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.824798" 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-28T21:04:20.824650" elapsed="0.000174"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.825025" 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-28T21:04:20.824892" elapsed="0.000158"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.825254" 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-28T21:04:20.825121" elapsed="0.000159"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.825476" 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-28T21:04:20.825346" elapsed="0.000155"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.825702" 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-28T21:04:20.825568" elapsed="0.000159"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.825930" 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-28T21:04:20.825794" elapsed="0.000161"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.826164" 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-28T21:04:20.826021" elapsed="0.000168"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.826396" 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-28T21:04:20.826255" elapsed="0.000165"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.826631" 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-28T21:04:20.826489" elapsed="0.000167"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:20.824591" elapsed="0.002087"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.822352" elapsed="0.004353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.826858" 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-28T21:04:20.826763" elapsed="0.000123"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:20.827120" 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-28T21:04:20.826951" elapsed="0.000271"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:20.822055" elapsed="0.005208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.827388" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:20.827333" elapsed="0.000082"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:20.821111" elapsed="0.006337"/>
</kw>
<test id="s1-s4-s1-s2-t1" name="获取货币价格转换" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.828279" 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-28T21:04:20.828158" elapsed="0.000139"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:20.829304" 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-28T21:04:20.828885" 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-28T21:04:20.829734" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:20.829401" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:20.829390" elapsed="0.000396"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:20.829806" elapsed="0.000019"/>
</return>
<msg time="2026-05-28T21:04:20.829922" 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-28T21:04:20.828413" elapsed="0.001524"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:21.135684" 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-28T21:04:21.136134" 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 13: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': '1efb072c39e39987c6c8bb865deded79', 'X-Transparent': '00-1efb072c39e39987c6c8bb865deded79-9e8c405e005c7b0d-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.008', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76f3680f90e4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"btc":"0.00000012769011875037571741401972","usd":"0.00888493215384550207","usdt":"0.0089"},"ksm":{"btc":"0.00006355811528810836271282104919","usd":"4.422499937251188109","usdt":"4.43"},"vanry":{"btc":"0.00000006494979411044391828463677","usd":"0.0045193357146582683001","usdt":"0.004527"},"pyth":{"btc":"0.00000055093264719263230884251203","usd":"0.03833498816940081792","usdt":"0.0384"},"bal":{"btc":"0.00001387374661029363131902888365","usd":"0.9653628531200674721","usdt":"0.967"},"fio":{"btc":"0.00000001348637209273631172687399","usd":"0.000938408564563457522","usdt":"0.00094"},"mbox":{"btc":"0.00000015064564571673539694912438","usd":"0.01048222332757053615","usdt":"0.0105"},"theta":{"btc":"0.00000259684398806943874740871555","usd":"0.1806935640276444803","usdt":"0.181"},"vib":{"btc":"0.00000003199426570936380335205213","usd":"0.002226224573379266249","usdt":"0.00223"},"fis":{"btc":"0.00000027403160316091867445031197","usd":"0.01906766338634259433","usdt":"0.0191"},"vic":{"btc":"0.00000060114786243154410782555349","usd":"0.04182906261192432997","usdt":"0.0419"},"bar":{"btc":"0.00000517934077178490269510799069","usd":"0.3603888210717108143","usdt":"0.361"},"stpt":{"btc":"0.00000101033013060690539553879419","usd":"0.070300777783573062446","usdt":"0.07042"},"rad":{"btc":"0.00000371592592767947312474506811","usd":"0.2585615087467398917","usdt":"0.259"},"bat":{"btc":"0.00000148063148933019933001425108","usd":"0.10302528070526469816","usdt":"0.1032"},"cake":{"btc":"0.00001908178179078648361355575517","usd":"1.327748288158934579","usdt":"1.33"},"ssv":{"btc":"0.0000338450550710265525145699447","usd":"2.3550061742608471217","usdt":"2.359"},"ape":{"btc":"0.00000179196582381145248370910814","usd":"0.12468854224891047287","usdt":"0.1249"},"qi":{"btc":"0.00000002123386244388270356997182","usd":"0.001477494335695656524","usdt":"0.00148"},"farm":{"btc":"0.00008321378525305383831475442106","usd":"5.79018050475324854","usdt":"5.8"},"ctk":{"btc":"0.00000214203761004843759661945432","usd":"0.14904723264821724259","usdt":"0.1493"},"band":{"btc":"0.00000271162162290123714508423889","usd":"0.1886800198962696507","usdt":"0.189"},"iotx":{"btc":"0.00000005710187332881970284357286","usd":"0.003973261794641022274","usdt":"0.00398"},"near":{"btc":"0.00007562411414980116926846044022","usd":"5.2620761104404091473","usdt":"5.271"},"shib":{"btc":"0.00000000012209470905232554552733","usd":"0.000008495592430250025013","usdt":"0.00000851"},"xmr":{"btc":"0.00170301315681680872551057754815","usd":"118.49903895072596581","usdt":"118.7"},"dock":{"btc":"0.00000005595409698050171886681763","usd":"0.00389339723595477057","usdt":"0.0039"},"astr":{"btc":"0.00000010232426145254827152772906","usd":"0.0071199254068793394116","usdt":"0.007132"},"waves":{"btc":"0.00001543759188487688448735788915","usd":"1.0741783143300854188","usdt":"1.076"},"reef":{"btc":"0.00000000987087659553466220009501","usd":"0.0006868352047017646544","usdt":"0.000688"},"iris":{"btc":"0.00000007474893468420870648618457","usd":"0.005201179384442142223","usdt":"0.00521"},"apt":{"btc":"0.00001345767768402836212745511154","usd":"0.9364119505963012294","usdt":"0.938"},"stg":{"btc":"0.00000220946947051211915525382428","usd":"0.1537392754710345302","usdt":"0.154"},"ai":{"btc":"0.00000034146346362460023308468193","usd":"0.02375970620915988194","usdt":"0.0238"},"combo":{"btc":"0.00000039598284016970447198055552","usd":"0.02755327274675683788","usdt":"0.0276"},"dent":{"btc":"0.00000000054519376545104238895874","usd":"0.0000379356653759695594","usdt":"0.000038"},"kda":{"btc":"0.0000000860832261238487982566425","usd":"0.0059898419014688778","usdt":"0.006"},"metis":{"btc":"0.00004361550123608339111669886897","usd":"3.034853230077564752","usdt":"3.04"},"glm":{"btc":"0.00000184648520035655672260498172","usd":"0.12848210878650742881","usdt":"0.1287"},"loka":{"btc":"0.00000177474917858668272405777964","usd":"0.12349057386861669731","usdt":"0.1237"},"ray":{"btc":"0.00001015782068261415819428381554","usd":"0.7068013443733275804","usdt":"0.708"},"wld":{"btc":"0.00000422812112311637347437209101","usd":"0.29420106806047971461","usdt":"0.2947"},"agld":{"btc":"0.00000307030173175060713782024933","usd":"0.2136376944857233082","usdt":"0.214"},"iost":{"btc":"0.00000001426112112785095091118377","usd":"0.0009923171416766774222","usdt":"0.000994"},"zro":{"btc":"0.00001665710425496474246266032463","usd":"1.1590344079342278543","usdt":"1.161"},"wing":{"btc":"0.00000467718861939578470527757608","usd":"0.3254480766464756938","usdt":"0.326"},"dgb":{"btc":"0.00000004677188619395784705277576","usd":"0.003254480766464756938","usdt":"0.00326"},"bb":{"btc":"0.00000038020091538033219230017106","usd":"0.02645513506482087695","usdt":"0.0265"},"zrx":{"btc":"0.00000142467739234969761114743345","usd":"0.09913188346930992759","usdt":"0.0993"},"sui":{"btc":"0.0000131879502421736358929176317","usd":"0.91764377930503207896","usdt":"0.9192"},"bsw":{"btc":"0.00000016068868876451775674573268","usd":"0.01118103821607523856","usdt":"0.0112"},"omg":{"btc":"0.00000549497926757234828871567987","usd":"0.3823515747104300329","usdt":"0.383"},"blur":{"btc":"0.00000029512199356126163002318939","usd":"0.020535174652202469391","usdt":"0.02057"},"jst":{"btc":"0.00000136398871793238420837650048","usd":"0.094909044928774368741","usdt":"0.09507"},"pol":{"btc":"0.00000126068884658376565046852948","usd":"0.087721234647011715381","usdt":"0.08787"},"pivx":{"btc":"0.00000081779064817656358343810379","usd":"0.0569034980639543391","usdt":"0.057"},"gmt":{"btc":"0.00000014591106827992371304500905","usd":"0.010152782022989747871","usdt":"0.01017"},"nkn":{"btc":"0.00000010473459178401603787891505","usd":"0.00728764098012046799","usdt":"0.0073"},"porto":{"btc":"0.00000959827971280914100561563926","usd":"0.6678673720137798747","usdt":"0.669"},"rsr":{"btc":"0.0000000228264021271739063377197","usd":"0.0015883064108728307633","usdt":"0.001591"},"sc":{"btc":"0.0000000124964149923120505469226","usd":"0.0008695253826965654273","usdt":"0.000871"},"twt":{"btc":"0.00000630846575444271943224095154","usd":"0.43895558067931092811","usdt":"0.4397"},"arb":{"btc":"0.00000147202316671781445018858683","usd":"0.10242629651511781038","usdt":"0.1026"},"btc":{"btc":"1","usd":"69581.986772326961328537","usdt":"69699.99"},"cvc":{"btc":"0.0000003883788218620978281345521","usd":"0.027024170045460420341","usdt":"0.02707"},"ardr":{"btc":"0.00000051033005887088362566479565","usd":"0.035509779405874663891","usdt":"0.03557"},"vite":{"btc":"0.00000001233859574441832775011876","usd":"0.000858544005877205818","usdt":"0.00086"},"gmx":{"btc":"0.00008809183473340527021596416298","usd":"6.129604879169818282","usdt":"6.14"},"sei":{"btc":"0.00000099010057246780092794848321","usd":"0.068893164936727876163","usdt":"0.06901"},"matic":{"btc":"0.00000544332933189803900976169437","usd":"0.37875766956954870622","usdt":"0.3794"},"audio":{"btc":"0.00000026771883324516976257815819","usd":"0.018628408313568209958","usdt":"0.01866"},"ark":{"btc":"0.00000207460574958475603798508436","usd":"0.14435518982539995498","usdt":"0.1446"},"cvp":{"btc":"0.00000048637022759974571015003015","usd":"0.03384260674329915957","usdt":"0.0339"},"key":{"btc":"0.00000001797704705553042403592884","usd":"0.0012508786504234173139","usdt":"0.001253"},"btt":{"btc":"0","usd":"0","usdt":"0"},"cvx":{"btc":"0.0000218220978223956703580588749","usd":"1.5184249220223605223","usdt":"1.521"},"flm":{"btc":"0.00000023959831271137915514765497","usd":"0.01667172662575504321","usdt":"0.0167"},"one":{"btc":"0.00000002553802375007514348280394","usd":"0.001776986430769100414","usdt":"0.00178"},"btx":{"btc":"0.00000258106206328006646772833109","usd":"0.17959542634570851937","usdt":"0.1799"},"ong":{"btc":"0.00000088220959572591043413349127","usd":"0.061385896420220215987","usdt":"0.06149"},"gno":{"btc":"0.00162582519739242430307378810241","usd":"113.128147379075538716","usdt":"113.32"},"storj":{"btc":"0.0000014332857149620824909730977","usd":"0.09973086765945681537","usdt":"0.0999"},"gns":{"btc":"0.00000664275561589033226547091327","usd":"0.4622161333966817369","usdt":"0.463"},"people":{"btc":"0.00000008895266699464375819853059","usd":"0.00618950329818450706","usdt":"0.0062"},"tnsr":{"btc":"0.00000050502159325991294977230269","usd":"0.03514040582195074976","usdt":"0.0352"},"bttc":{"btc":"0.00000000000459110539327193590702","usd":"0.000000319458234745006816","usdt":"0.00000032"},"vtho":{"btc":"0.00000000677188045507610546285588","usd":"0.0004712008962488850536","usdt":"0.000472"},"polyx":{"btc":"0.00000068866580899079038605314004","usd":"0.0479187352117510224","usdt":"0.048"},"t":{"btc":"0.00000006800574863784055062274758","usd":"0.004731975102160413462","usdt":"0.00474"},"ont":{"btc":"0.00000074447643392775235692286326","usd":"0.051802149377870011507","usdt":"0.05189"},"mana":{"btc":"0.00000118651380007371593597072252","usd":"0.08255998754191269901","usdt":"0.0827"},"cfx":{"btc":"0.00000073414644679289050113206616","usd":"0.051083368349693746171","usdt":"0.05117"},"w":{"btc":"0.00000016068868876451775674573268","usd":"0.01118103821607523856","usdt":"0.0112"},"dodo":{"btc":"0.00000025896703858924513475539953","usd":"0.018019441053585540715","usdt":"0.01805"},"ankr":{"btc":"0.00000006341464324456861471572665","usd":"0.004412516867415406646","usdt":"0.00442"},"mina":{"btc":"0.00000078479207816242154410639083","usd":"0.05460739200172460261","usdt":"0.0547"},"sfp":{"btc":"0.0000037704453042245773636409417","usd":"0.26235507528433684764","usdt":"0.2628"},"dia":{"btc":"0.00000230559573968375031330707508","usd":"0.16042793226100811041","usdt":"0.1607"},"aca":{"btc":"0.00000002582496783715463947699275","usd":"0.00179695257044066334","usdt":"0.0018"},"algo":{"btc":"0.0000015294119841337136490263485","usd":"0.10641952444943039558","usdt":"0.1066"},"asr":{"btc":"0.00001440459317139069890827817909","usd":"1.0023002115124588852","usdt":"1.004"},"df":{"btc":"0.00000002352941514051867152348228","usd":"0.00163722345306815993... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T21:04:21.136673" 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-28T21:04:21.137034" 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-28T21:04:20.829996" elapsed="0.307102"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.139052" 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-28T21:04:21.137638" elapsed="0.001562"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.142055" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.00888493215384550207', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00006355811528810836271...</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-28T21:04:21.139507" elapsed="0.002604"/>
</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-28T21:04:21.142338" elapsed="0.030595"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.175221" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.00888493215384550207",
      "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-28T21:04:21.173135" elapsed="0.002113"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.175543" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.00888493215384550207",
      "usdt": "0.0089"
    },
    "ksm": {
      "btc": "0.00006355811528810836271282104919",
      "usd": "4.422499937251188109",
      "usdt": "4.43"
    },
    "vanry": {
      "btc": "0.00000006494979411044391828463677",
      "usd": "0.0045193357146582683001",
      "usdt": "0.004527"
    },
    "pyth": {
      "btc": "0.00000055093264719263230884251203",
      "usd": "0.03833498816940081792",
      "usdt": "0.0384"
    },
    "bal": {
      "btc": "0.00001387374661029363131902888365",
      "usd": "0.9653628531200674721",
      "usdt": "0.967"
    },
    "fio": {
      "btc": "0.00000001348637209273631172687399",
      "usd": "0.000938408564563457522",
      "usdt": "0.00094"
    },
    "mbox": {
      "btc": "0.00000015064564571673539694912438",
      "usd": "0.01048222332757053615",
      "usdt": "0.0105"
    },
    "theta": {
      "btc": "0.00000259684398806943874740871555",
      "usd": "0.1806935640276444803",
      "usdt": "0.181"
    },
    "vib": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.002226224573379266249",
      "usdt": "0.00223"
    },
    "fis": {
      "btc": "0.00000027403160316091867445031197",
      "usd": "0.01906766338634259433",
      "usdt": "0.0191"
    },
    "vic": {
      "btc": "0.00000060114786243154410782555349",
      "usd": "0.04182906261192432997",
      "usdt": "0.0419"
    },
    "bar": {
      "btc": "0.00000517934077178490269510799069",
      "usd": "0.3603888210717108143",
      "usdt": "0.361"
    },
    "stpt": {
      "btc": "0.00000101033013060690539553879419",
      "usd": "0.070300777783573062446",
      "usdt": "0.07042"
    },
    "rad": {
      "btc": "0.00000371592592767947312474506811",
      "usd": "0.2585615087467398917",
      "usdt": "0.259"
    },
    "bat": {
      "btc": "0.00000148063148933019933001425108",
      "usd": "0.10302528070526469816",
      "usdt": "0.1032"
    },
    "cake": {
      "btc": "0.00001908178179078648361355575517",
      "usd": "1.327748288158934579",
      "usdt": "1.33"
    },
    "ssv": {
      "btc": "0.0000338450550710265525145699447",
      "usd": "2.3550061742608471217",
      "usdt": "2.359"
    },
    "ape": {
      "btc": "0.00000179196582381145248370910814",
      "usd": "0.12468854224891047287",
      "usdt": "0.1249"
    },
    "qi": {
      "btc": "0.00000002123386244388270356997182",
      "usd": "0.001477494335695656524",
      "usdt": "0.00148"
    },
    "farm": {
      "btc": "0.00008321378525305383831475442106",
      "usd": "5.79018050475324854",
      "usdt": "5.8"
    },
    "ctk": {
      "btc": "0.00000214203761004843759661945432",
      "usd": "0.14904723264821724259",
      "usdt": "0.1493"
    },
    "band": {
      "btc": "0.00000271162162290123714508423889",
      "usd": "0.1886800198962696507",
      "usdt": "0.189"
    },
    "iotx": {
      "btc": "0.00000005710187332881970284357286",
      "usd": "0.003973261794641022274",
      "usdt": "0.00398"
    },
    "near": {
      "btc": "0.00007562411414980116926846044022",
      "usd": "5.2620761104404091473",
      "usdt": "5.271"
    },
    "shib": {
      "btc": "0.00000000012209470905232554552733",
      "usd": "0.000008495592430250025013",
      "usdt": "0.00000851"
    },
    "xmr": {
      "btc": "0.00170301315681680872551057754815",
      "usd": "118.49903895072596581",
      "usdt": "118.7"
    },
    "dock": {
      "btc": "0.00000005595409698050171886681763",
      "usd": "0.00389339723595477057",
      "usdt": "0.0039"
    },
    "astr": {
      "btc": "0.00000010232426145254827152772906",
      "usd": "0.0071199254068793394116",
      "usdt": "0.007132"
    },
    "waves": {
      "btc": "0.00001543759188487688448735788915",
      "usd": "1.0741783143300854188",
      "usdt": "1.076"
    },
    "reef": {
      "btc": "0.00000000987087659553466220009501",
      "usd": "0.0006868352047017646544",
      "usdt": "0.000688"
    },
    "iris": {
      "btc": "0.00000007474893468420870648618457",
      "usd": "0.005201179384442142223",
      "usdt": "0.00521"
    },
    "apt": {
      "btc": "0.00001345767768402836212745511154",
      "usd": "0.9364119505963012294",
      "usdt": "0.938"
    },
    "stg": {
      "btc": "0.00000220946947051211915525382428",
      "usd": "0.1537392754710345302",
      "usdt": "0.154"
    },
    "ai": {
      "btc": "0.00000034146346362460023308468193",
      "usd": "0.02375970620915988194",
      "usdt": "0.0238"
    },
    "combo": {
      "btc": "0.00000039598284016970447198055552",
      "usd": "0.02755327274675683788",
      "usdt": "0.0276"
    },
    "dent": {
      "btc": "0.00000000054519376545104238895874",
      "usd": "0.0000379356653759695594",
      "usdt": "0.000038"
    },
    "kda": {
      "btc": "0.0000000860832261238487982566425",
      "usd": "0.0059898419014688778",
      "usdt": "0.006"
    },
    "metis": {
      "btc": "0.00004361550123608339111669886897",
      "usd": "3.034853230077564752",
      "usdt": "3.04"
    },
    "glm": {
      "btc": "0.00000184648520035655672260498172",
      "usd": "0.12848210878650742881",
      "usdt": "0.1287"
    },
    "loka": {
      "btc": "0.00000177474917858668272405777964",
      "usd": "0.12349057386861669731",
      "usdt": "0.1237"
    },
    "ray": {
      "btc": "0.00001015782068261415819428381554",
      "usd": "0.7068013443733275804",
      "usdt": "0.708"
    },
    "wld": {
      "btc": "0.00000422812112311637347437209101",
      "usd": "0.29420106806047971461",
      "usdt": "0.2947"
    },
    "agld": {
      "btc": "0.00000307030173175060713782024933",
      "usd": "0.2136376944857233082",
      "usdt": "0.214"
    },
    "iost": {
      "btc": "0.00000001426112112785095091118377",
      "usd": "0.0009923171416766774222",
      "usdt": "0.000994"
    },
    "zro": {
      "btc": "0.00001665710425496474246266032463",
      "usd": "1.1590344079342278543",
      "usdt": "1.161"
    },
    "wing": {
      "btc": "0.00000467718861939578470527757608",
      "usd": "0.3254480766464756938",
      "usdt": "0.326"
    },
    "dgb": {
      "btc": "0.00000004677188619395784705277576",
      "usd": "0.003254480766464756938",
      "usdt": "0.00326"
    },
    "bb": {
      "btc": "0.00000038020091538033219230017106",
      "usd": "0.02645513506482087695",
      "usdt": "0.0265"
    },
    "zrx": {
      "btc": "0.00000142467739234969761114743345",
      "usd": "0.09913188346930992759",
      "usdt": "0.0993"
    },
    "sui": {
      "btc": "0.0000131879502421736358929176317",
      "usd": "0.91764377930503207896",
      "usdt": "0.9192"
    },
    "bsw": {
      "btc": "0.00000016068868876451775674573268",
      "usd": "0.01118103821607523856",
      "usdt": "0.0112"
    },
    "omg": {
      "btc": "0.00000549497926757234828871567987",
      "usd": "0.3823515747104300329",
      "usdt": "0.383"
    },
    "blur": {
      "btc": "0.00000029512199356126163002318939",
      "usd": "0.020535174652202469391",
      "usdt": "0.02057"
    },
    "jst": {
      "btc": "0.00000136398871793238420837650048",
      "usd": "0.094909044928774368741",
      "usdt": "0.09507"
    },
    "pol": {
      "btc": "0.00000126068884658376565046852948",
      "usd": "0.087721234647011715381",
      "usdt": "0.08787"
    },
    "pivx": {
      "btc": "0.00000081779064817656358343810379",
      "usd": "0.0569034980639543391",
      "usdt": "0.057"
    },
    "gmt": {
      "btc": "0.00000014591106827992371304500905",
      "usd": "0.010152782022989747871",
      "usdt": "0.01017"
    },
    "nkn": {
      "btc": "0.00000010473459178401603787891505",
      "usd": "0.00728764098012046799",
      "usdt": "0.0073"
    },
    "porto": {
      "btc": "0.00000959827971280914100561563926",
      "usd": "0.6678673720137798747",
      "usdt": "0.669"
    },
    "rsr": {
      "btc": "0.0000000228264021271739063377197",
      "usd": "0.0015883064108728307633",
      "usdt": "0.001591"
    },
    "sc": {
      "btc": "0.0000000124964149923120505469226",
      "usd": "0.0008695253826965654273",
      "usdt": "0.000871"
    },
    "twt": {
      "btc": "0.00000630846575444271943224095154",
      "usd": "0.43895558067931092811",
      "usdt": "0.4397"
    },
    "arb": {
      "btc": "0.00000147202316671781445018858683",
      "usd": "0.10242629651511781038",
      "usdt": "0.1026"
    },
    "btc": {
      "btc": "1",
      "usd": "69581.986772326961328537",
      "usdt": "69699.99"
    },
    "cvc": {
      "btc": "0.0000003883788218620978281345521",
      "usd": "0.027024170045460420341",
      "usdt": "0.02707"
    },
    "ardr": {
      "btc": "0.00000051033005887088362566479565",
      "usd": "0.035509779405874663891",
      "usdt": "0.03557"
    },
    "vite": {
      "btc": "0.00000001233859574441832775011876",
      "usd": "0.000858544005877205818",
      "usdt": "0.00086"
    },
    "gmx": {
      "btc": "0.00008809183473340527021596416298",
      "usd": "6.129604879169818282",
      "usdt": "6.14"
    },
    "sei": {
      "btc": "0.00000099010057246780092794848321",
      "usd": "0.068893164936727876163",
      "usdt": "0.06901"
    },
    "matic": {
      "btc": "0.00000544332933189803900976169437",
      "usd": "0.37875766956954870622",
      "usdt": "0.3794"
    },
    "audio": {
      "btc": "0.00000026771883324516976257815819",
      "usd": "0.018628408313568209958",
      "usdt": "0.01866"
    },
    "ark": {
      "btc": "0.00000207460574958475603798508436",
      "usd": "0.14435518982539995498",
      "usdt": "0.1446"
    },
    "cvp": {
      "btc": "0.00000048637022759974571015003015",
      "usd": "0.03384260674329915957",
      "usdt": "0.0339"
    },
    "key": {
      "btc": "0.00000001797704705553042403592884",
      "usd": "0.0012508786504234173139",
      "usdt": "0.001253"
    },
    "btt": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "cvx": {
      "btc": "0.0000218220978223956703580588749",
      "usd": "1.5184249220223605223",
      "usdt": "1.521"
    },
    "flm": {
      "btc": "0.00000023959831271137915514765497",
      "usd": "0.01667172662575504321",
      "usdt": "0.0167"
    },
    "one": {
      "btc": "0.00000002553802375007514348280394",
      "usd": "0.001776986430769100414",
      "usdt": "0.00178"
    },
    "btx": {
      "btc": "0.00000258106206328006646772833109",
      "usd": "0.17959542634570851937",
      "usdt": "0.1799"
    },
    "ong": {
      "btc": "0.00000088220959572591043413349127",
      "usd": "0.061385896420220215987",
      "usdt": "0.06149"
    },
    "gno": {
      "btc": "0.00162582519739242430307378810241",
      "usd": "113.128147379075538716",
      "usdt": "113.32"
    },
    "storj": {
      "btc": "0.0000014332857149620824909730977",
      "usd": "0.09973086765945681537",
      "usdt": "0.0999"
    },
    "gns": {
      "btc": "0.00000664275561589033226547091327",
      "usd": "0.4622161333966817369",
      "usdt": "0.463"
    },
    "people": {
      "btc": "0.00000008895266699464375819853059",
      "usd": "0.00618950329818450706",
      "usdt": "0.0062"
    },
    "tnsr": {
      "btc": "0.00000050502159325991294977230269",
      "usd": "0.03514040582195074976",
      "usdt": "0.0352"
    },
    "bttc": {
      "btc": "0.00000000000459110539327193590702",
      "usd": "0.000000319458234745006816",
      "usdt": "0.00000032"
    },
    "vtho": {
      "btc": "0.00000000677188045507610546285588",
      "usd": "0.0004712008962488850536",
      "usdt": "0.000472"
    },
    "polyx": {
      "btc": "0.00000068866580899079038605314004",
      "usd": "0.0479187352117510224",
      "usdt": "0.048"
    },
    "t": {
      "btc": "0.00000006800574863784055062274758",
      "usd": "0.004731975102160413462",
      "usdt": "0.00474"
    },
    "ont": {
      "btc": "0.00000074447643392775235692286326",
      "usd": "0.051802149377870011507",
      "usdt": "0.05189"
    },
    "mana": {
      "btc": "0.00000118651380007371593597072252",
      "usd": "0.08255998754191269901",
      "usdt": "0.0827"
    },
    "cfx": {
      "btc": "0.00000073414644679289050113206616",
      "usd": "0.051083368349693746171",
      "usdt": "0.05117"
    },
    "w": {
      "btc": "0.00000016068868876451775674573268",
      "usd": "0.01118103821607523856",
      "usdt": "0.0112"
    },
    "dodo": {
      "btc": "0.00000025896703858924513475539953",
      "usd": "0.018019441053585540715",
      "usdt": "0.01805"
    },
    "ankr": {
      "btc": "0.00000006341464324456861471572665",
      "usd": "0.004412516867415406646",
      "usdt": "0.00442"
    },
    "mina": {
      "btc": "0.00000078479207816242154410639083",
      "usd": "0.05460739200172460261",
      "usdt": "0.0547"
    },
    "sfp": {
      "btc": "0.0000037704453042245773636409417",
      "usd": "0.26235507528433684764",
      "usdt": "0.2628"
    },
    "dia": {
      "btc": "0.00000230559573968375031330707508",
      "usd": "0.16042793226100811041",
      "usdt": "0.1607"
    },
    "aca": {
      "btc": "0.00000002582496783715463947699275",
      "usd": "0.00179695257044066334",
      "usdt": "0.0018"
    },
    "algo": {
      "btc": "0.0000015294119841337136490263485",
      "usd": "0.10641952444943039558",
      "usdt": "0.1066"
    },
    "asr": {
      "btc": "0.00001440459317139069890827817909",
      "usd": "1.0023002115124588852",
      "usdt": "1.004"
    },
    "df": {
      "btc": "0.00000002352941514051867152348228",
      "usd": "0.001637223453068159932",
      "usdt": "0.00164"
    },
    "ast": {
      "btc": "0.00000037446203363874227241639489",
      "usd": "0.02605581227138961843",
      "usdt": "0.0261"
    },
    "jup": {
      "btc": "0.0000025538023750075143482803943",
      "usd": "0.1776986430769100414",
      "usdt": "0.178"
    },
    "dusk": {
      "btc": "0.00000175322837205572052449361901",
      "usd": "0.12199311339324947786",
      "usdt": "0.1222"
    },
    "doge": {
      "btc": "0.00000140961282777802407145252101",
      "usd": "0.098083661136552873975",
      "usdt": "0.09825"
    },
    "bel": {
      "btc": "0.00000135294137057982361260023136",
      "usd": "0.09414034855141919609",
      "usdt": "0.0943"
    },
    "acm": {
      "btc": "0.00000512195195436900349627022902",
      "usd": "0.3563955931373982291",
      "usdt": "0.357"
    },
    "juv": {
      "btc": "0.00000563845131111209628581008405",
      "usd": "0.3923346445462114959",
      "usdt": "0.393"
    },
    "bome": {
      "btc": "0.00000000710186615521752585617301",
      "usd": "0.0004941619568711824185",
      "usdt": "0.000495"
    },
    "tia": {
      "btc": "0.00000592826483906238723994078048",
      "usd": "0.41250044561449005116",
      "usdt": "0.4132"
    },
    "ata": {
      "btc": "0.0000000172166452247697596513285",
      "usd": "0.00119796838029377556",
      "usdt": "0.0012"
    },
    "nmr": {
      "btc": "0.00011865138000737159359707225209",
      "usd": "8.255998754191269901",
      "usdt": "8.27"
    },
    "loom": {
      "btc": "0.00000069311344234052257396306657",
      "usd": "0.048228210376660247753",
      "usdt": "0.04831"
    },
    "paxg": {
      "btc": "0.06357992303872640440837939861971",
      "usd": "4424.017363866226891376",
      "usdt": "4431.52"
    },
    "lit": {
      "btc": "0.00001065997283500327618411423015",
      "usd": "0.7417420887985627009",
      "usdt": "0.743"
    },
    "woo": {
      "btc": "0.00000304160732304265753840136849",
      "usd": "0.2116410805185670156",
      "usdt": "0.212"
    },
    "rei": {
      "btc": "0.00000005753228945943894683485607",
      "usd": "0.004003211004148366663",
      "usdt": "0.00401"
    },
    "rare": {
      "btc": "0.00000020946918356803207575783009",
      "usd": "0.01457528196024093598",
      "usdt": "0.0146"
    },
    "zec": {
      "btc": "0.00756112016658825919487219438625",
      "usd": "526.117763415518881563",
      "usdt": "527.01"
    },
    "ren": {
      "btc": "0.00000061319951408888293958148344",
      "usd": "0.042667640478129972862",
      "usdt": "0.04274"
    },
    "atm": {
      "btc": "0.00001407460747124927851496104949",
      "usd": "0.9793391508901615203",
      "usdt": "0.981"
    },
    "hbar": {
      "btc": "0.00000122109056256679520327047393",
      "usd": "0.084965907372336031593",
      "usdt": "0.08511"
    },
    "rep": {
      "btc": "0.00006786227659430080262565317441",
      "usd": "4.721992032324631999",
      "usdt": "4.73"
    },
    "elf": {
      "btc": "0.00000325968482922307449398486284",
      "usd": "0.22681534666895483936",
      "usdt": "0.2272"
    },
    "pepe": {
      "btc": "0.00000000004777619049873608303244",
      "usd": "0.000003324362255315227179",
      "usdt": "0.00000333"
    },
    "icx": {
      "btc": "0.00000050645631369531042974324674",
      "usd": "0.03524023652030856439",
      "usdt": "0.0353"
    },
    "req": {
      "btc": "0.00000097847933694108134018383647",
      "usd": "0.06808453628002957766",
      "usdt": "0.0682"
    },
    "xai": {
      "btc": "0.00000013328552844842588930070148",
      "usd": "0.009274271877440979127",
      "usdt": "0.00929"
    },
    "strax": {
      "btc": "0.00000016284076941761397670214874",
      "usd": "0.011330784263611960505",
      "usdt": "0.01135"
    },
    "chess": {
      "btc": "0.00000004031564423466918718352757",
      "usd": "0.002805242623854591103",
      "usdt": "0.00281"
    },
    "tusd": {
      "btc": "0.00001434576963353940222946947338",
      "usd": "0.99820715287978848537",
      "usdt": "0.9999"
    },
    "ctsi": {
      "btc": "0.00000038938312616687606411421293",
      "usd": "0.027094051534310890582",
      "usdt": "0.02714"
    },
    "sxp": {
      "btc": "0.00000003156384957874455936076892",
      "usd": "0.00219627536387192186",
      "usdt": "0.0022"
    },
    "rvn": {
      "btc": "0.00000007259685403111248652976851",
      "usd": "0.005051433336905420278",
      "usdt": "0.00506"
    },
    "chr": {
      "btc": "0.00000027417507520445842244740638",
      "usd": "0.019077646456178375793",
      "usdt": "0.01911"
    },
    "fida": {
      "btc": "0.00000040645629934810607576844703",
      "usd": "0.028282036844768884679",
      "usdt": "0.02833"
    },
    "ntrn": {
      "btc": "0.00000002295552696635967953510467",
      "usd": "0.00159729117372503408",
      "usdt": "0.0016"
    },
    "sand": {
      "btc": "0.00000096040185945507309254994154",
      "usd": "0.066826669480721113322",
      "usdt": "0.06694"
    },
    "osmo": {
      "btc": "0.00000078766151903321650404827892",
      "usd": "0.05480705339844023187",
      "usdt": "0.0549"
    },
    "kava": {
      "btc": "0.00000077274042650508271235046088",
      "usd": "0.053768814135518959718",
      "usdt": "0.05386"
    },
    "ocean": {
      "btc": "0.00000878479322593876986209036759",
      "usd": "0.61126336604489897949",
      "usdt": "0.6123"
    },
    "vidt": {
      "btc": "0.00000001649928500707101966585648",
      "usd": "0.001148053031114868245",
      "usdt": "0.00115"
    },
    "adx": {
      "btc": "0.00000085796282036769302262453696",
      "usd": "0.05969875761797314874",
      "usdt": "0.0598"
    },
    "chz": {
      "btc": "0.00000048923966847054067009191823",
      "usd": "0.03404226814001478883",
      "usdt": "0.0341"
    },
    "xrp": {
      "btc": "0.00003067001874749192933887078031",
      "usd": "2.13408083879500334551",
      "usdt": "2.1377"
    },
    "c98": {
      "btc": "0.00000027259688272552119447936793",
      "usd": "0.0189678326879847797",
      "usdt": "0.019"
    },
    "psg": {
      "btc": "0.0000160545216720978008748638271",
      "usd": "1.1171055146239457097",
      "usdt": "1.119"
    },
    "perp": {
      "btc": "0.00000179340054424684996368005218",
      "usd": "0.1247883729472682875",
      "usdt": "0.125"
    },
    "for": {
      "btc": "0.00000004390244532316288711088768",
      "usd": "0.003054819369749127678",
      "usdt": "0.00306"
    },
    "uma": {
      "btc": "0.00000604017303302339067767441574",
      "usd": "0.4202872400863995923",
      "usdt": "0.421"
    },
    "syn": {
      "btc": "0.0000005738881741589919883776167",
      "usd": "0.039932279343125852",
      "usdt": "0.04"
    },
    "jasmy": {
      "btc": "0.00000007690101533730492644260064",
      "usd": "0.005350925431978864168",
      "usdt": "0.00536"
    },
    "sys": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.002226224573379266249",
      "usdt": "0.00223"
    },
    "lunc": {
      "btc": "0.00000000119899586786167401171794",
      "usd": "0.000083428514617625686291",
      "usdt": "0.00008357"
    },
    "luna": {
      "btc": "0.0000008421808955783207429441525",
      "usd": "0.05860061993603718781",
      "usdt": "0.0587"
    },
    "auction": {
      "btc": "0.00006327117120102886671863224084",
      "usd": "4.402533797579625183",
      "usdt": "4.41"
    },
    "not": {
      "btc": "0.00000000622668668962506307389714",
      "usd": "0.0004332652308729154942",
      "usdt": "0.000434"
    },
    "gal": {
      "btc": "0.00003647059346780394086139754109",
      "usd": "2.5376963522556478946",
      "usdt": "2.542"
    },
    "yfii": {
      "btc": "0.00624820749615602527346130178785",
      "usd": "434.76269134828271365",
      "usdt": "435.5"
    },
    "alpha": {
      "btc": "0.00000013916788223355555718157205",
      "usd": "0.00968357774070801911",
      "usdt": "0.0097"
    },
    "tko": {
      "btc": "0.00000072453381987572738532674108",
      "usd": "0.05041450267069638815",
      "usdt": "0.0505"
    },
    "pixel": {
      "btc": "0.00000009053085947358098616656903",
      "usd": "0.006299317066378103153",
      "usdt": "0.00631"
    },
    "nexo": {
      "btc": "0.00001173601316155138616232226145",
      "usd": "0.8166151125669236734",
      "usdt": "0.818"
    },
    "bico": {
      "btc": "0.0000003299857001414203933171296",
      "usd": "0.0229610606222973649",
      "usdt": "0.023"
    },
    "troy": {
      "btc": "0.00000000098995710042426117995139",
      "usd": "0.0000688831818668920947",
      "usdt": "0.000069"
    },
    "mask": {
      "btc": "0.00000615495066785518907534993907",
      "usd": "0.4282736959550247627",
      "usdt": "0.429"
    },
    "enj": {
      "btc": "0.00000054132002027546919303718695",
      "usd": "0.037666122490403459899",
      "usdt": "0.03773"
    },
    "aave": {
      "btc": "0.00115566731071267011659542562345",
      "usd": "80.413627527219684465",
      "usdt": "80.55"
    },
    "wan": {
      "btc": "0.00000077905319642083162422261467",
      "usd": "0.05420806920829334409",
      "usdt": "0.0543"
    },
    "gm": {
      "btc": "0.01025179487113269313238065026746",
      "usd": "713.340255115764438665",
      "usdt": "714.55"
    },
    "oax": {
      "btc": "0.00000051362991587229782959796694",
      "usd": "0.03573939001209763754",
      "usdt": "0.0358"
    },
    "btxtest2": {
      "btc": "0.00000529124896574590613284162594",
      "usd": "0.36817561554362035544",
      "usdt": "0.3688"
    },
    "orn": {
      "btc": "0.00001510760618473546409404075955",
      "usd": "1.0512172537077880539",
      "usdt": "1.053"
    },
    "ens": {
      "btc": "0.00008220948094827560233509359184",
      "usd": "5.720299015902778299",
      "usdt": "5.73"
    },
    "pda": {
      "btc": "0.00000014017218653833379316123288",
      "usd": "0.009753459229558489351",
      "usdt": "0.00977"
    },
    "bond": {
      "btc": "0.00003087518376975376897471577829",
      "usd": "2.1483566286601708376",
      "usdt": "2.152"
    },
    "tlm": {
      "btc": "0.00000001926829544738815600977848",
      "usd": "0.0013407262789454504809",
      "usdt": "0.001343"
    },
    "kp3r": {
      "btc": "0.00023644192775350469921157807914",
      "usd": "16.452099089367851024",
      "usdt": "16.48"
    },
    "lqty": {
      "btc": "0.00000337159302318407793171849809",
      "usd": "0.2346021411408643805",
      "usdt": "0.235"
    },
    "ckb": {
      "btc": "0.00000001797704705553042403592884",
      "usd": "0.0012508786504234173139",
      "usdt": "0.001253"
    },
    "bigtime": {
      "btc": "0.00000015896702424204078078059983",
      "usd": "0.011061241378045861004",
      "usdt": "0.01108"
    },
    "yfi": {
      "btc": "0.03322812528380563612706400675237",
      "usd": "2312.0789739669868308",
      "usdt": "2316"
    },
    "xtz": {
      "btc": "0.00000446341527452156018960691386",
      "usd": "0.31057330259116131393",
      "usdt": "0.3111"
    },
    "dexe": {
      "btc": "0.00023737449603651306119269170627",
      "usd": "16.5169890433004305335",
      "usdt": "16.545"
    },
    "meme": {
      "btc": "0.00000000677188045507610546285588",
      "usd": "0.0004712008962488850536",
      "usdt": "0.000472"
    },
    "dego": {
      "btc": "0.00000040172172191129439186433169",
      "usd": "0.0279525955401880964",
      "usdt": "0.028"
    },
    "eos": {
      "btc": "0.00001118938467566494629339258155",
      "usd": "0.77857961649259629937",
      "usdt": "0.7799"
    },
    "alice": {
      "btc": "0.00000170588259768760368545246563",
      "usd": "0.11869870034744159507",
      "usdt": "0.1189"
    },
    "ooki": {
      "btc": "0.00000000170731731812300116542341",
      "usd": "0.0001187985310457994097",
      "usdt": "0.000119"
    },
    "rif": {
      "btc": "0.00000099569598216585109983516497",
      "usd": "0.06928250466032335322",
      "usdt": "0.0694"
    },
    "rune": {
      "btc": "0.00000599713141996146627854609448",
      "usd": "0.4172923191356651534",
      "usdt": "0.418"
    },
    "hook": {
      "btc": "0.00000011190819396100343773363526",
      "usd": "0.00778679447190954114",
      "usdt": "0.0078"
    },
    "skl": {
      "btc": "0.00000008048781642579862636996074",
      "usd": "0.005600502177873400743",
      "usdt": "0.00561"
    },
    "alpaca": {
      "btc": "0.00000321951265703194505479842967",
      "usd": "0.22402008711493602972",
      "usdt": "0.2244"
    },
    "tom2": {
      "btc": "0.01002482209825281180097730286387",
      "usd": "697.547038635558164199",
      "usdt": "698.73"
    },
    "gtc": {
      "btc": "0.00000136298441362760597239683966",
      "usd": "0.0948391634399238985",
      "usdt": "0.095"
    },
    "tom3": {
      "btc": "0.01002381779394803356499764203465",
      "usd": "697.477157146707693958",
      "usdt": "698.66"
    },
    "xec": {
      "btc": "0.00000000009598279712809141005616",
      "usd": "0.000006678673720137798747",
      "usdt": "0.00000669"
    },
    "ygg": {
      "btc": "0.0000004913917491236368900483343",
      "usd": "0.034192014187551510775",
      "usdt": "0.03425"
    },
    "1inch": {
      "btc": "0.00000121520820878166553538960336",
      "usd": "0.08455660150906899161",
      "usdt": "0.0847"
    },
    "id": {
      "btc": "0.00000037876619494493471232922702",
      "usd": "0.02635530436646306232",
      "usdt": "0.0264"
    },
    "portal": {
      "btc": "0.00000010932569717728797378593598",
      "usd": "0.007607099214865474806",
      "usdt": "0.00762"
    },
    "zil": {
      "btc": "0.00000005380201632740549891040157",
      "usd": "0.003743651188418048625",
      "usdt": "0.00375"
    },
    "axs": {
      "btc": "0.00001571018876760240568183725708",
      "usd": "1.0931461470180701985",
      "usdt": "1.095"
    },
    "btxtest": {
      "btc": "0.00000134863720927363117268739923",
      "usd": "0.0938408564563457522",
      "usdt": "0.094"
    },
    "comp": {
      "btc": "0.00025064566006393975092392409239",
      "usd": "17.440423003110215861",
      "usdt": "17.47"
    },
    "io": {
      "btc": "0.00000229985685794216039342329891",
      "usd": "0.16002860946757685189",
      "usdt": "0.1603"
    },
    "xvg": {
      "btc": "0.00000004424677822765828230391425",
      "usd": "0.0030787787373550031892",
      "usdt": "0.003084"
    },
    "iq": {
      "btc": "0.00000001476327328024006890101419",
      "usd": "0.0010272578861019125427",
      "usdt": "0.001029"
    },
    "pundix": {
      "btc": "0.0000019110476199494433212974636",
      "usd": "0.13297449021260908716",
      "usdt": "0.1332"
    },
    "unfi": {
      "btc": "0.00001923960103868020641035959976",
      "usd": "1.3387296649782941883",
      "usdt": "1.341"
    },
    "cream": {
      "btc": "0.00003012912914334707938982487659",
      "usd": "2.09644466551410723",
      "usdt": "2.1"
    },
    "forth": {
      "btc": "0.00000340028743189202753113737893",
      "usd": "0.2365987551080206731",
      "usdt": "0.237"
    },
    "clv": {
      "btc": "0.00000042137739187623986746626506",
      "usd": "0.029320276107690156831",
      "usdt": "0.02937"
    },
    "powr": {
      "btc": "0.00000085078921819070562276981675",
      "usd": "0.05919960412618407559",
      "usdt": "0.0593"
    },
    "zk": {
      "btc": "0.0000001925394824303418121006904",
      "usd": "0.013397279719618723346",
      "usdt": "0.01342"
    },
    "ctxc": {
      "btc": "0.00000090961275604200230157852246",
      "usd": "0.06329266275885447542",
      "usdt": "0.0634"
    },
    "ghst": {
      "btc": "0.00000154949807022927836861956508",
      "usd": "0.1078171542264398004",
      "usdt": "0.108"
    },
    "xvs": {
      "btc": "0.000037876619494493471232922702",
      "usd": "2.635530436646306232",
      "usdt": "2.64"
    },
    "slp": {
      "btc": "0.00000000855093379496898062682649",
      "usd": "0.0005949909622125751948",
      "usdt": "0.000596"
    },
    "hft": {
      "btc": "0.00000014921092528133791697818034",
      "usd": "0.01038239262921272152",
      "usdt": "0.0104"
    },
    "beamx": {
      "btc": "0.00000002393113686242996591534662",
      "usd": "0.0016651760486083480284",
      "usdt": "0.001668"
    },
    "idex": {
      "btc": "0.00000002855093666440985142178643",
      "usd": "0.001986630897320511137",
      "usdt": "0.00199"
    },
    "hive": {
      "btc": "0.00000082352952991815350332187996",
      "usd": "0.05730282085738559762",
      "usdt": "0.0574"
    },
    "kmd": {
      "btc": "0.0000002338594309697892352638788",
      "usd": "0.01627240383232378469",
      "usdt": "0.0163"
    },
    "city": {
      "btc": "0.00000612625625914723947593105824",
      "usd": "0.4262770819878684701",
      "usdt": "0.427"
    },
    "steem": {
      "btc": "0.00000072840756505130058124828999",
      "usd": "0.050684045556262487651",
      "usdt": "0.05077"
    },
    "celr": {
      "btc": "0.00000003314204205768178732880736",
      "usd": "0.002306089132065517953",
      "usdt": "0.00231"
    },
    "dot": {
      "btc": "0.00010489241103190976067571889175",
      "usd": "7.2986223569398275993",
      "usdt": "7.311"
    },
    "celo": {
      "btc": "0.00000103515079413928179903612612",
      "usd": "0.072027848865163255545",
      "usdt": "0.07215"
    },
    "rdnt": {
      "btc": "0.00000004705883028103734304696457",
      "usd": "0.003274446906136319864",
      "usdt": "0.00328"
    },
    "ton": {
      "btc": "0.0000252797740717035970880340155",
      "usd": "1.7590169050646937806",
      "usdt": "1.762"
    },
    "pros": {
      "btc": "0.00000053371600196786254919118353",
      "usd": "0.03713701978910704236",
      "usdt": "0.0372"
    },
    "prom": {
      "btc": "0.00001513630059344341369345964038",
      "usd": "1.0532138676749443465",
      "usdt": "1.055"
    },
    "ftm": {
      "btc": "0.00001003443472516997491678262795",
      "usd": "0.69821590431455552222",
      "usdt": "0.6994"
    },
    "knc": {
      "btc": "0.0000019727405986715349600480574",
      "usd": "0.13726721024199511625",
      "usdt": "0.1375"
    },
    "mav": {
      "btc": "0.00000017675755764096953242030594",
      "usd": "0.012299142037682762416",
      "usdt": "0.01232"
    },
    "bifi": {
      "btc": "0.00046054525976259107067303739929",
      "usd": "32.04565417285849623",
      "usdt": "32.1"
    },
    "ftt": {
      "btc": "0.00000421233919832700119469170656",
      "usd": "0.29310293037854375368",
      "usdt": "0.2936"
    },
    "rlc": {
      "btc": "0.00000612912570001803443587294632",
      "usd": "0.42647674338458409936",
      "usdt": "0.4272"
    },
    "pha": {
      "btc": "0.00000058967009894836426805800116",
      "usd": "0.04103041702506181293",
      "usdt": "0.0411"
    },
    "manta": {
      "btc": "0.00000111822110734879588935378613",
      "usd": "0.077808046300080722622",
      "usdt": "0.07794"
    },
    "phb": {
      "btc": "0.00000021520806530962199564160626",
      "usd": "0.0149746047536721945",
      "usdt": "0.015"
    },
    "xaut": {
      "btc": "0.06346629318024292399468063051372",
      "usd": "4416.11077255628797268",
      "usdt": "4423.6"
    },
    "blz": {
      "btc": "0.00000083500729340133334308943229",
      "usd": "0.05810146644424811466",
      "usdt": "0.0582"
    },
    "lpt": {
      "btc": "0.00002998565709980733139273047241",
      "usd": "2.086461595678325767",
      "usdt": "2.09"
    },
    "gft": {
      "btc": "0.00000002812052053379060743050322",
      "usd": "0.001956681687813166748",
      "usdt": "0.00196"
    },
    "api3": {
      "btc": "0.00000435868068273754415172799881",
      "usd": "0.30328566161104084594",
      "usdt": "0.3038"
    },
    "voxel": {
      "btc": "0.00000020086086095564719593216584",
      "usd": "0.0139762977700940482",
      "usdt": "0.014"
    },
    "waxp": {
      "btc": "0.00000008393114547075257830022644",
      "usd": "0.005840095853932155855",
      "usdt": "0.00585"
    },
    "mbl": {
      "btc": "0.00000001203730445298485695622051",
      "usd": "0.0008375795592220647457",
      "usdt": "0.000839"
    },
    "snt": {
      "btc": "0.00000039024395842811455209677935",
      "usd": "0.02715394995332557936",
      "usdt": "0.0272"
    },
    "glmr": {
      "btc": "0.00000017360117268309507648422905",
      "usd": "0.01207951450129557023",
      "usdt": "0.0121"
    },
    "rose": {
      "btc": "0.00000012984219940347193737043578",
      "usd": "0.009034678201382224015",
      "usdt": "0.00905"
    },
    "snx": {
      "btc": "0.00000423242528442256591428492314",
      "usd": "0.2945005601555531585",
      "usdt": "0.295"
    },
    "atom": {
      "btc": "0.00002903874161244499461190740486",
      "usd": "2.0205733347621681112",
      "usdt": "2.024"
    },
    "fun": {
      "btc": "0.00000000490674388905938150062862",
      "usd": "0.0003414209883837260346",
      "usdt": "0.000342"
    },
    "arkm": {
      "btc": "0.00000190674345864325088138463148",
      "usd": "0.13267499811753564327",
      "usdt": "0.1329"
    },
    "magic": {
      "btc": "0.00000080918232556417870361243954",
      "usd": "0.05630451387380745132",
      "usdt": "0.0564"
    },
    "quick": {
      "btc": "0.00000011119083374330469774816324",
      "usd": "0.007736879122730633825",
      "usdt": "0.00775"
    },
    "data": {
      "btc": "0.00000001262553983149782374430757",
      "usd": "0.000878510145548768744",
      "usdt": "0.00088"
    },
    "cos": {
      "btc": "0.00000001690100672898231405772081",
      "usd": "0.0011760056266550563414",
      "usdt": "0.001178"
    },
    "usd": {
      "btc": "0.000014371535599752",
      "usd": "1",
      "usdt": "1.001695887587388767"
    },
    "qkc": {
      "btc": "0.00000003860832691654618601810416",
      "usd": "0.0026864440928087916933",
      "usdt": "0.002691"
    },
    "pyr": {
      "btc": "0.00000334289861447612833229961726",
      "usd": "0.2326055271737080879",
      "usdt": "0.233"
    },
    "dai": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "sol": {
      "btc": "0.00123256832604997504303802626055",
      "usd": "85.764552959198548633",
      "usdt": "85.91"
    },
    "high": {
      "btc": "0.00000183644215730877436280837343",
      "usd": "0.1277832938980027264",
      "usdt": "0.128"
    },
    "burger": {
      "btc": "0.00000024677191488836655500237518",
      "usd": "0.01717088011754411636",
      "usdt": "0.0172"
    },
    "lazio": {
      "btc": "0.00000713056056392547545559188746",
      "usd": "0.4961585708383387111",
      "usdt": "0.497"
    },
    "dar": {
      "btc": "0.00000311434764911730977292823141",
      "usd": "0.216702496925308217341",
      "usdt": "0.21707"
    },
    "etc": {
      "btc": "0.00011707318752843436562903380617",
      "usd": "8.146184985997673808",
      "usdt": "8.16"
    },
    "ogn": {
      "btc": "0.00000029383074516940389804933975",
      "usd": "0.020445327023680436224",
      "usdt": "0.02048"
    },
    "bnb": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "usdt": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "0.9983069835781463",
      "usdt": "1"
    },
    "eth": {
      "btc": "0.02858034843333549976119078352809",
      "usd": "1988.677426636846336915",
      "usdt": "1992.05"
    },
    "neo": {
      "btc": "0.00003832138282946669002391535494",
      "usd": "2.6664779531372287673",
      "usdt": "2.671"
    },
    "lrc": {
      "btc": "0.00000026958396981118648654038544",
      "usd": "0.018758188221433368977",
      "usdt": "0.01879"
    },
    "ordi": {
      "btc": "0.00038436160464298488421590878268",
      "usd": "26.744644090058539377",
      "usdt": "26.79"
    },
    "saga": {
      "btc": "0.00000025853662245862589076411632",
      "usd": "0.017989491844078196326",
      "usdt": "0.01802"
    },
    "usdn": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "0.9983069835781463",
      "usdt": "1"
    },
    "pengu": {
      "btc": "0.00000011301292869625949731126217",
      "usd": "0.0078636641096450584051",
      "usdt": "0.007877"
    },
    "lista": {
      "btc": "0.0000009038738743004123816947463",
      "usd": "0.0628933399654232169",
      "usdt": "0.063"
    },
    "spell": {
      "btc": "0.0000000021076043195988980773168",
      "usd": "0.00014665129588762969147",
      "usdt": "0.0001469"
    },
    "tao": {
      "btc": "0.00374031617508123028425111682225",
      "usd": "260.25863061882274041",
      "usdt": "260.7"
    },
    "mtl": {
      "btc": "0.00000395982840169704471980555521",
      "usd": "0.2755327274675683788",
      "usdt": "0.276"
    },
    "trb": {
      "btc": "0.00023428984710040847925516201652",
      "usd": "16.302353041831129079",
      "usdt": "16.33"
    },
    "alt": {
      "btc": "0.00000010043043047782359796608292",
      "usd": "0.0069881488850470241",
      "usdt": "0.007"
    },
    "bnt": {
      "btc": "0.00000459827899544892330687565378",
      "usd": "0.31995738823679588915",
      "usdt": "0.3205"
    },
    "oxt": {
      "btc": "0.00000013486372092736311726873992",
      "usd": "0.00938408564563457522",
      "usdt": "0.0094"
    },
    "lever": {
      "btc": "0.00000000251076076194558994915207",
      "usd": "0.0001747037221261756025",
      "usdt": "0.000175"
    },
    "usdc": {
      "btc": "0.00001436442099919956946909174592",
      "usd": "0.99950495195844007556",
      "usdt": "1.0012"
    },
    "utk": {
      "btc": "0.00000011406027461409965769005132",
      "usd": "0.007936540519446263085",
      "usdt": "0.00795"
    },
    "bnx": {
      "btc": "0.00002556528343834769560225187981",
      "usd": "1.77888321403789889197",
      "usdt": "1.7819"
    },
    "aergo": {
      "btc": "0.00000091104747647739978154946651",
      "usd": "0.06339249345721229005",
      "usdt": "0.0635"
    },
    "ilv": {
      "btc": "0.0000562410410675812148610064363",
      "usd": "3.913363375626333496",
      "usdt": "3.92"
    },
    "hifi": {
      "btc": "0.00000182209495295479956309893301",
      "usd": "0.1267849869144245801",
      "usdt": "0.127"
    },
    "egld": {
      "btc": "0.00005093257545661053896851348185",
      "usd": "3.543989791702419365",
      "usdt": "3.55"
    },
    "tru": {
      "btc": "0.00000003299857001414203933171296",
      "usd": "0.00229610606222973649",
      "usdt": "0.0023"
    },
    "alpine": {
      "btc": "0.00000581061776335979388232336906",
      "usd": "0.4043143283491492515",
      "usdt": "0.405"
    },
    "amb": {
      "btc": "0.00000000459110539327193590702093",
      "usd": "0.000319458234745006816",
      "usdt": "0.00032"
    },
    "edu": {
      "btc": "0.00000061836450765631386747688199",
      "usd": "0.04302703099221810553",
      "usdt": "0.0431"
    },
    "nfp": {
      "btc": "0.00000013371594457904513329198469",
      "usd": "0.009304221086948323516",
      "usdt": "0.00932"
    },
    "ustc": {
      "btc": "0.00000008723100247216678223339774",
      "usd": "0.006069706460155129504",
      "usdt": "0.00608"
    },
    "trx": {
      "btc": "0.00000501578264214958997842036993",
      "usd": "0.34900812145891994648",
      "usdt": "0.3496"
    },
    "dash": {
      "btc": "0.0005612626343274941646333091296",
      "usd": "39.053769197577083256",
      "usdt": "39.12"
    },
    "nuls": {
      "btc": "0.00000037015787233254983250356277",
      "usd": "0.02575632017631617454",
      "usdt": "0.0258"
    },
    "mdx": {
      "btc": "0.0000004949785502121305899756944",
      "usd": "0.03444159093344604735",
      "usdt": "0.0345"
    },
    "joe": {
      "btc": "0.00000054375904501564490898779182",
      "usd": "0.03783583467761174477",
      "usdt": "0.0379"
    },
    "pond": {
      "btc": "0.00000002510760761945589949152073",
      "usd": "0.001747037221261756025",
      "usdt": "0.00175"
    },
    "lina": {
      "btc": "0.00000000483500786728950750208142",
      "usd": "0.0003364294534658353031",
      "usdt": "0.000337"
    },
    "lsk": {
      "btc": "0.00000154949807022927836861956508",
      "usd": "0.1078171542264398004",
      "usdt": "0.108"
    },
    "amp": {
      "btc": "0.0000000104734591784016037878915",
      "usd": "0.000728764098012046799",
      "usdt": "0.00073"
    },
    "pendle": {
      "btc": "0.00002189383384416554435660607699",
      "usd": "1.5234164569402512538",
      "usdt": "1.526"
    },
    "dydx": {
      "btc": "0.00000211147806477447127323834623",
      "usd": "0.146920838773195790971",
      "usdt": "0.14717"
    },
    "busd": {
      "btc": "0.00001435150851528099214935324955",
      "usd": "0.99860647567321974389",
      "usdt": "1.0003"
    },
    "akro": {
      "btc": "0.00000001407460747124927851496105",
      "usd": "0.0009793391508901615203",
      "usdt": "0.000981"
    },
    "alcx": {
      "btc": "0.00005738881741589919883776166969",
      "usd": "3.9932279343125852",
      "usdt": "4"
    },
    "qtum": {
      "btc": "0.00001222381810958652935244323564",
      "usd": "0.8505575500085806476",
      "usdt": "0.852"
    },
    "arpa": {
      "btc": "0.00000014203732310435051712346013",
      "usd": "0.00988323913742364837",
      "usdt": "0.0099"
    },
    "coti": {
      "btc": "0.00000016226688124345498471377112",
      "usd": "0.011290851984268834653",
      "usdt": "0.01131"
    },
    "dcr": {
      "btc": "0.00023644192775350469921157807914",
      "usd": "16.452099089367851024",
      "usdt": "16.48"
    },
    "og": {
      "btc": "0.00003979914487792609439398771793",
      "usd": "2.7693035724457778362",
      "usdt": "2.774"
    },
    "ethfi": {
      "btc": "0.00000532281281532465069220239486",
      "usd": "0.3703718909074922773",
      "usdt": "0.371"
    },
    "flux": {
      "btc": "0.00000095408908953932418067778776",
      "usd": "0.06638741440794672895",
      "usdt": "0.0665"
    },
    "ltc": {
      "btc": "0.00185667171544787883039868441832",
      "usd": "129.190906744847912683",
      "usdt": "129.41"
    },
    "win": {
      "btc": "0.00000000027489243542215716243288",
      "usd": "0.000019127561805357283108",
      "usdt": "0.00001916"
    },
    "beta": {
      "btc": "0.00000000516499356743092789539855",
      "usd": "0.000359390514088132668",
      "usdt": "0.00036"
    },
    "om": {
      "btc": "0.00000095982797128091410056156393",
      "usd": "0.06678673720137798747",
      "usdt": "0.0669"
    },
    "fxs": {
      "btc": "0.00001164992993542753736406561895",
      "usd": "0.8106252706654547956",
      "usdt": "0.812"
    },
    "pla": {
      "btc": "0.00000336728886187788549180566597",
      "usd": "0.23430264904579093661",
      "usdt": "0.2347"
    },
    "ant": {
      "btc": "0.00010626974264989134144782517185",
      "usd": "7.3944598273633296441",
      "usdt": "7.407"
    },
    "vgx": {
      "btc": "0.00000025824967837154639476992751",
      "usd": "0.0179695257044066334",
      "usdt": "0.018"
    },
    "lto": {
      "btc": "0.00000005451937654510423889587359",
      "usd": "0.00379356653759695594",
      "usdt": "0.0038"
    },
    "crv": {
      "btc": "0.00000304447676391345249834325658",
      "usd": "0.21184074191528264486",
      "usdt": "0.2122"
    },
    "aeur": {
      "btc": "0.00001647489475966926250635043133",
      "usd": "1.14635590924278539629",
      "usdt": "1.1483"
    },
    "movr": {
      "btc": "0.0000255236765457211686830945026",
      "usd": "1.7759881237855222677",
      "usdt": "1.779"
    },
    "srm": {
      "btc": "0.00000350674368819852054498142683",
      "usd": "0.244006192926170518646",
      "usdt": "0.24442"
    },
    "badger": {
      "btc": "0.00001093256971772879737859359808",
      "usd": "0.7607099214865474806",
      "usdt": "0.762"
    },
    "rpl": {
      "btc": "0.00002309899900989942753219907205",
      "usd": "1.607274243560815543",
      "usdt": "1.61"
    },
    "super": {
      "btc": "0.00000157962719937262544800938996",
      "usd": "0.10991359889195390763",
      "usdt": "0.1101"
    },
    "aevo": {
      "btc": "0.00000033142042057681787328807364",
      "usd": "0.02306089132065517953",
      "usdt": "0.0231"
    },
    "pols": {
      "btc": "0.00000441750422058884083053670452",
      "usd": "0.30737872024371124577",
      "usdt": "0.3079"
    },
    "cyber": {
      "btc": "0.00000622668668962506307389714116",
      "usd": "0.4332652308729154942",
      "usdt": "0.434"
    },
    "qnt": {
      "btc": "0.00101922539730636977135864725375",
      "usd": "70.919728113391513152",
      "usdt": "71.04"
    },
    "ldo": {
      "btc": "0.00000456384570499938378757299678",
      "usd": "0.31756145147620833803",
      "usdt": "0.3181"
    },
    "bake": {
      "btc": "0.00000074461990597129210491995766",
      "usd": "0.05181213244770579297",
      "usdt": "0.0519"
    },
    "agix": {
      "btc": "0.00000881061819377592450156736034",
      "usd": "0.61306031861533964283",
      "usdt": "0.6141"
    },
    "xlm": {
      "btc": "0.00000273170770899680186467745548",
      "usd": "0.19007764967327905552",
      "usdt": "0.1904"
    },
    "stmx": {
      "btc": "0.00000006549498787589496067359551",
      "usd": "0.0045572713800342378595",
      "usdt": "0.004565"
    },
    "front": {
      "btc": "0.00001262553983149782374430756733",
      "usd": "0.878510145548768744",
      "usdt": "0.88"
    },
    "gala": {
      "btc": "0.00000004332855714900389512251006",
      "usd": "0.003014887090406001826",
      "usdt": "0.00302"
    },
    "rndr": {
      "btc": "0.00010086084660844284195736613449",
      "usd": "7.018098094554368489",
      "usdt": "7.03"
    }
  },
  "ts": 1779973461067
}</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-28T21:04:21.175348" elapsed="0.000647"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:21.177156" level="INFO">${data} = {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.00888493215384550207', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00006355811528810836271282104919', 'usd': '4.422499937251188109', '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-28T21:04:21.176089" elapsed="0.001091"/>
</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-28T21:04:21.177270" elapsed="0.000206"/>
</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-28T21:04:21.177580" elapsed="0.000139"/>
</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-28T21:04:21.178419" elapsed="0.000168"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:21.178910" 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-28T21:04:21.178681" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.179162" 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-28T21:04:21.179015" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.179590" 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-28T21:04:21.179420" elapsed="0.000241">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-05-28T21:04:21.179737" 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-28T21:04:21.179305" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.180098" 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-28T21:04:21.179964" elapsed="0.000178">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-05-28T21:04:21.180215" 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-28T21:04:21.179853" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.180566" 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-28T21:04:21.180435" elapsed="0.000175">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T21:04:21.180681" 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-28T21:04:21.180326" 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-28T21:04:21.181031" 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-28T21:04:21.180897" elapsed="0.000175">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-05-28T21:04:21.181140" 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-28T21:04:21.180790" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.181515" 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-28T21:04:21.181387" elapsed="0.000171">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-05-28T21:04:21.181627" 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-28T21:04:21.181277" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.181846" 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-28T21:04:21.181735" elapsed="0.000145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.182056" 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-28T21:04:21.181959" elapsed="0.000130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.182265" 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-28T21:04:21.182171" elapsed="0.000126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.182471" 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-28T21:04:21.182376" elapsed="0.000128"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.182678" 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-28T21:04:21.182581" elapsed="0.000130"/>
</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-28T21:04:21.182795" elapsed="0.000086"/>
</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-28T21:04:21.182971" elapsed="0.000085"/>
</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-28T21:04:21.183143" elapsed="0.000180"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:21.178124" elapsed="0.005252"/>
</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-28T21:04:21.177820" elapsed="0.005595"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.183847" 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-28T21:04:21.183495" elapsed="0.000384"/>
</kw>
<doc>验证货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T21:04:20.827484" elapsed="0.356498"/>
</test>
<test id="s1-s4-s1-s2-t2" name="获取单一货币价格转换" line="37">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.185272" 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-28T21:04:21.185113" elapsed="0.000179"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.186458" 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-28T21:04:21.185993" elapsed="0.000487"/>
</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-28T21:04:21.186965" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.186583" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.186563" elapsed="0.000467"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:21.187054" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T21:04:21.187205" 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-28T21:04:21.185441" elapsed="0.001783"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:21.300485" 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-28T21:04:21.300898" 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 13: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': '4a0f99164407c980d219245addfacd18', 'X-Transparent': '00-4a0f99164407c980d219245addfacd18-72d8765d0b1cea4d-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02d76f4cbdf90e4-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"usd":"0.00888493215384550207"},"ksm":{"usd":"4.422499937251188109"},"vanry":{"usd":"0.0045193357146582683001"},"pyth":{"usd":"0.03833498816940081792"},"bal":{"usd":"0.9653628531200674721"},"fio":{"usd":"0.000938408564563457522"},"mbox":{"usd":"0.01048222332757053615"},"theta":{"usd":"0.1806935640276444803"},"vib":{"usd":"0.002226224573379266249"},"fis":{"usd":"0.01906766338634259433"},"vic":{"usd":"0.04182906261192432997"},"bar":{"usd":"0.3603888210717108143"},"stpt":{"usd":"0.070300777783573062446"},"rad":{"usd":"0.2585615087467398917"},"bat":{"usd":"0.10302528070526469816"},"cake":{"usd":"1.327748288158934579"},"ssv":{"usd":"2.3550061742608471217"},"ape":{"usd":"0.12468854224891047287"},"qi":{"usd":"0.001477494335695656524"},"farm":{"usd":"5.79018050475324854"},"ctk":{"usd":"0.14904723264821724259"},"band":{"usd":"0.1886800198962696507"},"iotx":{"usd":"0.003973261794641022274"},"near":{"usd":"5.2620761104404091473"},"shib":{"usd":"0.000008495592430250025013"},"xmr":{"usd":"118.49903895072596581"},"dock":{"usd":"0.00389339723595477057"},"astr":{"usd":"0.0071199254068793394116"},"waves":{"usd":"1.0741783143300854188"},"reef":{"usd":"0.0006868352047017646544"},"iris":{"usd":"0.005201179384442142223"},"apt":{"usd":"0.9364119505963012294"},"stg":{"usd":"0.1537392754710345302"},"ai":{"usd":"0.02375970620915988194"},"combo":{"usd":"0.02755327274675683788"},"dent":{"usd":"0.0000379356653759695594"},"kda":{"usd":"0.0059898419014688778"},"metis":{"usd":"3.034853230077564752"},"glm":{"usd":"0.12848210878650742881"},"loka":{"usd":"0.12349057386861669731"},"ray":{"usd":"0.7068013443733275804"},"wld":{"usd":"0.29420106806047971461"},"agld":{"usd":"0.2136376944857233082"},"iost":{"usd":"0.0009923171416766774222"},"zro":{"usd":"1.1590344079342278543"},"wing":{"usd":"0.3254480766464756938"},"dgb":{"usd":"0.003254480766464756938"},"bb":{"usd":"0.02645513506482087695"},"zrx":{"usd":"0.09913188346930992759"},"sui":{"usd":"0.91764377930503207896"},"bsw":{"usd":"0.01118103821607523856"},"omg":{"usd":"0.3823515747104300329"},"blur":{"usd":"0.020535174652202469391"},"jst":{"usd":"0.094909044928774368741"},"pol":{"usd":"0.087721234647011715381"},"pivx":{"usd":"0.0569034980639543391"},"gmt":{"usd":"0.010152782022989747871"},"nkn":{"usd":"0.00728764098012046799"},"porto":{"usd":"0.6678673720137798747"},"rsr":{"usd":"0.0015883064108728307633"},"sc":{"usd":"0.0008695253826965654273"},"twt":{"usd":"0.43895558067931092811"},"arb":{"usd":"0.10242629651511781038"},"btc":{"usd":"69581.986772326961328537"},"cvc":{"usd":"0.027024170045460420341"},"ardr":{"usd":"0.035509779405874663891"},"vite":{"usd":"0.000858544005877205818"},"gmx":{"usd":"6.129604879169818282"},"sei":{"usd":"0.068893164936727876163"},"matic":{"usd":"0.37875766956954870622"},"audio":{"usd":"0.018628408313568209958"},"ark":{"usd":"0.14435518982539995498"},"cvp":{"usd":"0.03384260674329915957"},"key":{"usd":"0.0012508786504234173139"},"btt":{"usd":"0"},"cvx":{"usd":"1.5184249220223605223"},"flm":{"usd":"0.01667172662575504321"},"one":{"usd":"0.001776986430769100414"},"btx":{"usd":"0.17959542634570851937"},"ong":{"usd":"0.061385896420220215987"},"gno":{"usd":"113.128147379075538716"},"storj":{"usd":"0.09973086765945681537"},"gns":{"usd":"0.4622161333966817369"},"people":{"usd":"0.00618950329818450706"},"tnsr":{"usd":"0.03514040582195074976"},"bttc":{"usd":"0.000000319458234745006816"},"vtho":{"usd":"0.0004712008962488850536"},"polyx":{"usd":"0.0479187352117510224"},"t":{"usd":"0.004731975102160413462"},"ont":{"usd":"0.051802149377870011507"},"mana":{"usd":"0.08255998754191269901"},"cfx":{"usd":"0.051083368349693746171"},"w":{"usd":"0.01118103821607523856"},"dodo":{"usd":"0.018019441053585540715"},"ankr":{"usd":"0.004412516867415406646"},"mina":{"usd":"0.05460739200172460261"},"sfp":{"usd":"0.26235507528433684764"},"dia":{"usd":"0.16042793226100811041"},"aca":{"usd":"0.00179695257044066334"},"algo":{"usd":"0.10641952444943039558"},"asr":{"usd":"1.0023002115124588852"},"df":{"usd":"0.001637223453068159932"},"ast":{"usd":"0.02605581227138961843"},"jup":{"usd":"0.1776986430769100414"},"dusk":{"usd":"0.12199311339324947786"},"doge":{"usd":"0.098083661136552873975"},"bel":{"usd":"0.09414034855141919609"},"acm":{"usd":"0.3563955931373982291"},"juv":{"usd":"0.3923346445462114959"},"bome":{"usd":"0.0004941619568711824185"},"tia":{"usd":"0.41250044561449005116"},"ata":{"usd":"0.00119796838029377556"},"nmr":{"usd":"8.255998754191269901"},"loom":{"usd":"0.048228210376660247753"},"paxg":{"usd":"4424.017363866226891376"},"lit":{"usd":"0.7417420887985627009"},"woo":{"usd":"0.2116410805185670156"},"rei":{"usd":"0.004003211004148366663"},"rare":{"usd":"0.01457528196024093598"},"zec":{"usd":"526.117763415518881563"},"ren":{"usd":"0.042667640478129972862"},"atm":{"usd":"0.9793391508901615203"},"hbar":{"usd":"0.084965907372336031593"},"rep":{"usd":"4.721992032324631999"},"elf":{"usd":"0.22681534666895483936"},"pepe":{"usd":"0.000003324362255315227179"},"icx":{"usd":"0.03524023652030856439"},"req":{"usd":"0.06808453628002957766"},"xai":{"usd":"0.009274271877440979127"},"strax":{"usd":"0.011330784263611960505"},"chess":{"usd":"0.002805242623854591103"},"tusd":{"usd":"0.99820715287978848537"},"ctsi":{"usd":"0.027094051534310890582"},"sxp":{"usd":"0.00219627536387192186"},"rvn":{"usd":"0.005051433336905420278"},"chr":{"usd":"0.019077646456178375793"},"fida":{"usd":"0.028282036844768884679"},"ntrn":{"usd":"0.00159729117372503408"},"sand":{"usd":"0.066826669480721113322"},"osmo":{"usd":"0.05480705339844023187"},"kava":{"usd":"0.053768814135518959718"},"ocean":{"usd":"0.61126336604489897949"},"vidt":{"usd":"0.001148053031114868245"},"adx":{"usd":"0.05969875761797314874"},"chz":{"usd":"0.03404226814001478883"},"xrp":{"usd":"2.13408083879500334551"},"c98":{"usd":"0.0189678326879847797"},"psg":{"usd":"1.1171055146239457097"},"perp":{"usd":"0.1247883729472682875"},"for":{"usd":"0.003054819369749127678"},"uma":{"usd":"0.4202872400863995923"},"syn":{"usd":"0.039932279343125852"},"jasmy":{"usd":"0.005350925431978864168"},"sys":{"usd":"0.002226224573379266249"},"lunc":{"usd":"0.000083428514617625686291"},"luna":{"usd":"0.05860061993603718781"},"auction":{"usd":"4.402533797579625183"},"not":{"usd":"0.0004332652308729154942"},"gal":{"usd":"2.5376963522556478946"},"yfii":{"usd":"434.76269134828271365"},"alpha":{"usd":"0.00968357774070801911"},"tko":{"usd":"0.05041450267069638815"},"pixel":{"usd":"0.006299317066378103153"},"nexo":{"usd":"0.8166151125669236734"},"bico":{"usd":"0.0229610606222973649"},"troy":{"usd":"0.0000688831818668920947"},"mask":{"usd":"0.4282736959550247627"},"enj":{"usd":"0.037666122490403459899"},"aave":{"usd":"80.413627527219684465"},"wan":{"usd":"0.05420806920829334409"},"gm":{"usd":"713.340255115764438665"},"oax":{"usd":"0.03573939001209763754"},"btxtest2":{"usd":"0.36817561554362035544"},"orn":{"usd":"1.0512172537077880539"},"ens":{"usd":"5.720299015902778299"},"pda":{"usd":"0.009753459229558489351"},"bond":{"usd":"2.1483566286601708376"},"tlm":{"usd":"0.0013407262789454504809"},"kp3r":{"usd":"16.452099089367851024"},"lqty":{"usd":"0.2346021411408643805"},"ckb":{"usd":"0.0012508786504234173139"},"bigtime":{"usd":"0.011061241378045861004"},"yfi":{"usd":"2312.0789739669868308"},"xtz":{"usd":"0.31057330259116131393"},"dexe":{"usd":"16.5169890433004305335"},"meme":{"usd":"0.0004712008962488850536"},"dego":{"usd":"0.0279525955401880964"},"eos":{"usd":"0.77857961649259629937"},"alice":{"usd":"0.11869870034744159507"},"ooki":{"usd":"0.0001187985310457994097"},"rif":{"usd":"0.06928250466032335322"},"rune":{"usd":"0.4172923191356651534"},"hook":{"usd":"0.00778679447190954114"},"skl":{"usd":"0.005600502177873400743"},"alpaca":{"usd":"0.22402008711493602972"},"tom2":{"usd":"697.547038635558164199"},"gtc":{"usd":"0.0948391634399238985"},"tom3":{"usd":"697.477157146707693958"},"xec":{"usd":"0.000006678673720137798747"},"ygg":{"usd":"0.034192014187551510775"},"1inch":{"usd":"0.08455660150906899161"},"id":{"usd":"0.02635530436646306232"},"portal":{"usd":"0.007607099214865474806"},"zil":{"usd":"0.003743651188418048625"},"axs":{"usd":"1.0931461470180701985"},"btxtest":{"usd":"0.0938408564563457522"},"comp":{"usd":"17.440423003110215861"},"io":{"usd":"0.16002860946757685189"},"xvg":{"usd":"0.0030787787373550031892"},"iq":{"usd":"0.0010272578861019125427"},"pundix":{"usd":"0.13297449021260908716"},"unfi":{"usd":"1.3387296649782941883"},"cream":{"usd":"2.09644466551410723"},"forth":{"usd":"0.2365987551080206731"},"clv":{"usd":"0.029320276107690156831"},"powr":{"usd":"0.05919960412618407559"},"zk":{"usd":"0.013397279719618723346"},"ctxc":{"usd":"0.06329266275885447542"},"ghst":{"usd":"0.1078171542264398004"},"xvs":{"usd":"2.635530436646306232"},"slp":{"usd":"0.0005949909622125751948"},"hft":{"usd":"0.01038239262921272152"},"beamx":{"usd":"0.0016651760486083480284"},"idex":{"usd":"0.001986630897320511137"},"hive":{"usd":"0.05730282085738559762"},"kmd":{"usd":"0.01627240383232378469"},"city":{"usd":"0.4262770819878684701"},"steem":{"usd":"0.050684045556262487651"},"celr":{"usd":"0.002306089132065517953"},"dot":{"usd":"7.2986223569398275993"},"celo":{"usd":"0.072027848865163255545"},"rdnt":{"usd":"0.003274446906136319864"},"ton":{"usd":"1.7590169050646937806"},"pros":{"usd":"0.03713701978910704236"},"prom":{"usd":"1.0532138676749443465"},"ftm":{"usd":"0.69821590431455552222"},"knc":{"usd":"0.13726721024199511625"},"mav":{"usd":"0.012299142037682762416"},"bifi":{"usd":"32.04565417285849623"},"ftt":{"usd":"0.29310293037854375368"},"rlc":{"usd":"0.42647674338458409936"},"pha":{"usd":"0.04103041702506181293"},"manta":{"usd":"0.077808046300080722622"},"phb":{"usd":"0.0149746047536721945"},"xaut":{"usd":"4416.11077255628797268"},"blz":{"usd":"0.05810146644424811466"},"lpt":{"usd":"2.086461595678325767"},"gft":{"usd":"0.001956681687813166748"},"api3":{"usd":"0.30328566161104084594"},"voxel":{"usd":"0.0139762977700940482"},"waxp":{"usd":"0.005840095853932155855"},"mbl... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T21:04:21.301206" 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-28T21:04:21.301488" 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-28T21:04:21.187298" elapsed="0.114237"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.303032" 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-28T21:04:21.301954" elapsed="0.001193"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.304924" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'usd': '0.00888493215384550207'}, 'ksm': {'usd': '4.422499937251188109'}, 'vanry': {'usd': '0.0045193357146582683001'}, '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-28T21:04:21.303381" elapsed="0.001584"/>
</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-28T21:04:21.305136" elapsed="0.000208"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.307926" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.00888493215384550207"
    },
    "ksm": {
      "usd": "4.422499937251188109"
    },
    "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-28T21:04:21.305489" elapsed="0.002478"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.308427" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.00888493215384550207"
    },
    "ksm": {
      "usd": "4.422499937251188109"
    },
    "vanry": {
      "usd": "0.0045193357146582683001"
    },
    "pyth": {
      "usd": "0.03833498816940081792"
    },
    "bal": {
      "usd": "0.9653628531200674721"
    },
    "fio": {
      "usd": "0.000938408564563457522"
    },
    "mbox": {
      "usd": "0.01048222332757053615"
    },
    "theta": {
      "usd": "0.1806935640276444803"
    },
    "vib": {
      "usd": "0.002226224573379266249"
    },
    "fis": {
      "usd": "0.01906766338634259433"
    },
    "vic": {
      "usd": "0.04182906261192432997"
    },
    "bar": {
      "usd": "0.3603888210717108143"
    },
    "stpt": {
      "usd": "0.070300777783573062446"
    },
    "rad": {
      "usd": "0.2585615087467398917"
    },
    "bat": {
      "usd": "0.10302528070526469816"
    },
    "cake": {
      "usd": "1.327748288158934579"
    },
    "ssv": {
      "usd": "2.3550061742608471217"
    },
    "ape": {
      "usd": "0.12468854224891047287"
    },
    "qi": {
      "usd": "0.001477494335695656524"
    },
    "farm": {
      "usd": "5.79018050475324854"
    },
    "ctk": {
      "usd": "0.14904723264821724259"
    },
    "band": {
      "usd": "0.1886800198962696507"
    },
    "iotx": {
      "usd": "0.003973261794641022274"
    },
    "near": {
      "usd": "5.2620761104404091473"
    },
    "shib": {
      "usd": "0.000008495592430250025013"
    },
    "xmr": {
      "usd": "118.49903895072596581"
    },
    "dock": {
      "usd": "0.00389339723595477057"
    },
    "astr": {
      "usd": "0.0071199254068793394116"
    },
    "waves": {
      "usd": "1.0741783143300854188"
    },
    "reef": {
      "usd": "0.0006868352047017646544"
    },
    "iris": {
      "usd": "0.005201179384442142223"
    },
    "apt": {
      "usd": "0.9364119505963012294"
    },
    "stg": {
      "usd": "0.1537392754710345302"
    },
    "ai": {
      "usd": "0.02375970620915988194"
    },
    "combo": {
      "usd": "0.02755327274675683788"
    },
    "dent": {
      "usd": "0.0000379356653759695594"
    },
    "kda": {
      "usd": "0.0059898419014688778"
    },
    "metis": {
      "usd": "3.034853230077564752"
    },
    "glm": {
      "usd": "0.12848210878650742881"
    },
    "loka": {
      "usd": "0.12349057386861669731"
    },
    "ray": {
      "usd": "0.7068013443733275804"
    },
    "wld": {
      "usd": "0.29420106806047971461"
    },
    "agld": {
      "usd": "0.2136376944857233082"
    },
    "iost": {
      "usd": "0.0009923171416766774222"
    },
    "zro": {
      "usd": "1.1590344079342278543"
    },
    "wing": {
      "usd": "0.3254480766464756938"
    },
    "dgb": {
      "usd": "0.003254480766464756938"
    },
    "bb": {
      "usd": "0.02645513506482087695"
    },
    "zrx": {
      "usd": "0.09913188346930992759"
    },
    "sui": {
      "usd": "0.91764377930503207896"
    },
    "bsw": {
      "usd": "0.01118103821607523856"
    },
    "omg": {
      "usd": "0.3823515747104300329"
    },
    "blur": {
      "usd": "0.020535174652202469391"
    },
    "jst": {
      "usd": "0.094909044928774368741"
    },
    "pol": {
      "usd": "0.087721234647011715381"
    },
    "pivx": {
      "usd": "0.0569034980639543391"
    },
    "gmt": {
      "usd": "0.010152782022989747871"
    },
    "nkn": {
      "usd": "0.00728764098012046799"
    },
    "porto": {
      "usd": "0.6678673720137798747"
    },
    "rsr": {
      "usd": "0.0015883064108728307633"
    },
    "sc": {
      "usd": "0.0008695253826965654273"
    },
    "twt": {
      "usd": "0.43895558067931092811"
    },
    "arb": {
      "usd": "0.10242629651511781038"
    },
    "btc": {
      "usd": "69581.986772326961328537"
    },
    "cvc": {
      "usd": "0.027024170045460420341"
    },
    "ardr": {
      "usd": "0.035509779405874663891"
    },
    "vite": {
      "usd": "0.000858544005877205818"
    },
    "gmx": {
      "usd": "6.129604879169818282"
    },
    "sei": {
      "usd": "0.068893164936727876163"
    },
    "matic": {
      "usd": "0.37875766956954870622"
    },
    "audio": {
      "usd": "0.018628408313568209958"
    },
    "ark": {
      "usd": "0.14435518982539995498"
    },
    "cvp": {
      "usd": "0.03384260674329915957"
    },
    "key": {
      "usd": "0.0012508786504234173139"
    },
    "btt": {
      "usd": "0"
    },
    "cvx": {
      "usd": "1.5184249220223605223"
    },
    "flm": {
      "usd": "0.01667172662575504321"
    },
    "one": {
      "usd": "0.001776986430769100414"
    },
    "btx": {
      "usd": "0.17959542634570851937"
    },
    "ong": {
      "usd": "0.061385896420220215987"
    },
    "gno": {
      "usd": "113.128147379075538716"
    },
    "storj": {
      "usd": "0.09973086765945681537"
    },
    "gns": {
      "usd": "0.4622161333966817369"
    },
    "people": {
      "usd": "0.00618950329818450706"
    },
    "tnsr": {
      "usd": "0.03514040582195074976"
    },
    "bttc": {
      "usd": "0.000000319458234745006816"
    },
    "vtho": {
      "usd": "0.0004712008962488850536"
    },
    "polyx": {
      "usd": "0.0479187352117510224"
    },
    "t": {
      "usd": "0.004731975102160413462"
    },
    "ont": {
      "usd": "0.051802149377870011507"
    },
    "mana": {
      "usd": "0.08255998754191269901"
    },
    "cfx": {
      "usd": "0.051083368349693746171"
    },
    "w": {
      "usd": "0.01118103821607523856"
    },
    "dodo": {
      "usd": "0.018019441053585540715"
    },
    "ankr": {
      "usd": "0.004412516867415406646"
    },
    "mina": {
      "usd": "0.05460739200172460261"
    },
    "sfp": {
      "usd": "0.26235507528433684764"
    },
    "dia": {
      "usd": "0.16042793226100811041"
    },
    "aca": {
      "usd": "0.00179695257044066334"
    },
    "algo": {
      "usd": "0.10641952444943039558"
    },
    "asr": {
      "usd": "1.0023002115124588852"
    },
    "df": {
      "usd": "0.001637223453068159932"
    },
    "ast": {
      "usd": "0.02605581227138961843"
    },
    "jup": {
      "usd": "0.1776986430769100414"
    },
    "dusk": {
      "usd": "0.12199311339324947786"
    },
    "doge": {
      "usd": "0.098083661136552873975"
    },
    "bel": {
      "usd": "0.09414034855141919609"
    },
    "acm": {
      "usd": "0.3563955931373982291"
    },
    "juv": {
      "usd": "0.3923346445462114959"
    },
    "bome": {
      "usd": "0.0004941619568711824185"
    },
    "tia": {
      "usd": "0.41250044561449005116"
    },
    "ata": {
      "usd": "0.00119796838029377556"
    },
    "nmr": {
      "usd": "8.255998754191269901"
    },
    "loom": {
      "usd": "0.048228210376660247753"
    },
    "paxg": {
      "usd": "4424.017363866226891376"
    },
    "lit": {
      "usd": "0.7417420887985627009"
    },
    "woo": {
      "usd": "0.2116410805185670156"
    },
    "rei": {
      "usd": "0.004003211004148366663"
    },
    "rare": {
      "usd": "0.01457528196024093598"
    },
    "zec": {
      "usd": "526.117763415518881563"
    },
    "ren": {
      "usd": "0.042667640478129972862"
    },
    "atm": {
      "usd": "0.9793391508901615203"
    },
    "hbar": {
      "usd": "0.084965907372336031593"
    },
    "rep": {
      "usd": "4.721992032324631999"
    },
    "elf": {
      "usd": "0.22681534666895483936"
    },
    "pepe": {
      "usd": "0.000003324362255315227179"
    },
    "icx": {
      "usd": "0.03524023652030856439"
    },
    "req": {
      "usd": "0.06808453628002957766"
    },
    "xai": {
      "usd": "0.009274271877440979127"
    },
    "strax": {
      "usd": "0.011330784263611960505"
    },
    "chess": {
      "usd": "0.002805242623854591103"
    },
    "tusd": {
      "usd": "0.99820715287978848537"
    },
    "ctsi": {
      "usd": "0.027094051534310890582"
    },
    "sxp": {
      "usd": "0.00219627536387192186"
    },
    "rvn": {
      "usd": "0.005051433336905420278"
    },
    "chr": {
      "usd": "0.019077646456178375793"
    },
    "fida": {
      "usd": "0.028282036844768884679"
    },
    "ntrn": {
      "usd": "0.00159729117372503408"
    },
    "sand": {
      "usd": "0.066826669480721113322"
    },
    "osmo": {
      "usd": "0.05480705339844023187"
    },
    "kava": {
      "usd": "0.053768814135518959718"
    },
    "ocean": {
      "usd": "0.61126336604489897949"
    },
    "vidt": {
      "usd": "0.001148053031114868245"
    },
    "adx": {
      "usd": "0.05969875761797314874"
    },
    "chz": {
      "usd": "0.03404226814001478883"
    },
    "xrp": {
      "usd": "2.13408083879500334551"
    },
    "c98": {
      "usd": "0.0189678326879847797"
    },
    "psg": {
      "usd": "1.1171055146239457097"
    },
    "perp": {
      "usd": "0.1247883729472682875"
    },
    "for": {
      "usd": "0.003054819369749127678"
    },
    "uma": {
      "usd": "0.4202872400863995923"
    },
    "syn": {
      "usd": "0.039932279343125852"
    },
    "jasmy": {
      "usd": "0.005350925431978864168"
    },
    "sys": {
      "usd": "0.002226224573379266249"
    },
    "lunc": {
      "usd": "0.000083428514617625686291"
    },
    "luna": {
      "usd": "0.05860061993603718781"
    },
    "auction": {
      "usd": "4.402533797579625183"
    },
    "not": {
      "usd": "0.0004332652308729154942"
    },
    "gal": {
      "usd": "2.5376963522556478946"
    },
    "yfii": {
      "usd": "434.76269134828271365"
    },
    "alpha": {
      "usd": "0.00968357774070801911"
    },
    "tko": {
      "usd": "0.05041450267069638815"
    },
    "pixel": {
      "usd": "0.006299317066378103153"
    },
    "nexo": {
      "usd": "0.8166151125669236734"
    },
    "bico": {
      "usd": "0.0229610606222973649"
    },
    "troy": {
      "usd": "0.0000688831818668920947"
    },
    "mask": {
      "usd": "0.4282736959550247627"
    },
    "enj": {
      "usd": "0.037666122490403459899"
    },
    "aave": {
      "usd": "80.413627527219684465"
    },
    "wan": {
      "usd": "0.05420806920829334409"
    },
    "gm": {
      "usd": "713.340255115764438665"
    },
    "oax": {
      "usd": "0.03573939001209763754"
    },
    "btxtest2": {
      "usd": "0.36817561554362035544"
    },
    "orn": {
      "usd": "1.0512172537077880539"
    },
    "ens": {
      "usd": "5.720299015902778299"
    },
    "pda": {
      "usd": "0.009753459229558489351"
    },
    "bond": {
      "usd": "2.1483566286601708376"
    },
    "tlm": {
      "usd": "0.0013407262789454504809"
    },
    "kp3r": {
      "usd": "16.452099089367851024"
    },
    "lqty": {
      "usd": "0.2346021411408643805"
    },
    "ckb": {
      "usd": "0.0012508786504234173139"
    },
    "bigtime": {
      "usd": "0.011061241378045861004"
    },
    "yfi": {
      "usd": "2312.0789739669868308"
    },
    "xtz": {
      "usd": "0.31057330259116131393"
    },
    "dexe": {
      "usd": "16.5169890433004305335"
    },
    "meme": {
      "usd": "0.0004712008962488850536"
    },
    "dego": {
      "usd": "0.0279525955401880964"
    },
    "eos": {
      "usd": "0.77857961649259629937"
    },
    "alice": {
      "usd": "0.11869870034744159507"
    },
    "ooki": {
      "usd": "0.0001187985310457994097"
    },
    "rif": {
      "usd": "0.06928250466032335322"
    },
    "rune": {
      "usd": "0.4172923191356651534"
    },
    "hook": {
      "usd": "0.00778679447190954114"
    },
    "skl": {
      "usd": "0.005600502177873400743"
    },
    "alpaca": {
      "usd": "0.22402008711493602972"
    },
    "tom2": {
      "usd": "697.547038635558164199"
    },
    "gtc": {
      "usd": "0.0948391634399238985"
    },
    "tom3": {
      "usd": "697.477157146707693958"
    },
    "xec": {
      "usd": "0.000006678673720137798747"
    },
    "ygg": {
      "usd": "0.034192014187551510775"
    },
    "1inch": {
      "usd": "0.08455660150906899161"
    },
    "id": {
      "usd": "0.02635530436646306232"
    },
    "portal": {
      "usd": "0.007607099214865474806"
    },
    "zil": {
      "usd": "0.003743651188418048625"
    },
    "axs": {
      "usd": "1.0931461470180701985"
    },
    "btxtest": {
      "usd": "0.0938408564563457522"
    },
    "comp": {
      "usd": "17.440423003110215861"
    },
    "io": {
      "usd": "0.16002860946757685189"
    },
    "xvg": {
      "usd": "0.0030787787373550031892"
    },
    "iq": {
      "usd": "0.0010272578861019125427"
    },
    "pundix": {
      "usd": "0.13297449021260908716"
    },
    "unfi": {
      "usd": "1.3387296649782941883"
    },
    "cream": {
      "usd": "2.09644466551410723"
    },
    "forth": {
      "usd": "0.2365987551080206731"
    },
    "clv": {
      "usd": "0.029320276107690156831"
    },
    "powr": {
      "usd": "0.05919960412618407559"
    },
    "zk": {
      "usd": "0.013397279719618723346"
    },
    "ctxc": {
      "usd": "0.06329266275885447542"
    },
    "ghst": {
      "usd": "0.1078171542264398004"
    },
    "xvs": {
      "usd": "2.635530436646306232"
    },
    "slp": {
      "usd": "0.0005949909622125751948"
    },
    "hft": {
      "usd": "0.01038239262921272152"
    },
    "beamx": {
      "usd": "0.0016651760486083480284"
    },
    "idex": {
      "usd": "0.001986630897320511137"
    },
    "hive": {
      "usd": "0.05730282085738559762"
    },
    "kmd": {
      "usd": "0.01627240383232378469"
    },
    "city": {
      "usd": "0.4262770819878684701"
    },
    "steem": {
      "usd": "0.050684045556262487651"
    },
    "celr": {
      "usd": "0.002306089132065517953"
    },
    "dot": {
      "usd": "7.2986223569398275993"
    },
    "celo": {
      "usd": "0.072027848865163255545"
    },
    "rdnt": {
      "usd": "0.003274446906136319864"
    },
    "ton": {
      "usd": "1.7590169050646937806"
    },
    "pros": {
      "usd": "0.03713701978910704236"
    },
    "prom": {
      "usd": "1.0532138676749443465"
    },
    "ftm": {
      "usd": "0.69821590431455552222"
    },
    "knc": {
      "usd": "0.13726721024199511625"
    },
    "mav": {
      "usd": "0.012299142037682762416"
    },
    "bifi": {
      "usd": "32.04565417285849623"
    },
    "ftt": {
      "usd": "0.29310293037854375368"
    },
    "rlc": {
      "usd": "0.42647674338458409936"
    },
    "pha": {
      "usd": "0.04103041702506181293"
    },
    "manta": {
      "usd": "0.077808046300080722622"
    },
    "phb": {
      "usd": "0.0149746047536721945"
    },
    "xaut": {
      "usd": "4416.11077255628797268"
    },
    "blz": {
      "usd": "0.05810146644424811466"
    },
    "lpt": {
      "usd": "2.086461595678325767"
    },
    "gft": {
      "usd": "0.001956681687813166748"
    },
    "api3": {
      "usd": "0.30328566161104084594"
    },
    "voxel": {
      "usd": "0.0139762977700940482"
    },
    "waxp": {
      "usd": "0.005840095853932155855"
    },
    "mbl": {
      "usd": "0.0008375795592220647457"
    },
    "snt": {
      "usd": "0.02715394995332557936"
    },
    "glmr": {
      "usd": "0.01207951450129557023"
    },
    "rose": {
      "usd": "0.009034678201382224015"
    },
    "snx": {
      "usd": "0.2945005601555531585"
    },
    "atom": {
      "usd": "2.0205733347621681112"
    },
    "fun": {
      "usd": "0.0003414209883837260346"
    },
    "arkm": {
      "usd": "0.13267499811753564327"
    },
    "magic": {
      "usd": "0.05630451387380745132"
    },
    "quick": {
      "usd": "0.007736879122730633825"
    },
    "data": {
      "usd": "0.000878510145548768744"
    },
    "cos": {
      "usd": "0.0011760056266550563414"
    },
    "usd": {
      "usd": "1"
    },
    "qkc": {
      "usd": "0.0026864440928087916933"
    },
    "pyr": {
      "usd": "0.2326055271737080879"
    },
    "dai": {
      "usd": "0"
    },
    "sol": {
      "usd": "85.764552959198548633"
    },
    "high": {
      "usd": "0.1277832938980027264"
    },
    "burger": {
      "usd": "0.01717088011754411636"
    },
    "lazio": {
      "usd": "0.4961585708383387111"
    },
    "dar": {
      "usd": "0.216702496925308217341"
    },
    "etc": {
      "usd": "8.146184985997673808"
    },
    "ogn": {
      "usd": "0.020445327023680436224"
    },
    "bnb": {
      "usd": "0"
    },
    "usdt": {
      "usd": "0.9983069835781463"
    },
    "eth": {
      "usd": "1988.677426636846336915"
    },
    "neo": {
      "usd": "2.6664779531372287673"
    },
    "lrc": {
      "usd": "0.018758188221433368977"
    },
    "ordi": {
      "usd": "26.744644090058539377"
    },
    "saga": {
      "usd": "0.017989491844078196326"
    },
    "usdn": {
      "usd": "0.9983069835781463"
    },
    "pengu": {
      "usd": "0.0078636641096450584051"
    },
    "lista": {
      "usd": "0.0628933399654232169"
    },
    "spell": {
      "usd": "0.00014665129588762969147"
    },
    "tao": {
      "usd": "260.25863061882274041"
    },
    "mtl": {
      "usd": "0.2755327274675683788"
    },
    "trb": {
      "usd": "16.302353041831129079"
    },
    "alt": {
      "usd": "0.0069881488850470241"
    },
    "bnt": {
      "usd": "0.31995738823679588915"
    },
    "oxt": {
      "usd": "0.00938408564563457522"
    },
    "lever": {
      "usd": "0.0001747037221261756025"
    },
    "usdc": {
      "usd": "0.99950495195844007556"
    },
    "utk": {
      "usd": "0.007936540519446263085"
    },
    "bnx": {
      "usd": "1.77888321403789889197"
    },
    "aergo": {
      "usd": "0.06339249345721229005"
    },
    "ilv": {
      "usd": "3.913363375626333496"
    },
    "hifi": {
      "usd": "0.1267849869144245801"
    },
    "egld": {
      "usd": "3.543989791702419365"
    },
    "tru": {
      "usd": "0.00229610606222973649"
    },
    "alpine": {
      "usd": "0.4043143283491492515"
    },
    "amb": {
      "usd": "0.000319458234745006816"
    },
    "edu": {
      "usd": "0.04302703099221810553"
    },
    "nfp": {
      "usd": "0.009304221086948323516"
    },
    "ustc": {
      "usd": "0.006069706460155129504"
    },
    "trx": {
      "usd": "0.34900812145891994648"
    },
    "dash": {
      "usd": "39.053769197577083256"
    },
    "nuls": {
      "usd": "0.02575632017631617454"
    },
    "mdx": {
      "usd": "0.03444159093344604735"
    },
    "joe": {
      "usd": "0.03783583467761174477"
    },
    "pond": {
      "usd": "0.001747037221261756025"
    },
    "lina": {
      "usd": "0.0003364294534658353031"
    },
    "lsk": {
      "usd": "0.1078171542264398004"
    },
    "amp": {
      "usd": "0.000728764098012046799"
    },
    "pendle": {
      "usd": "1.5234164569402512538"
    },
    "dydx": {
      "usd": "0.146920838773195790971"
    },
    "busd": {
      "usd": "0.99860647567321974389"
    },
    "akro": {
      "usd": "0.0009793391508901615203"
    },
    "alcx": {
      "usd": "3.9932279343125852"
    },
    "qtum": {
      "usd": "0.8505575500085806476"
    },
    "arpa": {
      "usd": "0.00988323913742364837"
    },
    "coti": {
      "usd": "0.011290851984268834653"
    },
    "dcr": {
      "usd": "16.452099089367851024"
    },
    "og": {
      "usd": "2.7693035724457778362"
    },
    "ethfi": {
      "usd": "0.3703718909074922773"
    },
    "flux": {
      "usd": "0.06638741440794672895"
    },
    "ltc": {
      "usd": "129.190906744847912683"
    },
    "win": {
      "usd": "0.000019127561805357283108"
    },
    "beta": {
      "usd": "0.000359390514088132668"
    },
    "om": {
      "usd": "0.06678673720137798747"
    },
    "fxs": {
      "usd": "0.8106252706654547956"
    },
    "pla": {
      "usd": "0.23430264904579093661"
    },
    "ant": {
      "usd": "7.3944598273633296441"
    },
    "vgx": {
      "usd": "0.0179695257044066334"
    },
    "lto": {
      "usd": "0.00379356653759695594"
    },
    "crv": {
      "usd": "0.21184074191528264486"
    },
    "aeur": {
      "usd": "1.14635590924278539629"
    },
    "movr": {
      "usd": "1.7759881237855222677"
    },
    "srm": {
      "usd": "0.244006192926170518646"
    },
    "badger": {
      "usd": "0.7607099214865474806"
    },
    "rpl": {
      "usd": "1.607274243560815543"
    },
    "super": {
      "usd": "0.10991359889195390763"
    },
    "aevo": {
      "usd": "0.02306089132065517953"
    },
    "pols": {
      "usd": "0.30737872024371124577"
    },
    "cyber": {
      "usd": "0.4332652308729154942"
    },
    "qnt": {
      "usd": "70.919728113391513152"
    },
    "ldo": {
      "usd": "0.31756145147620833803"
    },
    "bake": {
      "usd": "0.05181213244770579297"
    },
    "agix": {
      "usd": "0.61306031861533964283"
    },
    "xlm": {
      "usd": "0.19007764967327905552"
    },
    "stmx": {
      "usd": "0.0045572713800342378595"
    },
    "front": {
      "usd": "0.878510145548768744"
    },
    "gala": {
      "usd": "0.003014887090406001826"
    },
    "rndr": {
      "usd": "7.018098094554368489"
    }
  },
  "ts": 1779973461283
}</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-28T21:04:21.308131" elapsed="0.000703"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:21.310068" level="INFO">${data} = {'uft': {'usd': '0.00888493215384550207'}, 'ksm': {'usd': '4.422499937251188109'}, 'vanry': {'usd': '0.0045193357146582683001'}, 'pyth': {'usd': '0.03833498816940081792'}, 'bal': {'usd': '0.9653628531...</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-28T21:04:21.308982" elapsed="0.001118"/>
</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-28T21:04:21.310229" elapsed="0.000305"/>
</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-28T21:04:21.310685" elapsed="0.000195"/>
</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-28T21:04:21.311830" elapsed="0.000233"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:21.312482" 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-28T21:04:21.312182" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.312817" 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-28T21:04:21.312625" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.313411" 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-28T21:04:21.313175" elapsed="0.000331">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-05-28T21:04:21.313589" 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-28T21:04:21.313014" elapsed="0.000601"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.314121" 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-28T21:04:21.313868" elapsed="0.000305">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-05-28T21:04:21.314253" 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-28T21:04:21.313732" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.314639" 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-28T21:04:21.314497" elapsed="0.000189">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T21:04:21.314770" 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-28T21:04:21.314380" elapsed="0.000411"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.315164" 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-28T21:04:21.315020" elapsed="0.000190">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-05-28T21:04:21.315285" 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-28T21:04:21.314897" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:21.315739" 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-28T21:04:21.315591" elapsed="0.000194">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-05-28T21:04:21.315863" 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-28T21:04:21.315463" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.316103" 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-28T21:04:21.315986" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.316333" 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-28T21:04:21.316230" elapsed="0.000142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.316565" 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-28T21:04:21.316461" elapsed="0.000140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.316791" 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-28T21:04:21.316689" elapsed="0.000140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.317026" 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-28T21:04:21.316922" elapsed="0.000143"/>
</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-28T21:04:21.317166" elapsed="0.000103"/>
</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-28T21:04:21.317377" elapsed="0.000096"/>
</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-28T21:04:21.317581" elapsed="0.000091"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:21.311461" elapsed="0.006350"/>
</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-28T21:04:21.311001" elapsed="0.006893"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.318642" 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-28T21:04:21.318061" elapsed="0.000633"/>
</kw>
<doc>验证单一货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T21:04:21.184140" elapsed="0.134689"/>
</test>
<doc>货币价格转换接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:20.818446" elapsed="0.500705"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:20.418860" elapsed="0.901555"/>
</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-28T21:04:21.326056" 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-28T21:04:21.325857" elapsed="0.000229"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.326472" 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-28T21:04:21.326355" elapsed="0.000162"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:21.326165" elapsed="0.000384"/>
</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-28T21:04:21.326665" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.326572" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.326142" elapsed="0.000585"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.327340" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:21.327227" elapsed="0.000154"/>
</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-28T21:04:21.327597" 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-28T21:04:21.327715" 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-28T21:04:21.327820" 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-28T21:04:21.327945" 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-28T21:04:21.328057" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.327441" elapsed="0.000683"/>
</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-28T21:04:21.328291" 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-28T21:04:21.328400" 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-28T21:04:21.328508" 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-28T21:04:21.328616" 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-28T21:04:21.328718" 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-28T21:04:21.328825" 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-28T21:04:21.328937" 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-28T21:04:21.329038" 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-28T21:04:21.329141" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.328145" elapsed="0.001044"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.329514" 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-28T21:04:21.329296" elapsed="0.000257"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.329861" 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-28T21:04:21.329653" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.330189" 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-28T21:04:21.329997" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.330518" 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-28T21:04:21.330323" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.330847" 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-28T21:04:21.330653" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.331125" 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-28T21:04:21.330962" elapsed="0.000193"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.331422" 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-28T21:04:21.331241" elapsed="0.000211"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.331714" 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-28T21:04:21.331535" elapsed="0.000211"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.332003" 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-28T21:04:21.331831" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:21.329209" elapsed="0.002856"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.327424" elapsed="0.004657"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.332280" 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-28T21:04:21.332160" elapsed="0.000155"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:21.332640" 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-28T21:04:21.332402" elapsed="0.000389"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:21.326991" elapsed="0.005855"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.332995" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:21.332928" elapsed="0.000100"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:21.325626" elapsed="0.007443"/>
</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-28T21:04:21.335584" 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-28T21:04:21.335036" elapsed="0.000572"/>
</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-28T21:04:21.336145" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.335729" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.335715" elapsed="0.000497"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:21.336240" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T21:04:21.336406" 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-28T21:04:21.334307" elapsed="0.002121"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:21.603597" 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-28T21:04:21.603995" 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 13: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': '27b0c72504967a3e5481d2054269aec6', 'X-Transparent': '00-27b0c72504967a3e5481d2054269aec6-ea88f89a937cf9a9-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': 'a02d76f69ad43201-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":1779973460653,"cv":"-2232.87","cr":"-0.0294","o":"75700.03","l":"72728.85","h":"75700.04","c":"73467.16","q":"1904.580570","v":"141244146.8044797"},{"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":1779973458612,"cv":"-0.0001","cr":"-0.0005","o":"0.1800","l":"0.1799","h":"0.1800","c":"0.1799","q":"18136280.6","v":"3263466.41437"},{"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":1779973461593} 
 </msg>
<msg time="2026-05-28T21:04:21.604235" 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-28T21:04:21.604636" 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-28T21:04:21.336514" elapsed="0.268190"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.606699" 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-28T21:04:21.605267" elapsed="0.001584"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.608651" 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-28T21:04:21.607186" elapsed="0.001590"/>
</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-28T21:04:21.609043" elapsed="0.000355"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.611242" 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-28T21:04:21.609652" elapsed="0.001635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.611786" 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": 1779973460653,
      "cv": "-2232.87",
      "cr": "-0.0294",
      "o": "75700.03",
      "l": "72728.85",
      "h": "75700.04",
      "c": "73467.16",
      "q": "1904.580570",
      "v": "141244146.8044797"
    },
    {
      "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": 1779973458612,
      "cv": "-0.0001",
      "cr": "-0.0005",
      "o": "0.1800",
      "l": "0.1799",
      "h": "0.1800",
      "c": "0.1799",
      "q": "18136280.6",
      "v": "3263466.41437"
    },
    {
      "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": 1779973461593
}</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-28T21:04:21.611480" elapsed="0.000532"/>
</kw>
<doc>验证24小时行情接口基本功能获取24小时行情数据</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:21.333123" elapsed="0.279152"/>
</test>
<doc>24小时行情</doc>
<status status="PASS" start="2026-05-28T21:04:21.322538" elapsed="0.290291"/>
</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-28T21:04:21.621380" 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-28T21:04:21.621108" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.622007" 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-28T21:04:21.621839" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:21.621557" elapsed="0.000554"/>
</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-28T21:04:21.622277" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.622149" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.621516" elapsed="0.000892"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.623296" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:21.623156" 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-28T21:04:21.623631" 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-28T21:04:21.623778" elapsed="0.000024"/>
</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-28T21:04:21.623928" 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-28T21:04:21.624067" elapsed="0.000027"/>
</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-28T21:04:21.624222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.623430" elapsed="0.000853"/>
</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-28T21:04:21.624436" 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-28T21:04:21.624543" 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-28T21:04:21.624653" 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-28T21:04:21.624766" 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-28T21:04:21.624868" 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-28T21:04:21.624969" 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-28T21:04:21.625070" 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-28T21:04:21.625174" 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-28T21:04:21.625281" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.624305" elapsed="0.001025"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.625707" 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-28T21:04:21.625441" elapsed="0.000303"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.626044" 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-28T21:04:21.625842" elapsed="0.000239"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.626375" 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-28T21:04:21.626179" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.626701" 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-28T21:04:21.626509" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.627025" 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-28T21:04:21.626829" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.627347" 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-28T21:04:21.627152" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.627690" 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-28T21:04:21.627477" elapsed="0.000248"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.628023" 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-28T21:04:21.627820" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.628353" 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-28T21:04:21.628151" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:21.625355" elapsed="0.003067"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.623409" elapsed="0.005035"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.628677" 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-28T21:04:21.628534" elapsed="0.000182"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:21.629123" 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-28T21:04:21.628841" elapsed="0.000475"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:21.622837" elapsed="0.006546"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.629551" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:21.629478" elapsed="0.000106"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:21.620747" elapsed="0.008884"/>
</kw>
<test id="s1-s4-s2-s2-t1" name="获取市场深度数据" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.630988" 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-28T21:04:21.630778" elapsed="0.000232"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:21.632487" 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-28T21:04:21.631901" elapsed="0.000610"/>
</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-28T21:04:21.633225" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:21.632627" elapsed="0.000676"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:21.632608" elapsed="0.000723"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:21.633370" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T21:04:21.633620" 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-28T21:04:21.631209" elapsed="0.002444"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:22.341420" 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-28T21:04:22.341840" 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 13: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': '23ada34ca3830b1defb44fd439ca8128', 'X-Transparent': '00-23ada34ca3830b1defb44fd439ca8128-64850a6ae4d0be82-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': 'a02d76fadea308ed-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"timestamp":1779973459793,"lastUpdateId":1772262553975,"bids":[["73467.16","3.168320"],["73467.15","3.655320"],["73467.14","0.360290"],["73467.11","1.459080"],["73467.10","4.756990"],["73467.05","24.691060"],["73467.03","24.389960"],["73467.01","28.356380"],["73466.97","1.767880"],["73466.96","0.579780"],["73466.93","0.538210"],["73466.85","1.546010"],["73466.82","0.669350"],["73466.78","1.807010"],["73466.74","2.907300"],["73466.70","0.668930"],["73466.66","0.607090"],["73466.61","6.040960"],["73466.41","3.059960"],["73466.34","0.501710"],["73466.33","3.453410"],["73466.18","7.213570"],["73466.17","0.327840"],["73466.10","0.899040"],["73466.04","0.067530"],["73465.99","0.278720"],["73465.97","1.315830"],["73465.87","4.269480"],["73465.74","0.673610"],["73465.51","0.273690"],["73465.46","3.432500"],["73465.36","2.469490"],["73465.34","2.465970"],["73465.21","3.027120"],["73465.10","3.733520"],["73465.06","0.810220"],["73465.03","2.570640"],["73464.99","0.721430"],["73464.77","0.401710"],["73464.72","0.558860"],["73464.69","5.057120"],["73464.47","0.576610"],["73463.93","0.591510"],["73463.88","0.559010"],["73463.63","0.948240"],["73463.60","2.131830"],["73463.57","1.433420"],["73463.46","2.886140"],["73463.34","0.523880"],["73463.29","1.221520"],["73463.18","0.440360"],["73463.17","0.439000"],["73463.14","2.904570"],["73463.05","0.435550"],["73463.03","2.612790"],["73462.98","0.059460"],["73462.94","1.928900"],["73462.91","0.510860"],["73462.66","0.508930"],["73462.28","6.285230"],["73462.13","0.641100"],["73461.95","4.060490"],["73461.85","0.708110"],["73461.81","0.270990"],["73461.80","3.752950"],["73461.76","0.898030"],["73461.57","6.685620"],["73461.50","2.519270"],["73461.27","5.913970"],["73461.11","0.645840"],["73461.03","3.650650"],["73460.82","0.147460"],["73460.78","1.593110"],["73459.79","2.806920"],["73459.75","5.473020"],["73459.74","7.846110"],["73459.72","2.653510"],["73459.65","3.217150"],["73459.62","0.818590"],["73459.50","2.518910"],["73459.36","0.524890"],["73458.97","0.446470"],["73458.83","1.644700"],["73458.68","0.484000"],["73458.41","1.477800"],["73458.09","0.570120"],["73457.62","0.475330"],["73457.51","4.934210"],["73457.48","0.645860"],["73457.47","0.553630"],["73456.62","2.938840"],["73456.58","0.529710"],["73456.56","0.779100"],["73456.55","3.811320"],["73456.54","0.633790"],["73456.36","0.493470"],["73456.15","7.224350"],["73456.11","0.774340"],["73455.35","2.200070"],["73455.34","3.007050"],["73455.06","0.402660"],["73454.81","0.428840"],["73454.54","2.908140"],["73454.35","0.897740"],["73454.07","5.063240"],["73453.93","2.197560"],["73453.92","0.807480"],["73453.52","1.503040"],["73453.26","6.446900"],["73453.10","0.735820"],["73452.32","0.854010"],["73451.42","0.732370"],["73451.34","0.657020"],["73451.18","0.175940"],["73450.98","1.393420"],["73450.74","3.681150"],["73450.69","0.408340"],["73450.28","0.393560"],["73450.23","4.145170"],["73450.13","0.768610"],["73450.05","4.441730"],["73449.58","0.389190"],["73449.18","0.431200"],["73448.98","0.450620"],["73448.75","0.805850"],["73448.67","3.868560"],["73448.23","4.764240"],["73448.09","0.485710"],["73447.63","0.414830"],["73447.48","1.918270"],["73447.28","2.731480"],["73446.94","8.637390"],["73446.06","5.202350"],["73445.00","0.934750"],["73444.84","3.052480"],["73444.82","0.785840"],["73444.40","3.552780"],["73443.97","2.593230"],["73443.86","0.899320"],["73443.53","0.829320"],["73443.43","0.363870"],["73442.89","0.720400"],["73442.83","0.421690"],["73442.48","0.038600"],["73442.12","0.304170"],["73441.94","2.125090"],["73441.75","5.533130"],["73441.43","1.516960"],["73441.01","0.604930"],["73440.67","0.725060"],["73440.38","1.930700"],["73439.96","2.520980"],["73439.90","0.463640"],["73439.69","3.381300"],["73439.43","1.120100"],["73439.13","3.820760"],["73438.94","4.095160"],["73438.49","3.166850"],["73438.38","1.127850"],["73438.28","0.779890"],["73437.96","2.879880"],["73437.44","0.513000"],["73436.30","0.632480"],["73436.14","3.631300"],["73435.58","1.316750"],["73435.57","4.503650"],["73435.49","0.965050"],["73435.11","0.593920"],["73434.88","3.862140"],["73434.82","0.624400"],["73434.42","3.684560"],["73434.28","0.376060"],["73434.23","0.551090"],["73433.97","3.747020"],["73433.23","0.495340"],["73432.92","2.101710"],["73432.62","1.043720"],["73432.15","0.652830"],["73432.12","0.387860"],["73432.09","0.804600"],["73431.56","0.647970"],["73431.50","1.012470"],["73430.91","0.556030"],["73430.75","2.884800"],["73430.74","0.988000"],["73430.71","0.539090"],["73430.61","0.535490"],["73430.60","0.550840"],["73429.89","2.260860"],["73427.69","0.318640"],["73427.53","0.514550"],["73427.37","0.566910"],["73426.82","0.548850"],["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":[["73467.17","3.239440"],["73467.18","3.767040"],["73467.20","2.041700"],["73467.21","0.627620"],["73467.22","0.780690"],["73467.25","19.327800"],["73467.26","0.245990"],["73467.27","21.940800"],["73467.28","18.259200"],["73467.30","0.894940"],["73467.32","4.561720"],["73467.34","1.864270"],["73467.42","4.045860"],["73467.43","0.318920"],["73467.46","2.798820"],["73467.59","0.414150"],["73467.66","2.964500"],["73467.70","2.141380"],["73467.71","0.806580"],["73467.72","2.107460"],["73467.73","2.342510"],["73467.94","0.523520"],["73467.98","0.420190"],["73468.07","3.068970"],["73468.12","4.033630"],["73468.15","0.460640"],["73468.32","0.996120"],["73468.39","0.721510"],["73468.43","5.220920"],["73468.44","0.888450"],["73468.47","2.155860"],["73468.53","0.956420"],["73468.58","3.648370"],["73468.87","2.236150"],["73468.95","0.537200"],["73469.17","0.847960"],["73469.20","0.540950"],["73469.36","1.894450"],["73469.41","4.036470"],["73469.45","1.495870"],["73469.48","0.629820"],["73469.56","3.545840"],["73469.63","1.023230"],["73469.65","0.562280"],["73469.92","6.339770"],["73470.09","0.243880"],["73470.19","0.575220"],["73470.25","0.193760"],["73470.38","0.478480"],["73470.42","3.485490"],["73470.54","4.097940"],["73470.76","0.023880"],["73471.24","1.054520"],["73471.34","0.282260"],["73471.39","3.866560"],["73471.47","0.864950"],["73471.54","0.142770"],["73471.81","6.552840"],["73471.88","0.403890"],["73472.01","0.516900"],["73472.02","0.950990"],["73472.09","1.789030"],["73472.20","5.682930"],["73472.28","2.134640"],["73472.62","0.610710"],["73472.89","5.374460"],["73472.90","1.835240"],["73473.07","0.440830"],["73473.15","0.492110"],["73473.30","0.778780"],["73473.38","0.383400"],["73473.61","8.047860"],["73473.93","0.539930"],["73474.47","3.351570"],["73474.53","0.636060"],["73474.54","2.836890"],["73474.71","0.245420"],["73474.88","6.764160"],["73474.90","0.457420"],["73475.39","3.906900"],["73475.44","1.222030"],["73475.53","2.158190"],["73475.63","0.593630"],["73475.64","1.625290"],["73475.88","0.354050"],["73475.96","1.191250"],["73476.01","4.144500"],["73476.07","1.906040"],["73476.15","0.471010"],["73476.36","0.562030"],["73476.82","1.804090"],["73476.90","3.392310"],["73477.12","2.286150"],["73477.64","4.154580"],["73477.87","3.164480"],["73477.88","3.292280"],["73477.89","4.329350"],["73477.91","0.179310"],["73477.92","0.847610"],["73477.94","0.645090"],["73477.97","1.117170"],["73478.02","5.960570"],["73478.06","1.071320"],["73478.07","0.269960"],["73478.53","2.432000"],["73478.55","1.223880"],["73478.84","0.730480"],["73479.31","0.392740"],["73479.77","0.232130"],["73480.11","0.370390"],["73480.93","3.609010"],["73481.11","0.607000"],["73481.14","0.629280"],["73481.49","5.629430"],["73482.39","2.424170"],["73483.02","0.685030"],["73483.07","1.232610"],["73483.47","3.906640"],["73483.82","0.682060"],["73484.26","2.935100"],["73484.41","1.532990"],["73485.07","2.061590"],["73485.24","0.242690"],["73485.40","6.071840"],["73485.47","0.412450"],["73485.60","1.560690"],["73485.75","0.578990"],["73485.76","3.911390"],["73485.97","2.132470"],["73486.08","0.615250"],["73486.41","0.238070"],["73486.82","3.670290"],["73486.95","4.356570"],["73487.04","5.961920"],["73487.59","8.468980"],["73488.08","0.597870"],["73488.09","4.331750"],["73488.24","0.553950"],["73488.28","0.865040"],["73488.38","4.872870"],["73488.61","3.639950"],["73489.90","0.554300"],["73489.95","4.260540"],["73490.26","0.713640"],["73490.39","0.329720"],["73490.46","0.722700"],["73490.49","2.459300"],["73490.80","0.454860"],["73491.18","0.703000"],["73491.26","0.842280"],["73491.40","0.747530"],["73491.46","0.688010"],["73491.48","0.386150"],["73491.50","0.386700"],["73491.55","5.045730"],["73491.57","0.447880"],["73491.73","0.298050"],["73491.85","0.419500"],["73492.49","0.883660"],["73492.83","0.171590"],["73492.95","0.264750"],["73493.57","0.294060"],["73493.73","0.535300"],["73493.82","1.819120"],["73493.85","0.686590"],["73494.34","1.591380"],["73494.44","4.051550"],["73495.04","0.457730"],["73495.22","0.599020"],["73495.39","0.654170"],["73495.54","3.776960"],["73495.72","5.283810"],["73495.73","2.792460"],["73495.84","1.755780"],["73495.85","0.334380"],["73495.90","2.642330"],["73495.92","2.612620"],["73496.01","2.780720"],["73496.23","1.151120"],["73496.26","0.511750"],["73496.60","4.275690"],["73496.74","0.761270"],["73498.10","0.479840"],["73498.17","3.258030"],["73498.63","0.682780"],["73499.34","0.541210"],["73499.36","5.239990"],["73500.88","1.947260"],["73501.23","0.213270"],["73501.57","0.863590"],["73502.11","0.682760"],["73504.25","1.855790"],["73504.58","0.619390"],["73507.11","0.517520"],["73507.99","3.837350"],["73508.09","0.579820"],["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",... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T21:04:22.342374" 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-28T21:04:22.342768" 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-28T21:04:21.633771" elapsed="0.709068"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.344987" 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-28T21:04:22.343487" elapsed="0.001660"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.348005" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'timestamp': 1779973459793, 'lastUpdateId': 1772262553975, 'bids': [['73467.16', '3.168320'], ['73467.15', '3.655320'], ['73467.14', '0.360290'], ...</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-28T21:04:22.345448" elapsed="0.002620"/>
</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-28T21:04:22.348328" elapsed="0.000351"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.351674" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1779973459793,
    "lastUpdateId": 1772262553975,
    "bids": [
      [
        "73467.16",
        "3.168320"
      ],...</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-28T21:04:22.348927" elapsed="0.002793"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.352323" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1779973459793,
    "lastUpdateId": 1772262553975,
    "bids": [
      [
        "73467.16",
        "3.168320"
      ],
      [
        "73467.15",
        "3.655320"
      ],
      [
        "73467.14",
        "0.360290"
      ],
      [
        "73467.11",
        "1.459080"
      ],
      [
        "73467.10",
        "4.756990"
      ],
      [
        "73467.05",
        "24.691060"
      ],
      [
        "73467.03",
        "24.389960"
      ],
      [
        "73467.01",
        "28.356380"
      ],
      [
        "73466.97",
        "1.767880"
      ],
      [
        "73466.96",
        "0.579780"
      ],
      [
        "73466.93",
        "0.538210"
      ],
      [
        "73466.85",
        "1.546010"
      ],
      [
        "73466.82",
        "0.669350"
      ],
      [
        "73466.78",
        "1.807010"
      ],
      [
        "73466.74",
        "2.907300"
      ],
      [
        "73466.70",
        "0.668930"
      ],
      [
        "73466.66",
        "0.607090"
      ],
      [
        "73466.61",
        "6.040960"
      ],
      [
        "73466.41",
        "3.059960"
      ],
      [
        "73466.34",
        "0.501710"
      ],
      [
        "73466.33",
        "3.453410"
      ],
      [
        "73466.18",
        "7.213570"
      ],
      [
        "73466.17",
        "0.327840"
      ],
      [
        "73466.10",
        "0.899040"
      ],
      [
        "73466.04",
        "0.067530"
      ],
      [
        "73465.99",
        "0.278720"
      ],
      [
        "73465.97",
        "1.315830"
      ],
      [
        "73465.87",
        "4.269480"
      ],
      [
        "73465.74",
        "0.673610"
      ],
      [
        "73465.51",
        "0.273690"
      ],
      [
        "73465.46",
        "3.432500"
      ],
      [
        "73465.36",
        "2.469490"
      ],
      [
        "73465.34",
        "2.465970"
      ],
      [
        "73465.21",
        "3.027120"
      ],
      [
        "73465.10",
        "3.733520"
      ],
      [
        "73465.06",
        "0.810220"
      ],
      [
        "73465.03",
        "2.570640"
      ],
      [
        "73464.99",
        "0.721430"
      ],
      [
        "73464.77",
        "0.401710"
      ],
      [
        "73464.72",
        "0.558860"
      ],
      [
        "73464.69",
        "5.057120"
      ],
      [
        "73464.47",
        "0.576610"
      ],
      [
        "73463.93",
        "0.591510"
      ],
      [
        "73463.88",
        "0.559010"
      ],
      [
        "73463.63",
        "0.948240"
      ],
      [
        "73463.60",
        "2.131830"
      ],
      [
        "73463.57",
        "1.433420"
      ],
      [
        "73463.46",
        "2.886140"
      ],
      [
        "73463.34",
        "0.523880"
      ],
      [
        "73463.29",
        "1.221520"
      ],
      [
        "73463.18",
        "0.440360"
      ],
      [
        "73463.17",
        "0.439000"
      ],
      [
        "73463.14",
        "2.904570"
      ],
      [
        "73463.05",
        "0.435550"
      ],
      [
        "73463.03",
        "2.612790"
      ],
      [
        "73462.98",
        "0.059460"
      ],
      [
        "73462.94",
        "1.928900"
      ],
      [
        "73462.91",
        "0.510860"
      ],
      [
        "73462.66",
        "0.508930"
      ],
      [
        "73462.28",
        "6.285230"
      ],
      [
        "73462.13",
        "0.641100"
      ],
      [
        "73461.95",
        "4.060490"
      ],
      [
        "73461.85",
        "0.708110"
      ],
      [
        "73461.81",
        "0.270990"
      ],
      [
        "73461.80",
        "3.752950"
      ],
      [
        "73461.76",
        "0.898030"
      ],
      [
        "73461.57",
        "6.685620"
      ],
      [
        "73461.50",
        "2.519270"
      ],
      [
        "73461.27",
        "5.913970"
      ],
      [
        "73461.11",
        "0.645840"
      ],
      [
        "73461.03",
        "3.650650"
      ],
      [
        "73460.82",
        "0.147460"
      ],
      [
        "73460.78",
        "1.593110"
      ],
      [
        "73459.79",
        "2.806920"
      ],
      [
        "73459.75",
        "5.473020"
      ],
      [
        "73459.74",
        "7.846110"
      ],
      [
        "73459.72",
        "2.653510"
      ],
      [
        "73459.65",
        "3.217150"
      ],
      [
        "73459.62",
        "0.818590"
      ],
      [
        "73459.50",
        "2.518910"
      ],
      [
        "73459.36",
        "0.524890"
      ],
      [
        "73458.97",
        "0.446470"
      ],
      [
        "73458.83",
        "1.644700"
      ],
      [
        "73458.68",
        "0.484000"
      ],
      [
        "73458.41",
        "1.477800"
      ],
      [
        "73458.09",
        "0.570120"
      ],
      [
        "73457.62",
        "0.475330"
      ],
      [
        "73457.51",
        "4.934210"
      ],
      [
        "73457.48",
        "0.645860"
      ],
      [
        "73457.47",
        "0.553630"
      ],
      [
        "73456.62",
        "2.938840"
      ],
      [
        "73456.58",
        "0.529710"
      ],
      [
        "73456.56",
        "0.779100"
      ],
      [
        "73456.55",
        "3.811320"
      ],
      [
        "73456.54",
        "0.633790"
      ],
      [
        "73456.36",
        "0.493470"
      ],
      [
        "73456.15",
        "7.224350"
      ],
      [
        "73456.11",
        "0.774340"
      ],
      [
        "73455.35",
        "2.200070"
      ],
      [
        "73455.34",
        "3.007050"
      ],
      [
        "73455.06",
        "0.402660"
      ],
      [
        "73454.81",
        "0.428840"
      ],
      [
        "73454.54",
        "2.908140"
      ],
      [
        "73454.35",
        "0.897740"
      ],
      [
        "73454.07",
        "5.063240"
      ],
      [
        "73453.93",
        "2.197560"
      ],
      [
        "73453.92",
        "0.807480"
      ],
      [
        "73453.52",
        "1.503040"
      ],
      [
        "73453.26",
        "6.446900"
      ],
      [
        "73453.10",
        "0.735820"
      ],
      [
        "73452.32",
        "0.854010"
      ],
      [
        "73451.42",
        "0.732370"
      ],
      [
        "73451.34",
        "0.657020"
      ],
      [
        "73451.18",
        "0.175940"
      ],
      [
        "73450.98",
        "1.393420"
      ],
      [
        "73450.74",
        "3.681150"
      ],
      [
        "73450.69",
        "0.408340"
      ],
      [
        "73450.28",
        "0.393560"
      ],
      [
        "73450.23",
        "4.145170"
      ],
      [
        "73450.13",
        "0.768610"
      ],
      [
        "73450.05",
        "4.441730"
      ],
      [
        "73449.58",
        "0.389190"
      ],
      [
        "73449.18",
        "0.431200"
      ],
      [
        "73448.98",
        "0.450620"
      ],
      [
        "73448.75",
        "0.805850"
      ],
      [
        "73448.67",
        "3.868560"
      ],
      [
        "73448.23",
        "4.764240"
      ],
      [
        "73448.09",
        "0.485710"
      ],
      [
        "73447.63",
        "0.414830"
      ],
      [
        "73447.48",
        "1.918270"
      ],
      [
        "73447.28",
        "2.731480"
      ],
      [
        "73446.94",
        "8.637390"
      ],
      [
        "73446.06",
        "5.202350"
      ],
      [
        "73445.00",
        "0.934750"
      ],
      [
        "73444.84",
        "3.052480"
      ],
      [
        "73444.82",
        "0.785840"
      ],
      [
        "73444.40",
        "3.552780"
      ],
      [
        "73443.97",
        "2.593230"
      ],
      [
        "73443.86",
        "0.899320"
      ],
      [
        "73443.53",
        "0.829320"
      ],
      [
        "73443.43",
        "0.363870"
      ],
      [
        "73442.89",
        "0.720400"
      ],
      [
        "73442.83",
        "0.421690"
      ],
      [
        "73442.48",
        "0.038600"
      ],
      [
        "73442.12",
        "0.304170"
      ],
      [
        "73441.94",
        "2.125090"
      ],
      [
        "73441.75",
        "5.533130"
      ],
      [
        "73441.43",
        "1.516960"
      ],
      [
        "73441.01",
        "0.604930"
      ],
      [
        "73440.67",
        "0.725060"
      ],
      [
        "73440.38",
        "1.930700"
      ],
      [
        "73439.96",
        "2.520980"
      ],
      [
        "73439.90",
        "0.463640"
      ],
      [
        "73439.69",
        "3.381300"
      ],
      [
        "73439.43",
        "1.120100"
      ],
      [
        "73439.13",
        "3.820760"
      ],
      [
        "73438.94",
        "4.095160"
      ],
      [
        "73438.49",
        "3.166850"
      ],
      [
        "73438.38",
        "1.127850"
      ],
      [
        "73438.28",
        "0.779890"
      ],
      [
        "73437.96",
        "2.879880"
      ],
      [
        "73437.44",
        "0.513000"
      ],
      [
        "73436.30",
        "0.632480"
      ],
      [
        "73436.14",
        "3.631300"
      ],
      [
        "73435.58",
        "1.316750"
      ],
      [
        "73435.57",
        "4.503650"
      ],
      [
        "73435.49",
        "0.965050"
      ],
      [
        "73435.11",
        "0.593920"
      ],
      [
        "73434.88",
        "3.862140"
      ],
      [
        "73434.82",
        "0.624400"
      ],
      [
        "73434.42",
        "3.684560"
      ],
      [
        "73434.28",
        "0.376060"
      ],
      [
        "73434.23",
        "0.551090"
      ],
      [
        "73433.97",
        "3.747020"
      ],
      [
        "73433.23",
        "0.495340"
      ],
      [
        "73432.92",
        "2.101710"
      ],
      [
        "73432.62",
        "1.043720"
      ],
      [
        "73432.15",
        "0.652830"
      ],
      [
        "73432.12",
        "0.387860"
      ],
      [
        "73432.09",
        "0.804600"
      ],
      [
        "73431.56",
        "0.647970"
      ],
      [
        "73431.50",
        "1.012470"
      ],
      [
        "73430.91",
        "0.556030"
      ],
      [
        "73430.75",
        "2.884800"
      ],
      [
        "73430.74",
        "0.988000"
      ],
      [
        "73430.71",
        "0.539090"
      ],
      [
        "73430.61",
        "0.535490"
      ],
      [
        "73430.60",
        "0.550840"
      ],
      [
        "73429.89",
        "2.260860"
      ],
      [
        "73427.69",
        "0.318640"
      ],
      [
        "73427.53",
        "0.514550"
      ],
      [
        "73427.37",
        "0.566910"
      ],
      [
        "73426.82",
        "0.548850"
      ],
      [
        "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": [
      [
        "73467.17",
        "3.239440"
      ],
      [
        "73467.18",
        "3.767040"
      ],
      [
        "73467.20",
        "2.041700"
      ],
      [
        "73467.21",
        "0.627620"
      ],
      [
        "73467.22",
        "0.780690"
      ],
      [
        "73467.25",
        "19.327800"
      ],
      [
        "73467.26",
        "0.245990"
      ],
      [
        "73467.27",
        "21.940800"
      ],
      [
        "73467.28",
        "18.259200"
      ],
      [
        "73467.30",
        "0.894940"
      ],
      [
        "73467.32",
        "4.561720"
      ],
      [
        "73467.34",
        "1.864270"
      ],
      [
        "73467.42",
        "4.045860"
      ],
      [
        "73467.43",
        "0.318920"
      ],
      [
        "73467.46",
        "2.798820"
      ],
      [
        "73467.59",
        "0.414150"
      ],
      [
        "73467.66",
        "2.964500"
      ],
      [
        "73467.70",
        "2.141380"
      ],
      [
        "73467.71",
        "0.806580"
      ],
      [
        "73467.72",
        "2.107460"
      ],
      [
        "73467.73",
        "2.342510"
      ],
      [
        "73467.94",
        "0.523520"
      ],
      [
        "73467.98",
        "0.420190"
      ],
      [
        "73468.07",
        "3.068970"
      ],
      [
        "73468.12",
        "4.033630"
      ],
      [
        "73468.15",
        "0.460640"
      ],
      [
        "73468.32",
        "0.996120"
      ],
      [
        "73468.39",
        "0.721510"
      ],
      [
        "73468.43",
        "5.220920"
      ],
      [
        "73468.44",
        "0.888450"
      ],
      [
        "73468.47",
        "2.155860"
      ],
      [
        "73468.53",
        "0.956420"
      ],
      [
        "73468.58",
        "3.648370"
      ],
      [
        "73468.87",
        "2.236150"
      ],
      [
        "73468.95",
        "0.537200"
      ],
      [
        "73469.17",
        "0.847960"
      ],
      [
        "73469.20",
        "0.540950"
      ],
      [
        "73469.36",
        "1.894450"
      ],
      [
        "73469.41",
        "4.036470"
      ],
      [
        "73469.45",
        "1.495870"
      ],
      [
        "73469.48",
        "0.629820"
      ],
      [
        "73469.56",
        "3.545840"
      ],
      [
        "73469.63",
        "1.023230"
      ],
      [
        "73469.65",
        "0.562280"
      ],
      [
        "73469.92",
        "6.339770"
      ],
      [
        "73470.09",
        "0.243880"
      ],
      [
        "73470.19",
        "0.575220"
      ],
      [
        "73470.25",
        "0.193760"
      ],
      [
        "73470.38",
        "0.478480"
      ],
      [
        "73470.42",
        "3.485490"
      ],
      [
        "73470.54",
        "4.097940"
      ],
      [
        "73470.76",
        "0.023880"
      ],
      [
        "73471.24",
        "1.054520"
      ],
      [
        "73471.34",
        "0.282260"
      ],
      [
        "73471.39",
        "3.866560"
      ],
      [
        "73471.47",
        "0.864950"
      ],
      [
        "73471.54",
        "0.142770"
      ],
      [
        "73471.81",
        "6.552840"
      ],
      [
        "73471.88",
        "0.403890"
      ],
      [
        "73472.01",
        "0.516900"
      ],
      [
        "73472.02",
        "0.950990"
      ],
      [
        "73472.09",
        "1.789030"
      ],
      [
        "73472.20",
        "5.682930"
      ],
      [
        "73472.28",
        "2.134640"
      ],
      [
        "73472.62",
        "0.610710"
      ],
      [
        "73472.89",
        "5.374460"
      ],
      [
        "73472.90",
        "1.835240"
      ],
      [
        "73473.07",
        "0.440830"
      ],
      [
        "73473.15",
        "0.492110"
      ],
      [
        "73473.30",
        "0.778780"
      ],
      [
        "73473.38",
        "0.383400"
      ],
      [
        "73473.61",
        "8.047860"
      ],
      [
        "73473.93",
        "0.539930"
      ],
      [
        "73474.47",
        "3.351570"
      ],
      [
        "73474.53",
        "0.636060"
      ],
      [
        "73474.54",
        "2.836890"
      ],
      [
        "73474.71",
        "0.245420"
      ],
      [
        "73474.88",
        "6.764160"
      ],
      [
        "73474.90",
        "0.457420"
      ],
      [
        "73475.39",
        "3.906900"
      ],
      [
        "73475.44",
        "1.222030"
      ],
      [
        "73475.53",
        "2.158190"
      ],
      [
        "73475.63",
        "0.593630"
      ],
      [
        "73475.64",
        "1.625290"
      ],
      [
        "73475.88",
        "0.354050"
      ],
      [
        "73475.96",
        "1.191250"
      ],
      [
        "73476.01",
        "4.144500"
      ],
      [
        "73476.07",
        "1.906040"
      ],
      [
        "73476.15",
        "0.471010"
      ],
      [
        "73476.36",
        "0.562030"
      ],
      [
        "73476.82",
        "1.804090"
      ],
      [
        "73476.90",
        "3.392310"
      ],
      [
        "73477.12",
        "2.286150"
      ],
      [
        "73477.64",
        "4.154580"
      ],
      [
        "73477.87",
        "3.164480"
      ],
      [
        "73477.88",
        "3.292280"
      ],
      [
        "73477.89",
        "4.329350"
      ],
      [
        "73477.91",
        "0.179310"
      ],
      [
        "73477.92",
        "0.847610"
      ],
      [
        "73477.94",
        "0.645090"
      ],
      [
        "73477.97",
        "1.117170"
      ],
      [
        "73478.02",
        "5.960570"
      ],
      [
        "73478.06",
        "1.071320"
      ],
      [
        "73478.07",
        "0.269960"
      ],
      [
        "73478.53",
        "2.432000"
      ],
      [
        "73478.55",
        "1.223880"
      ],
      [
        "73478.84",
        "0.730480"
      ],
      [
        "73479.31",
        "0.392740"
      ],
      [
        "73479.77",
        "0.232130"
      ],
      [
        "73480.11",
        "0.370390"
      ],
      [
        "73480.93",
        "3.609010"
      ],
      [
        "73481.11",
        "0.607000"
      ],
      [
        "73481.14",
        "0.629280"
      ],
      [
        "73481.49",
        "5.629430"
      ],
      [
        "73482.39",
        "2.424170"
      ],
      [
        "73483.02",
        "0.685030"
      ],
      [
        "73483.07",
        "1.232610"
      ],
      [
        "73483.47",
        "3.906640"
      ],
      [
        "73483.82",
        "0.682060"
      ],
      [
        "73484.26",
        "2.935100"
      ],
      [
        "73484.41",
        "1.532990"
      ],
      [
        "73485.07",
        "2.061590"
      ],
      [
        "73485.24",
        "0.242690"
      ],
      [
        "73485.40",
        "6.071840"
      ],
      [
        "73485.47",
        "0.412450"
      ],
      [
        "73485.60",
        "1.560690"
      ],
      [
        "73485.75",
        "0.578990"
      ],
      [
        "73485.76",
        "3.911390"
      ],
      [
        "73485.97",
        "2.132470"
      ],
      [
        "73486.08",
        "0.615250"
      ],
      [
        "73486.41",
        "0.238070"
      ],
      [
        "73486.82",
        "3.670290"
      ],
      [
        "73486.95",
        "4.356570"
      ],
      [
        "73487.04",
        "5.961920"
      ],
      [
        "73487.59",
        "8.468980"
      ],
      [
        "73488.08",
        "0.597870"
      ],
      [
        "73488.09",
        "4.331750"
      ],
      [
        "73488.24",
        "0.553950"
      ],
      [
        "73488.28",
        "0.865040"
      ],
      [
        "73488.38",
        "4.872870"
      ],
      [
        "73488.61",
        "3.639950"
      ],
      [
        "73489.90",
        "0.554300"
      ],
      [
        "73489.95",
        "4.260540"
      ],
      [
        "73490.26",
        "0.713640"
      ],
      [
        "73490.39",
        "0.329720"
      ],
      [
        "73490.46",
        "0.722700"
      ],
      [
        "73490.49",
        "2.459300"
      ],
      [
        "73490.80",
        "0.454860"
      ],
      [
        "73491.18",
        "0.703000"
      ],
      [
        "73491.26",
        "0.842280"
      ],
      [
        "73491.40",
        "0.747530"
      ],
      [
        "73491.46",
        "0.688010"
      ],
      [
        "73491.48",
        "0.386150"
      ],
      [
        "73491.50",
        "0.386700"
      ],
      [
        "73491.55",
        "5.045730"
      ],
      [
        "73491.57",
        "0.447880"
      ],
      [
        "73491.73",
        "0.298050"
      ],
      [
        "73491.85",
        "0.419500"
      ],
      [
        "73492.49",
        "0.883660"
      ],
      [
        "73492.83",
        "0.171590"
      ],
      [
        "73492.95",
        "0.264750"
      ],
      [
        "73493.57",
        "0.294060"
      ],
      [
        "73493.73",
        "0.535300"
      ],
      [
        "73493.82",
        "1.819120"
      ],
      [
        "73493.85",
        "0.686590"
      ],
      [
        "73494.34",
        "1.591380"
      ],
      [
        "73494.44",
        "4.051550"
      ],
      [
        "73495.04",
        "0.457730"
      ],
      [
        "73495.22",
        "0.599020"
      ],
      [
        "73495.39",
        "0.654170"
      ],
      [
        "73495.54",
        "3.776960"
      ],
      [
        "73495.72",
        "5.283810"
      ],
      [
        "73495.73",
        "2.792460"
      ],
      [
        "73495.84",
        "1.755780"
      ],
      [
        "73495.85",
        "0.334380"
      ],
      [
        "73495.90",
        "2.642330"
      ],
      [
        "73495.92",
        "2.612620"
      ],
      [
        "73496.01",
        "2.780720"
      ],
      [
        "73496.23",
        "1.151120"
      ],
      [
        "73496.26",
        "0.511750"
      ],
      [
        "73496.60",
        "4.275690"
      ],
      [
        "73496.74",
        "0.761270"
      ],
      [
        "73498.10",
        "0.479840"
      ],
      [
        "73498.17",
        "3.258030"
      ],
      [
        "73498.63",
        "0.682780"
      ],
      [
        "73499.34",
        "0.541210"
      ],
      [
        "73499.36",
        "5.239990"
      ],
      [
        "73500.88",
        "1.947260"
      ],
      [
        "73501.23",
        "0.213270"
      ],
      [
        "73501.57",
        "0.863590"
      ],
      [
        "73502.11",
        "0.682760"
      ],
      [
        "73504.25",
        "1.855790"
      ],
      [
        "73504.58",
        "0.619390"
      ],
      [
        "73507.11",
        "0.517520"
      ],
      [
        "73507.99",
        "3.837350"
      ],
      [
        "73508.09",
        "0.579820"
      ],
      [
        "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": 1779973462265
}</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-28T21:04:22.351946" elapsed="0.000876"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:22.354420" level="INFO">${data} = {'timestamp': 1779973459793, 'lastUpdateId': 1772262553975, 'bids': [['73467.16', '3.168320'], ['73467.15', '3.655320'], ['73467.14', '0.360290'], ['73467.11', '1.459080'], ['73467.10', '4.756990'], [...</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-28T21:04:22.352999" elapsed="0.001457"/>
</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-28T21:04:22.354604" elapsed="0.000337"/>
</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-28T21:04:22.355110" elapsed="0.000215"/>
</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-28T21:04:22.356538" elapsed="0.000253"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:22.357140" 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-28T21:04:22.356931" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.357456" 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-28T21:04:22.357300" elapsed="0.000205"/>
</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-28T21:04:22.357827" elapsed="0.000187"/>
</kw>
<msg time="2026-05-28T21:04:22.358111" 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-28T21:04:22.357646" elapsed="0.000493"/>
</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-28T21:04:22.358433" elapsed="0.000143"/>
</kw>
<msg time="2026-05-28T21:04:22.358665" 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-28T21:04:22.358283" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:22.359219" 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-28T21:04:22.358957" elapsed="0.000384">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-05-28T21:04:22.359442" 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-28T21:04:22.358821" elapsed="0.000647"/>
</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-28T21:04:22.359756" elapsed="0.000156"/>
</kw>
<msg time="2026-05-28T21:04:22.359997" 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-28T21:04:22.359605" elapsed="0.000415"/>
</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-28T21:04:22.360276" elapsed="0.000148"/>
</kw>
<msg time="2026-05-28T21:04:22.360510" 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-28T21:04:22.360143" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.360778" 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-28T21:04:22.360650" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.361051" 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-28T21:04:22.360927" elapsed="0.000168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.361320" 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-28T21:04:22.361199" elapsed="0.000167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.361596" 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-28T21:04:22.361468" elapsed="0.000171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.361887" 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-28T21:04:22.361754" elapsed="0.000178"/>
</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-28T21:04:22.363216" elapsed="0.000230"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.363663" level="INFO">Length is 200.</msg>
<msg time="2026-05-28T21:04:22.363732" level="INFO">${bids_length} = 200</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-28T21:04:22.363560" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.364007" level="INFO">买盘数据包含 200 个价位</msg>
<arg>买盘数据包含 ${bids_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.363900" elapsed="0.000145"/>
</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-28T21:04:22.365082" elapsed="0.000218"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.365496" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T21:04:22.365561" 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-28T21:04:22.365399" elapsed="0.000184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.365811" 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-28T21:04:22.365679" elapsed="0.000169"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.367030" level="INFO">买盘价格: 73467.16, 数量: 3.168320</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-28T21:04:22.366130" elapsed="0.000950"/>
</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-28T21:04:22.365941" elapsed="0.001194"/>
</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-28T21:04:22.367726" elapsed="0.000352"/>
</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-28T21:04:22.367409" elapsed="0.000735"/>
</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-28T21:04:22.368503" elapsed="0.000281"/>
</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-28T21:04:22.368279" elapsed="0.000564"/>
</kw>
<arg>${bids[0]}</arg>
<arg>买盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:22.364386" elapsed="0.004535"/>
</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-28T21:04:22.364142" elapsed="0.004837"/>
</kw>
<arg>${depth_dict['bids']}</arg>
<doc>验证买盘数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:22.362304" elapsed="0.006744"/>
</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-28T21:04:22.362047" elapsed="0.007050"/>
</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-28T21:04:22.370266" elapsed="0.000228"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.370752" level="INFO">Length is 214.</msg>
<msg time="2026-05-28T21:04:22.370841" 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-28T21:04:22.370623" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.371131" level="INFO">卖盘数据包含 214 个价位</msg>
<arg>卖盘数据包含 ${asks_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.370988" elapsed="0.000198"/>
</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-28T21:04:22.372207" elapsed="0.000225"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.372645" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T21:04:22.372715" 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-28T21:04:22.372534" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.372979" 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-28T21:04:22.372835" elapsed="0.000185"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.374127" level="INFO">卖盘价格: 73467.17, 数量: 3.239440</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-28T21:04:22.373307" 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-28T21:04:22.373124" elapsed="0.001087"/>
</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-28T21:04:22.374502" elapsed="0.000256"/>
</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-28T21:04:22.374322" elapsed="0.000484"/>
</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-28T21:04:22.375092" elapsed="0.000232"/>
</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-28T21:04:22.374914" elapsed="0.000459"/>
</kw>
<arg>${asks[0]}</arg>
<arg>卖盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:22.371562" elapsed="0.003910"/>
</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-28T21:04:22.371306" elapsed="0.004211"/>
</kw>
<arg>${depth_dict['asks']}</arg>
<doc>验证卖盘数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:22.369494" elapsed="0.006074"/>
</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-28T21:04:22.369230" elapsed="0.006375"/>
</kw>
<arg>${data}</arg>
<doc>验证深度数据字典的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:22.356073" elapsed="0.019590"/>
</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-28T21:04:22.355479" elapsed="0.020224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.376286" 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-28T21:04:22.375810" elapsed="0.000521"/>
</kw>
<doc>验证市场深度数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:21.629706" elapsed="0.746762"/>
</test>
<doc>市场深度数据接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:21.614282" elapsed="0.762497"/>
</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-28T21:04:22.381597" 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-28T21:04:22.381442" elapsed="0.000181"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.381956" 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-28T21:04:22.381855" elapsed="0.000139"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:22.381701" elapsed="0.000319"/>
</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-28T21:04:22.382121" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.382044" elapsed="0.000118"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:22.381677" elapsed="0.000501"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.382701" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.382600" elapsed="0.000135"/>
</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-28T21:04:22.382923" 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-28T21:04:22.383020" 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-28T21:04:22.383110" 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-28T21:04:22.383210" 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-28T21:04:22.383301" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.382784" elapsed="0.000555"/>
</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-28T21:04:22.383483" 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-28T21:04:22.383577" 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-28T21:04:22.383670" 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-28T21:04:22.383759" 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-28T21:04:22.383845" 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-28T21:04:22.383934" 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-28T21:04:22.384022" 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-28T21:04:22.384112" elapsed="0.000012"/>
</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-28T21:04:22.384198" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.383359" elapsed="0.000875"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.384501" 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-28T21:04:22.384323" elapsed="0.000210"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.384805" 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-28T21:04:22.384640" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.385090" 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-28T21:04:22.384923" elapsed="0.000199"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.385375" 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-28T21:04:22.385208" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.385662" 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-28T21:04:22.385491" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.385953" 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-28T21:04:22.385779" elapsed="0.000204"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.386247" 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-28T21:04:22.386069" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.386540" 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-28T21:04:22.386363" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.386842" 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-28T21:04:22.386657" elapsed="0.000215"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:22.384250" elapsed="0.002649"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:22.382771" elapsed="0.004145"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.387111" 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-28T21:04:22.386989" elapsed="0.000157"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:22.387470" 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-28T21:04:22.387237" elapsed="0.000392"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:22.382406" elapsed="0.005275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.387832" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.387762" elapsed="0.000103"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:22.381267" elapsed="0.006640"/>
</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-28T21:04:22.390010" 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-28T21:04:22.389521" elapsed="0.000511"/>
</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-28T21:04:22.390486" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.390118" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:22.390105" elapsed="0.000439"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:22.390570" elapsed="0.000031"/>
</return>
<msg time="2026-05-28T21:04:22.390723" 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-28T21:04:22.388963" elapsed="0.001779"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:22.666859" 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-28T21:04:22.667270" 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 13: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': '6276c1366fbbe56d1c16b03dc242b9b9', 'X-Transparent': '00-6276c1366fbbe56d1c16b03dc242b9b9-a73ef63777c3d078-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': 'a02d76fd4d14a0f1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1779973462654} 
 </msg>
<msg time="2026-05-28T21:04:22.667638" 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-28T21:04:22.668023" 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-28T21:04:22.392395" elapsed="0.275696"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:22.668326" elapsed="0.000136"/>
</return>
<msg time="2026-05-28T21:04:22.668848" 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-28T21:04:22.390843" elapsed="0.278063"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.671083" 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-28T21:04:22.670120" elapsed="0.001076"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.672211" 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-28T21:04:22.671403" elapsed="0.000847"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.672655" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.672433" elapsed="0.000290"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:22.669431" elapsed="0.003389"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.674476" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779973462654}</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-28T21:04:22.673594" elapsed="0.000924"/>
</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-28T21:04:22.674701" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.675327" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.675145" elapsed="0.000248"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:22.673104" elapsed="0.002379"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.676922" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779973462654}</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-28T21:04:22.676145" elapsed="0.000821"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.677826" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779973462654
}</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-28T21:04:22.677150" elapsed="0.000720"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.678263" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779973462654
}</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-28T21:04:22.678034" elapsed="0.000343"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:22.675722" elapsed="0.002727"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:22.679292" 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-28T21:04:22.678589" elapsed="0.000738"/>
</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-28T21:04:22.679477" elapsed="0.000326"/>
</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-28T21:04:22.680722" elapsed="0.000257"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.681274" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T21:04:22.681360" 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-28T21:04:22.681128" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.681672" level="INFO">盘口数据列表包含 0 个盘口</msg>
<arg>盘口数据列表包含 ${length} 个盘口</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.681531" elapsed="0.000198"/>
</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-28T21:04:22.681864" elapsed="0.000158"/>
</kw>
<arg>${data}</arg>
<doc>验证盘口数据列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:22.680382" elapsed="0.001703"/>
</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-28T21:04:22.679976" elapsed="0.002160"/>
</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-28T21:04:22.682303" elapsed="0.000185"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.683554" 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-28T21:04:22.683031" elapsed="0.000549"/>
</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-28T21:04:22.683878" elapsed="0.000509"/>
</kw>
<msg time="2026-05-28T21:04:22.684478" 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-28T21:04:22.683717" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.684799" 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-28T21:04:22.684646" elapsed="0.000179"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.685144" 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-28T21:04:22.684945" elapsed="0.000226"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.685466" 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-28T21:04:22.685300" elapsed="0.000191"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.685909" 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-28T21:04:22.685616" elapsed="0.000322"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.686490" 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-28T21:04:22.686057" elapsed="0.000455"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.686697" 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-28T21:04:22.686607" elapsed="0.000124"/>
</kw>
<arg>获取市场盘口数据</arg>
<arg>/v1/spot/market/public/plate</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:22.682706" elapsed="0.004071"/>
</kw>
<doc>验证市场盘口数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:22.387957" elapsed="0.298993"/>
</test>
<doc>市场盘口数据接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:22.377760" elapsed="0.309581"/>
</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-28T21:04:22.693030" 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-28T21:04:22.692808" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.693515" 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-28T21:04:22.693370" elapsed="0.000196"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:22.693155" elapsed="0.000450"/>
</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-28T21:04:22.693740" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.693634" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:22.693132" elapsed="0.000683"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.694462" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.694348" elapsed="0.000155"/>
</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-28T21:04:22.694708" 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-28T21:04:22.694823" 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-28T21:04:22.694925" 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-28T21:04:22.695029" 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-28T21:04:22.695135" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.694559" elapsed="0.000651"/>
</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-28T21:04:22.695378" 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-28T21:04:22.695487" 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-28T21:04:22.695596" 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-28T21:04:22.695698" 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-28T21:04:22.695801" 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-28T21:04:22.695902" 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-28T21:04:22.696003" 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-28T21:04:22.696104" 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-28T21:04:22.696209" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.695233" elapsed="0.001021"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.696678" 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-28T21:04:22.696361" elapsed="0.000356"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.697015" 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-28T21:04:22.696815" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.697352" 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-28T21:04:22.697157" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.697683" 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-28T21:04:22.697487" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.698006" 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-28T21:04:22.697818" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.698335" 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-28T21:04:22.698142" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.698687" 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-28T21:04:22.698477" elapsed="0.000247"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.699029" 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-28T21:04:22.698822" elapsed="0.000243"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.699366" 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-28T21:04:22.699163" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:22.696274" elapsed="0.003158"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:22.694545" elapsed="0.004906"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.699680" 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-28T21:04:22.699538" elapsed="0.000182"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:22.700083" 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-28T21:04:22.699821" elapsed="0.000414"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:22.694108" elapsed="0.006190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:22.700473" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:22.700392" elapsed="0.000120"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:22.692547" elapsed="0.008013"/>
</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-28T21:04:22.703146" 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-28T21:04:22.702552" elapsed="0.000618"/>
</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-28T21:04:22.703703" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:22.703286" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:22.703273" elapsed="0.000495"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:22.703798" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T21:04:22.703956" 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-28T21:04:22.701824" elapsed="0.002154"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:23.085628" 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-28T21:04:23.086063" 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 13: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': '192090ffef2458ca3e50e0f2a2ee44fe', 'X-Transparent': '00-192090ffef2458ca3e50e0f2a2ee44fe-6c0a8e465e533023-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': 'a02d76ff8ddf4bac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"time":1779973463017,"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-28T21:04:23.086485" 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-28T21:04:23.086835" 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-28T21:04:22.704647" elapsed="0.382244"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:23.087082" elapsed="0.000117"/>
</return>
<msg time="2026-05-28T21:04:23.087568" 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-28T21:04:22.704099" elapsed="0.383525"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.090425" 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-28T21:04:23.089150" elapsed="0.001426"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.091997" 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-28T21:04:23.090877" elapsed="0.001181"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.092642" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.092334" elapsed="0.000404"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:23.088228" elapsed="0.004638"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.096930" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779973463017, '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-28T21:04:23.093884" elapsed="0.003101"/>
</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-28T21:04:23.097193" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.097874" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.097676" elapsed="0.000265"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:23.093224" elapsed="0.004808"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.100664" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779973463017, '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-28T21:04:23.098728" elapsed="0.001988"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.103965" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779973463017,
    "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-28T21:04:23.100898" elapsed="0.003109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.104541" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779973463017,
    "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": 1779973463017
}</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-28T21:04:23.104174" elapsed="0.001082"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:23.098282" elapsed="0.007050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:23.106895" level="INFO">${data} = {'time': 1779973463017, '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-28T21:04:23.105473" elapsed="0.001459"/>
</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-28T21:04:23.107077" elapsed="0.000553"/>
</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-28T21:04:23.107794" elapsed="0.000202"/>
</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-28T21:04:23.108817" elapsed="0.000244"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:23.109344" 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-28T21:04:23.109178" elapsed="0.000190"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.109570" level="INFO">Length is 3.</msg>
<msg time="2026-05-28T21:04:23.109632" 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-28T21:04:23.109469" elapsed="0.000186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.109864" level="INFO">交易对字典包含 3 个字段</msg>
<arg>交易对字典包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.109753" elapsed="0.000149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.110585" level="INFO">交易对字典内容: {'time': 1779973463017, '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-28T21:04:23.109993" elapsed="0.000958"/>
</kw>
<arg>${data}</arg>
<doc>验证交易对字典的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:23.108484" elapsed="0.002527"/>
</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-28T21:04:23.108126" elapsed="0.002930"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.112098" 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-28T21:04:23.111598" elapsed="0.000528"/>
</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-28T21:04:23.112404" elapsed="0.000498"/>
</kw>
<msg time="2026-05-28T21:04:23.112989" 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-28T21:04:23.112253" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.113285" 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-28T21:04:23.113141" elapsed="0.000168"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.113919" 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-28T21:04:23.113515" elapsed="0.000446"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.114372" 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-28T21:04:23.114148" elapsed="0.000255"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.114850" 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-28T21:04:23.114540" elapsed="0.000343"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.115245" 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-28T21:04:23.115014" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.115546" 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-28T21:04:23.115403" elapsed="0.000192"/>
</kw>
<arg>获取市场交易对列表</arg>
<arg>/v1/spot/market/public/symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:23.111267" elapsed="0.004393"/>
</kw>
<doc>验证市场交易对接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:22.700616" elapsed="0.415205"/>
</test>
<doc>市场交易对接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:22.688370" elapsed="0.427836"/>
</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-28T21:04:23.121063" 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-28T21:04:23.120876" elapsed="0.000216"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.121671" 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-28T21:04:23.121544" elapsed="0.000172"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:23.121176" elapsed="0.000572"/>
</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-28T21:04:23.121863" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.121772" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.121153" elapsed="0.000773"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.122528" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.122407" 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-28T21:04:23.122774" 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-28T21:04:23.122886" 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-28T21:04:23.122993" 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-28T21:04:23.123096" 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-28T21:04:23.123198" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.122628" elapsed="0.000641"/>
</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-28T21:04:23.123436" 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-28T21:04:23.123543" 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-28T21:04:23.123649" 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-28T21:04:23.123749" 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-28T21:04:23.123850" 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-28T21:04:23.123950" 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-28T21:04:23.124048" 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-28T21:04:23.124147" elapsed="0.000014"/>
</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-28T21:04:23.124246" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.123292" elapsed="0.000997"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.124600" 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-28T21:04:23.124391" elapsed="0.000248"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.124927" 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-28T21:04:23.124737" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.125252" 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-28T21:04:23.125060" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.125584" 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-28T21:04:23.125386" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.125914" 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-28T21:04:23.125716" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.126208" 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-28T21:04:23.126038" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.126500" 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-28T21:04:23.126324" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.126788" 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-28T21:04:23.126615" elapsed="0.000205"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.127082" 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-28T21:04:23.126904" elapsed="0.000209"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:23.124309" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.122613" elapsed="0.004543"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.127349" 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-28T21:04:23.127229" elapsed="0.000155"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:23.127712" 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-28T21:04:23.127467" elapsed="0.000419"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:23.122175" elapsed="0.005763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.128090" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.128020" elapsed="0.000103"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:23.120648" elapsed="0.007517"/>
</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-28T21:04:23.130395" 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-28T21:04:23.129854" 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-28T21:04:23.130968" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.130541" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.130526" elapsed="0.000508"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:23.131062" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T21:04:23.131231" 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-28T21:04:23.129211" elapsed="0.002041"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:23.504482" 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-28T21:04:23.504891" 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 13: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': 'acece5f5191a2aa4e2492606937b8f9c', 'X-Transparent': '00-acece5f5191a2aa4e2492606937b8f9c-71218ca9c777edeb-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': 'a02d77027ab23dda-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"serverTime":1779973463492},"ts":1779973463492} 
 </msg>
<msg time="2026-05-28T21:04:23.505072" 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-28T21:04:23.505501" 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-28T21:04:23.131921" elapsed="0.373652"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:23.505834" elapsed="0.000183"/>
</return>
<msg time="2026-05-28T21:04:23.506443" 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-28T21:04:23.131369" elapsed="0.375127"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.509936" 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-28T21:04:23.508077" elapsed="0.002002"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.511434" 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-28T21:04:23.510356" elapsed="0.001131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.512030" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.511744" elapsed="0.000374"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:23.507148" elapsed="0.005084"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.514039" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1779973463492}, 'ts': 1779973463492}</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-28T21:04:23.513177" elapsed="0.000904"/>
</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-28T21:04:23.514268" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.514945" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.514748" elapsed="0.000265"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:23.512569" elapsed="0.002529"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.516600" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1779973463492}, 'ts': 1779973463492}</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-28T21:04:23.515787" elapsed="0.000853"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.517489" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1779973463492
  },
  "ts": 1779973463492
}</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-28T21:04:23.516821" elapsed="0.000701"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.517969" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1779973463492
  },
  "ts": 1779973463492
}</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-28T21:04:23.517751" elapsed="0.000322"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:23.515358" elapsed="0.002786"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:23.518926" level="INFO">${data} = {'serverTime': 1779973463492}</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-28T21:04:23.518287" elapsed="0.000670"/>
</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-28T21:04:23.519105" elapsed="0.000336"/>
</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-28T21:04:23.520045" elapsed="0.000236"/>
</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-28T21:04:23.520425" elapsed="0.000184"/>
</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-28T21:04:23.521439" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.521917" level="INFO">时间字典内容: {'serverTime': 1779973463492}</msg>
<arg>时间字典内容: ${time_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.521780" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:23.522506" 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-28T21:04:23.522249" elapsed="0.000394">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T21:04:23.522740" 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-28T21:04:23.522097" elapsed="0.000670"/>
</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-28T21:04:23.522900" elapsed="0.000129"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:23.523454" 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-28T21:04:23.523281" elapsed="0.000230">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-05-28T21:04:23.523605" 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-28T21:04:23.523146" elapsed="0.000484"/>
</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-28T21:04:23.523759" elapsed="0.000299"/>
</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-28T21:04:23.524306" elapsed="0.000137"/>
</kw>
<msg time="2026-05-28T21:04:23.524532" 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-28T21:04:23.524178" elapsed="0.000377"/>
</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-28T21:04:23.525575" elapsed="0.000166"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.526023" level="INFO">${timestamp_str} = 1779973463492</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T21:04:23.525854" elapsed="0.000193"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.526269" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T21:04:23.526331" 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-28T21:04:23.526163" elapsed="0.000188"/>
</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-28T21:04:23.526452" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.526915" level="INFO">服务器时间戳: 1779973463492</msg>
<arg>服务器时间戳: ${timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.526810" elapsed="0.000151"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="转换毫秒时间戳">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.527686" level="INFO">${seconds} = 1779973463</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-28T21:04:23.527518" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.527934" level="INFO">毫秒时间戳 1779973463492 对应秒级时间戳: 1779973463</msg>
<arg>毫秒时间戳 ${milliseconds} 对应秒级时间戳: ${seconds}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.527805" elapsed="0.000165"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.528298" level="INFO">${readable_time} = 2026-05-28 21: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-28T21:04:23.528061" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.528578" level="INFO">可读时间格式: 2026-05-28 21:04:23</msg>
<arg>可读时间格式: ${readable_time}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.528472" elapsed="0.000144"/>
</kw>
<arg>${timestamp}</arg>
<doc>转换毫秒级时间戳为可读格式</doc>
<status status="PASS" start="2026-05-28T21:04:23.527270" elapsed="0.001398"/>
</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-28T21:04:23.527061" elapsed="0.001652"/>
</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-28T21:04:23.528816" elapsed="0.000111"/>
</kw>
<arg>${time_dict['serverTime']}</arg>
<doc>验证时间戳的格式和有效性</doc>
<status status="PASS" start="2026-05-28T21:04:23.524915" elapsed="0.004069"/>
</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-28T21:04:23.524674" elapsed="0.004352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:23.529398" 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-28T21:04:23.529243" elapsed="0.000211">Dictionary does not contain key 'currentTime'.</status>
</kw>
<msg time="2026-05-28T21:04:23.529544" 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-28T21:04:23.529129" elapsed="0.000437"/>
</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-28T21:04:23.529663" elapsed="0.000086"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T21:04:23.529981" 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-28T21:04:23.529848" elapsed="0.000152"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.530165" level="INFO">Length is 1.</msg>
<msg time="2026-05-28T21:04:23.530218" 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-28T21:04:23.530085" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.530424" 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-28T21:04:23.530316" elapsed="0.000142"/>
</kw>
<arg>${time_data}</arg>
<doc>验证时间字典的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:23.521147" elapsed="0.009355"/>
</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-28T21:04:23.520750" elapsed="0.009790"/>
</kw>
<arg>${data}</arg>
<doc>验证时间数据的格式和有效性</doc>
<status status="PASS" start="2026-05-28T21:04:23.519666" elapsed="0.010918"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.531453" 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-28T21:04:23.531013" elapsed="0.000460"/>
</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-28T21:04:23.531686" elapsed="0.000455"/>
</kw>
<msg time="2026-05-28T21:04:23.532212" 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-28T21:04:23.531560" elapsed="0.000672"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.532453" 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-28T21:04:23.532335" elapsed="0.000139"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.532723" 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-28T21:04:23.532569" elapsed="0.000174"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.532968" 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-28T21:04:23.532835" elapsed="0.000152"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.533308" 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-28T21:04:23.533077" elapsed="0.000254"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.533587" 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-28T21:04:23.533421" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.533838" 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-28T21:04:23.533699" elapsed="0.000305"/>
</kw>
<arg>获取市场服务器时间</arg>
<arg>/v1/spot/market/public/time</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:23.530748" elapsed="0.003349"/>
</kw>
<doc>验证市场服务器时间接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:23.128217" elapsed="0.406067"/>
</test>
<doc>市场服务器时间接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:23.117283" elapsed="0.417335"/>
</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-28T21:04:23.540035" 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-28T21:04:23.539836" elapsed="0.000227"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.540462" 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-28T21:04:23.540335" elapsed="0.000171"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:23.540145" elapsed="0.000396"/>
</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-28T21:04:23.540655" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.540565" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.540123" elapsed="0.000600"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.541328" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.541206" elapsed="0.000162"/>
</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-28T21:04:23.541574" 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-28T21:04:23.541691" 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-28T21:04:23.541797" 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-28T21:04:23.541905" 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-28T21:04:23.542009" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.541429" elapsed="0.000628"/>
</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-28T21:04:23.542223" 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-28T21:04:23.542330" 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-28T21:04:23.542434" 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-28T21:04:23.542537" 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-28T21:04:23.542637" 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-28T21:04:23.542739" 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-28T21:04:23.542846" 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-28T21:04:23.542946" elapsed="0.000014"/>
</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-28T21:04:23.543046" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.542078" elapsed="0.001010"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.543429" 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-28T21:04:23.543195" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.543763" 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-28T21:04:23.543567" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.544095" 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-28T21:04:23.543904" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.544430" 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-28T21:04:23.544231" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.544756" 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-28T21:04:23.544562" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.545125" 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-28T21:04:23.544922" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.545484" 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-28T21:04:23.545263" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.545834" 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-28T21:04:23.545617" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.546186" 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-28T21:04:23.545972" elapsed="0.000250"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:23.543109" elapsed="0.003146"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.541413" elapsed="0.004862"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.546516" 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-28T21:04:23.546366" elapsed="0.000192"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:23.546929" 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-28T21:04:23.546656" elapsed="0.000426"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:23.540973" elapsed="0.006167"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.547294" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.547225" elapsed="0.000104"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:23.539608" elapsed="0.007764"/>
</kw>
<test id="s1-s4-s2-s6-t1" name="获取热门市场排行榜" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.548722" 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-28T21:04:23.548436" elapsed="0.000308"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.550074" 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-28T21:04:23.549547" 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-28T21:04:23.550624" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.550197" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.550182" elapsed="0.000505"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:23.550714" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T21:04:23.550875" 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-28T21:04:23.548903" elapsed="0.001994"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:23.807595" 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-28T21:04:23.807969" 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 13: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': '24e714edc0dd799e15a47d3ad373c39b', 'X-Transparent': '00-24e714edc0dd799e15a47d3ad373c39b-84369647067c8a01-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': 'a02d77046bb71c41-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1779973463796} 
 </msg>
<msg time="2026-05-28T21:04:23.808142" 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-28T21:04:23.808549" 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-28T21:04:23.551339" elapsed="0.257269"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:23.808802" elapsed="0.000122"/>
</return>
<msg time="2026-05-28T21:04:23.809272" 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-28T21:04:23.551006" elapsed="0.258320"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.811948" 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-28T21:04:23.810740" elapsed="0.001374"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.813469" 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-28T21:04:23.812404" elapsed="0.001119"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.814056" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.813778" elapsed="0.000371"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:23.809885" elapsed="0.004388"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.816236" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779973463796}</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-28T21:04:23.815273" elapsed="0.001007"/>
</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-28T21:04:23.816461" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.817105" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.816917" elapsed="0.000258"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:23.814633" elapsed="0.002627"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.818722" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779973463796}</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-28T21:04:23.817915" elapsed="0.000851"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.819680" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779973463796
}</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-28T21:04:23.818962" elapsed="0.000761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.820160" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779973463796
}</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-28T21:04:23.819898" elapsed="0.000387"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:23.817498" elapsed="0.002873"/>
</kw>
<doc>验证热门市场排行榜接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:23.547425" elapsed="0.273171"/>
</test>
<doc>热门市场排行榜接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:23.535737" elapsed="0.285368"/>
</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-28T21:04:23.828270" 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-28T21:04:23.828042" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.828802" 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-28T21:04:23.828661" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:23.828424" elapsed="0.000467"/>
</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-28T21:04:23.829033" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.828921" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.828394" elapsed="0.000730"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.829816" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.829691" elapsed="0.000167"/>
</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-28T21:04:23.830075" 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-28T21:04:23.830185" 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-28T21:04:23.830295" 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-28T21:04:23.830403" 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-28T21:04:23.830563" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.829917" elapsed="0.000693"/>
</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-28T21:04:23.830771" 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-28T21:04:23.830877" 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-28T21:04:23.830980" 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-28T21:04:23.831087" 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-28T21:04:23.831189" 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-28T21:04:23.831298" 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-28T21:04:23.831417" 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-28T21:04:23.831518" 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-28T21:04:23.831614" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.830632" elapsed="0.001026"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.832009" 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-28T21:04:23.831759" elapsed="0.000288"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.832340" 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-28T21:04:23.832138" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.832686" 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-28T21:04:23.832474" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.833019" 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-28T21:04:23.832819" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.833347" 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-28T21:04:23.833156" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.833640" 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-28T21:04:23.833463" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.833970" 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-28T21:04:23.833765" elapsed="0.000241"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.834278" 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-28T21:04:23.834095" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.834580" 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-28T21:04:23.834395" elapsed="0.000215"/>
</kw>
<status status="PASS" start="2026-05-28T21:04:23.831679" elapsed="0.002958"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.829901" elapsed="0.004756"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.834876" 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-28T21:04:23.834749" elapsed="0.000167"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:23.835314" 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-28T21:04:23.835009" elapsed="0.000657"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T21:04:23.829446" elapsed="0.006281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.835888" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:23.835818" elapsed="0.000103"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T21:04:23.827765" elapsed="0.008197"/>
</kw>
<test id="s1-s4-s2-s7-t1" name="获取最近交易记录" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.837317" 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-28T21:04:23.837121" elapsed="0.000219"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T21:04:23.839316" 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-28T21:04:23.838533" elapsed="0.000819"/>
</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-28T21:04:23.840105" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T21:04:23.839508" elapsed="0.000663"/>
</branch>
<status status="PASS" start="2026-05-28T21:04:23.839485" elapsed="0.000712"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T21:04:23.840234" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T21:04:23.840458" 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-28T21:04:23.837553" elapsed="0.002935"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T21:04:24.167695" 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-28T21:04:24.168118" 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 13: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': '1ea9905a03d360cd6d3fbf59dceb4cf2', 'X-Transparent': '00-1ea9905a03d360cd6d3fbf59dceb4cf2-96715026ffccc05c-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': 'a02d77069926e2ea-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[{"i":630284194754379072,"t":1779973462283,"p":"73467.16","q":"0.009410","v":"691.3259756","b":false},{"i":630284190966922560,"t":1779973461280,"p":"73467.16","q":"0.007240","v":"531.9022384","b":false},{"i":630284187926052160,"t":1779973460570,"p":"73467.16","q":"0.007380","v":"542.1876408","b":false},{"i":630284185736625472,"t":1779973460136,"p":"73467.16","q":"0.011510","v":"845.6070116","b":false},{"i":630284183551393088,"t":1779973459591,"p":"73461.99","q":"0.008970","v":"658.9540503","b":true},{"i":630284180170784064,"t":1779973458800,"p":"73459.79","q":"0.009540","v":"700.8063966","b":false},{"i":630284178698583360,"t":1779973458451,"p":"73459.80","q":"0.008520","v":"625.877496","b":true},{"i":630284175758376256,"t":1779973457752,"p":"73459.79","q":"0.011800","v":"866.825522","b":false},{"i":630284172356795712,"t":1779973456948,"p":"73459.79","q":"0.007850","v":"576.6593515","b":false},{"i":630284169584360768,"t":1779973456283,"p":"73459.79","q":"0.008000","v":"587.67832","b":false},{"i":630284165968870720,"t":1779973455414,"p":"73459.79","q":"0.007520","v":"552.4176208","b":false},{"i":630284163439705408,"t":1779973454863,"p":"73459.80","q":"0.012090","v":"888.128982","b":true},{"i":630284161992670528,"t":1779973454488,"p":"73459.80","q":"0.009590","v":"704.479482","b":true},{"i":630284159006326080,"t":1779973453671,"p":"73459.79","q":"0.007870","v":"578.1285473","b":false},{"i":630284157454433600,"t":1779973453381,"p":"73459.80","q":"0.012560","v":"922.655088","b":true},{"i":630284155378253120,"t":1779973452907,"p":"73456.64","q":"0.009530","v":"700.0417792","b":true},{"i":630284153138494784,"t":1779973452367,"p":"73456.63","q":"0.007860","v":"577.3691118","b":false},{"i":630284150059875648,"t":1779973451627,"p":"73456.64","q":"0.009710","v":"713.2639744","b":true},{"i":630284147568459072,"t":1779973451036,"p":"73456.64","q":"0.010780","v":"791.8625792","b":true},{"i":630284144837967168,"t":1779973450283,"p":"73456.63","q":"0.011090","v":"814.6340267","b":false},{"i":630284141985840448,"t":1779973449705,"p":"73456.63","q":"0.007560","v":"555.3321228","b":false},{"i":630284139414732096,"t":1779973449084,"p":"73456.64","q":"0.010970","v":"805.8193408","b":true},{"i":630284137833479488,"t":1779973448716,"p":"73456.63","q":"0.011140","v":"818.3068582","b":false},{"i":630284136315141440,"t":1779973448355,"p":"73456.63","q":"0.010680","v":"784.5168084","b":false},{"i":630284134041828672,"t":1779973447808,"p":"73456.64","q":"0.008950","v":"657.436928","b":true},{"i":630284132645125440,"t":1779973447477,"p":"73456.63","q":"0.008360","v":"614.0974268","b":false},{"i":630284131089038656,"t":1779973447100,"p":"73456.63","q":"0.007900","v":"580.307377","b":false},{"i":630284128186580288,"t":1779973446414,"p":"73456.63","q":"0.011470","v":"842.5475461","b":false},{"i":630284124403318080,"t":1779973445513,"p":"73456.63","q":"0.010360","v":"761.0106868","b":false},{"i":630284121546997056,"t":1779973444853,"p":"73456.64","q":"0.008640","v":"634.6653696","b":true}],"ts":1779973464155} 
 </msg>
<msg time="2026-05-28T21:04:24.168374" 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-28T21:04:24.168840" 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-28T21:04:23.841164" elapsed="0.327747"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T21:04:24.169238" elapsed="0.000180"/>
</return>
<msg time="2026-05-28T21:04:24.169844" 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-28T21:04:23.840666" elapsed="0.329236"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.172697" 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-28T21:04:24.171448" elapsed="0.001398"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.174180" 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-28T21:04:24.173125" elapsed="0.001109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.174760" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:24.174487" elapsed="0.000369"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T21:04:24.170550" elapsed="0.004432"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.177335" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 630284194754379072, 't': 1779973462283, 'p': '73467.16', 'q': '0.009410', 'v': '691.3259756', 'b': False}, {'i': 630284190966922560, 't': 17...</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-28T21:04:24.175977" elapsed="0.001420"/>
</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-28T21:04:24.177645" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.178538" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:24.178273" elapsed="0.000359"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T21:04:24.175309" elapsed="0.003438"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.180628" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 630284194754379072, 't': 1779973462283, 'p': '73467.16', 'q': '0.009410', 'v': '691.3259756', 'b': False}, {'i': 630284190966922560, 't': 17...</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-28T21:04:24.179664" elapsed="0.001001"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.184850" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 630284194754379072,
      "t": 1779973462283,
      "p": "73467.16",
      "q": "0.009410",
      "v": "691.3259756",
 ...</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-28T21:04:24.180809" elapsed="0.004079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.185259" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 630284194754379072,
      "t": 1779973462283,
      "p": "73467.16",
      "q": "0.009410",
      "v": "691.3259756",
      "b": false
    },
    {
      "i": 630284190966922560,
      "t": 1779973461280,
      "p": "73467.16",
      "q": "0.007240",
      "v": "531.9022384",
      "b": false
    },
    {
      "i": 630284187926052160,
      "t": 1779973460570,
      "p": "73467.16",
      "q": "0.007380",
      "v": "542.1876408",
      "b": false
    },
    {
      "i": 630284185736625472,
      "t": 1779973460136,
      "p": "73467.16",
      "q": "0.011510",
      "v": "845.6070116",
      "b": false
    },
    {
      "i": 630284183551393088,
      "t": 1779973459591,
      "p": "73461.99",
      "q": "0.008970",
      "v": "658.9540503",
      "b": true
    },
    {
      "i": 630284180170784064,
      "t": 1779973458800,
      "p": "73459.79",
      "q": "0.009540",
      "v": "700.8063966",
      "b": false
    },
    {
      "i": 630284178698583360,
      "t": 1779973458451,
      "p": "73459.80",
      "q": "0.008520",
      "v": "625.877496",
      "b": true
    },
    {
      "i": 630284175758376256,
      "t": 1779973457752,
      "p": "73459.79",
      "q": "0.011800",
      "v": "866.825522",
      "b": false
    },
    {
      "i": 630284172356795712,
      "t": 1779973456948,
      "p": "73459.79",
      "q": "0.007850",
      "v": "576.6593515",
      "b": false
    },
    {
      "i": 630284169584360768,
      "t": 1779973456283,
      "p": "73459.79",
      "q": "0.008000",
      "v": "587.67832",
      "b": false
    },
    {
      "i": 630284165968870720,
      "t": 1779973455414,
      "p": "73459.79",
      "q": "0.007520",
      "v": "552.4176208",
      "b": false
    },
    {
      "i": 630284163439705408,
      "t": 1779973454863,
      "p": "73459.80",
      "q": "0.012090",
      "v": "888.128982",
      "b": true
    },
    {
      "i": 630284161992670528,
      "t": 1779973454488,
      "p": "73459.80",
      "q": "0.009590",
      "v": "704.479482",
      "b": true
    },
    {
      "i": 630284159006326080,
      "t": 1779973453671,
      "p": "73459.79",
      "q": "0.007870",
      "v": "578.1285473",
      "b": false
    },
    {
      "i": 630284157454433600,
      "t": 1779973453381,
      "p": "73459.80",
      "q": "0.012560",
      "v": "922.655088",
      "b": true
    },
    {
      "i": 630284155378253120,
      "t": 1779973452907,
      "p": "73456.64",
      "q": "0.009530",
      "v": "700.0417792",
      "b": true
    },
    {
      "i": 630284153138494784,
      "t": 1779973452367,
      "p": "73456.63",
      "q": "0.007860",
      "v": "577.3691118",
      "b": false
    },
    {
      "i": 630284150059875648,
      "t": 1779973451627,
      "p": "73456.64",
      "q": "0.009710",
      "v": "713.2639744",
      "b": true
    },
    {
      "i": 630284147568459072,
      "t": 1779973451036,
      "p": "73456.64",
      "q": "0.010780",
      "v": "791.8625792",
      "b": true
    },
    {
      "i": 630284144837967168,
      "t": 1779973450283,
      "p": "73456.63",
      "q": "0.011090",
      "v": "814.6340267",
      "b": false
    },
    {
      "i": 630284141985840448,
      "t": 1779973449705,
      "p": "73456.63",
      "q": "0.007560",
      "v": "555.3321228",
      "b": false
    },
    {
      "i": 630284139414732096,
      "t": 1779973449084,
      "p": "73456.64",
      "q": "0.010970",
      "v": "805.8193408",
      "b": true
    },
    {
      "i": 630284137833479488,
      "t": 1779973448716,
      "p": "73456.63",
      "q": "0.011140",
      "v": "818.3068582",
      "b": false
    },
    {
      "i": 630284136315141440,
      "t": 1779973448355,
      "p": "73456.63",
      "q": "0.010680",
      "v": "784.5168084",
      "b": false
    },
    {
      "i": 630284134041828672,
      "t": 1779973447808,
      "p": "73456.64",
      "q": "0.008950",
      "v": "657.436928",
      "b": true
    },
    {
      "i": 630284132645125440,
      "t": 1779973447477,
      "p": "73456.63",
      "q": "0.008360",
      "v": "614.0974268",
      "b": false
    },
    {
      "i": 630284131089038656,
      "t": 1779973447100,
      "p": "73456.63",
      "q": "0.007900",
      "v": "580.307377",
      "b": false
    },
    {
      "i": 630284128186580288,
      "t": 1779973446414,
      "p": "73456.63",
      "q": "0.011470",
      "v": "842.5475461",
      "b": false
    },
    {
      "i": 630284124403318080,
      "t": 1779973445513,
      "p": "73456.63",
      "q": "0.010360",
      "v": "761.0106868",
      "b": false
    },
    {
      "i": 630284121546997056,
      "t": 1779973444853,
      "p": "73456.64",
      "q": "0.008640",
      "v": "634.6653696",
      "b": true
    }
  ],
  "ts": 1779973464155
}</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-28T21:04:24.185032" elapsed="0.000421"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T21:04:24.179079" elapsed="0.006439"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T21:04:24.186336" level="INFO">${data} = [{'i': 630284194754379072, 't': 1779973462283, 'p': '73467.16', 'q': '0.009410', 'v': '691.3259756', 'b': False}, {'i': 630284190966922560, 't': 1779973461280, 'p': '73467.16', 'q': '0.007240', 'v': '...</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-28T21:04:24.185642" elapsed="0.000723"/>
</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-28T21:04:24.186493" elapsed="0.000282"/>
</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-28T21:04:24.187581" elapsed="0.000218"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.188044" level="INFO">Length is 30.</msg>
<msg time="2026-05-28T21:04:24.188123" 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-28T21:04:24.187922" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.188383" level="INFO">交易记录列表包含 30 个交易记录</msg>
<arg>交易记录列表包含 ${list_length} 个交易记录</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:24.188254" elapsed="0.000174"/>
</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-28T21:04:24.189578" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.189979" level="INFO">交易记录项内容: {'i': 630284194754379072, 't': 1779973462283, 'p': '73467.16', 'q': '0.009410', 'v': '691.3259756', 'b': False}</msg>
<arg>交易记录项内容: ${trade_item}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T21:04:24.189868" elapsed="0.000150"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.190490" 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-28T21:04:24.190255" elapsed="0.000341">Dictionary does not contain key 'id'.</status>
</kw>
<msg time="2026-05-28T21:04:24.190723" 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-28T21:04:24.190124" elapsed="0.000621"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.191139" 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-28T21:04:24.190984" elapsed="0.000207">Dictionary does not contain key 'price'.</status>
</kw>
<msg time="2026-05-28T21:04:24.191270" 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-28T21:04:24.190859" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.191670" 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-28T21:04:24.191523" elapsed="0.000194">Dictionary does not contain key 'qty'.</status>
</kw>
<msg time="2026-05-28T21:04:24.191798" 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-28T21:04:24.191400" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.192321" 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-28T21:04:24.192048" elapsed="0.000322">Dictionary does not contain key 'quoteQty'.</status>
</kw>
<msg time="2026-05-28T21:04:24.192447" 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-28T21:04:24.191927" elapsed="0.000542"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.192824" 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-28T21:04:24.192686" elapsed="0.000187">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-05-28T21:04:24.192949" 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-28T21:04:24.192574" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.193340" 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-28T21:04:24.193196" elapsed="0.000185">Dictionary does not contain key 'isBuyerMaker'.</status>
</kw>
<msg time="2026-05-28T21:04:24.193453" 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-28T21:04:24.193081" elapsed="0.000390"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.193794" 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-28T21:04:24.193671" elapsed="0.000166">Dictionary does not contain key 'side'.</status>
</kw>
<msg time="2026-05-28T21:04:24.193903" 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-28T21:04:24.193567" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T21:04:24.194249" 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-28T21:04:24.194128" elapsed="0.000162">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-05-28T21:04:24.194355" 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-28T21:04:24.194016" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.194566" 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-28T21:04:24.194470" elapsed="0.000130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.194773" 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-28T21:04:24.194681" elapsed="0.000126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.194975" 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-28T21:04:24.194887" elapsed="0.000119"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.195189" 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-28T21:04:24.195096" elapsed="0.000125"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.195387" 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-28T21:04:24.195300" elapsed="0.000134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.195607" 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-28T21:04:24.195513" elapsed="0.000126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.195835" 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-28T21:04:24.195745" elapsed="0.000131"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.196043" 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-28T21:04:24.195955" elapsed="0.000120"/>
</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-28T21:04:24.196160" elapsed="0.000094"/>
</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-28T21:04:24.196362" elapsed="0.000080"/>
</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-28T21:04:24.196532" elapsed="0.000084"/>
</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-28T21:04:24.196705" elapsed="0.000077"/>
</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-28T21:04:24.196869" elapsed="0.000080"/>
</kw>
<arg>${trade_list[0]}</arg>
<doc>验证单个交易记录的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:24.188920" elapsed="0.008080"/>
</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-28T21:04:24.188542" elapsed="0.008496"/>
</kw>
<arg>${data}</arg>
<doc>验证交易记录列表的数据结构</doc>
<status status="PASS" start="2026-05-28T21:04:24.187281" elapsed="0.009803"/>
</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-28T21:04:24.186919" elapsed="0.010211"/>
</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-28T21:04:24.197224" elapsed="0.000306"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.198891" 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-28T21:04:24.198286" elapsed="0.000639"/>
</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-28T21:04:24.199232" elapsed="0.000555"/>
</kw>
<msg time="2026-05-28T21:04:24.199888" 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-28T21:04:24.199060" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.200217" 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-28T21:04:24.200051" elapsed="0.000193"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.200611" 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-28T21:04:24.200372" elapsed="0.000267"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.200959" 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-28T21:04:24.200773" elapsed="0.000215"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.201417" 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-28T21:04:24.201110" elapsed="0.000341"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.201818" 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-28T21:04:24.201588" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T21:04:24.202115" 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-28T21:04:24.201993" elapsed="0.000161"/>
</kw>
<arg>获取最近交易记录</arg>
<arg>/v1/spot/market/public/trade/recent</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T21:04:24.197844" elapsed="0.004369"/>
</kw>
<doc>验证最近交易记录接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T21:04:23.836035" elapsed="0.366316"/>
</test>
<doc>最近交易记录接口测试</doc>
<status status="PASS" start="2026-05-28T21:04:23.822614" elapsed="0.380064"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:21.321049" elapsed="2.882735"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:20.416828" elapsed="3.787681"/>
</suite>
<status status="PASS" start="2026-05-28T21:04:08.106379" elapsed="16.099078"/>
</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>
